iOS10推送必看UNNotificationAttachment以及UNTimeIntervalNotificationTrigger

雖然這篇文章比較長,也不好理解,但是還是建議大家收藏铐维,以后用到的時候眯搭,可以看看,有耐心的還是讀一讀贯城。

這篇文章開始,我會跟大家好好講講,蘋果新發(fā)布的iOS10的所有通知類衣形。

一、創(chuàng)建本地通知事例詳解:

注意啊姿鸿,小伙伴們谆吴,本地通知也必須在appdelegate中注冊中心,通知的開關(guān)打不打開無所謂的苛预,畢竟是本地通知句狼,但是通知的接收的代理,以及通知點擊的代理热某,蘋果給合二為一了腻菇。所以大家還是需要在appdelegate中寫上這2個方法,還有不要忘記在- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions注冊通知中心昔馋。如果使用極光推送的小伙伴筹吐,寫看一下我的基礎(chǔ)篇,辛苦大家啦

創(chuàng)建一個UNNotificationRequest類的實例秘遏,一定要為它設(shè)置identifier, 在后面的查找丘薛,更新, 刪除通知邦危,這個標(biāo)識是可以用來區(qū)分這個通知與其他通知
把request加到UNUserNotificationCenter榔袋, 并設(shè)置觸發(fā)器周拐,等待觸發(fā)
如果另一個request具有和之前request相同的標(biāo)識,不同的內(nèi)容凰兑, 可以達到更新通知的目的

創(chuàng)建一個本地通知我們應(yīng)該先創(chuàng)建一個UNNotificationRequest類妥粟,并且將這個類添加到UNUserNotificationCenter才可以。代碼如下:

// 1.創(chuàng)建一個UNNotificationRequest
    NSString *requestIdentifer = @"TestRequest";
    UNNotificationRequest *request = [UNNotificationRequest requestWithIdentifier:requestIdentifer content:content trigger:trigger];
    
// 2.將UNNotificationRequest類吏够,添加進當(dāng)前通知中心中
[[UNUserNotificationCenter currentNotificationCenter] addNotificationRequest:request withCompletionHandler:^(NSError * _Nullable error) {

    }];

在創(chuàng)建UNNotificationRequest類時勾给,官方的解釋是說,一個通知請求可以在預(yù)定通過時間和位置锅知,來通知用戶播急。觸發(fā)的方式見UNNotificationTrigger的相關(guān)說明。調(diào)用該方法售睹,在通知觸發(fā)的時候桩警。會取代具有相同標(biāo)識符的通知請求,此外昌妹,消息個數(shù)受系統(tǒng)限制捶枢。

上面的翻譯,看上去可能有些拗口飞崖,簡單來說烂叔,就是我們需要為UNNotificationRequest設(shè)置一個標(biāo)識符,通過標(biāo)識符固歪,我們可以對該通知進行添加蒜鸡,刪除,更新等操作牢裳。

以下是完整的創(chuàng)建通知的代碼:

    // 1.創(chuàng)建通知內(nèi)容
    UNMutableNotificationContent *content = [[UNMutableNotificationContent alloc] init];
    content.title = @"徐不同測試通知";
    content.subtitle = @"測試通知";
    content.body = @"來自徐不同的簡書";
    content.badge = @1;
    NSError *error = nil;
    NSString *path = [[NSBundle mainBundle] pathForResource:@"icon_certification_status1@2x" ofType:@"png"];
    // 2.設(shè)置通知附件內(nèi)容
    UNNotificationAttachment *att = [UNNotificationAttachment attachmentWithIdentifier:@"att1" URL:[NSURL fileURLWithPath:path] options:nil error:&error];
    if (error) {
        NSLog(@"attachment error %@", error);
    }
    content.attachments = @[att];
    content.launchImageName = @"icon_certification_status1@2x";
    // 2.設(shè)置聲音
    UNNotificationSound *sound = [UNNotificationSound defaultSound];
    content.sound = sound;

    // 3.觸發(fā)模式
    UNTimeIntervalNotificationTrigger *trigger = [UNTimeIntervalNotificationTrigger triggerWithTimeInterval:5 repeats:NO];

    // 4.設(shè)置UNNotificationRequest
    NSString *requestIdentifer = @"TestRequest";
    UNNotificationRequest *request = [UNNotificationRequest requestWithIdentifier:requestIdentifer content:content trigger:trigger1];
    
    //5.把通知加到UNUserNotificationCenter, 到指定觸發(fā)點會被觸發(fā)
    [[UNUserNotificationCenter currentNotificationCenter] addNotificationRequest:request withCompletionHandler:^(NSError * _Nullable error) {
    }];

通過以上代碼逢防,我們就可以創(chuàng)建一個5秒觸發(fā)本地通知,具體樣式可以看下圖


QQ20160919-0@2x.png-173.2kB
QQ20160919-0@2x.png-173.2kB

下拉放大content.launchImageName = @"icon_certification_status1@2x";顯示的圖片是這行代碼的效果蒲讯,如圖

IMG_0123.PNG

根據(jù)上面內(nèi)容忘朝,大家會發(fā)現(xiàn)在創(chuàng)建UNNotificationRequest的時候,會需要UNMutableNotificationContent以及UNTimeIntervalNotificationTrigger這兩個類伶椿。下面我就對相關(guān)的類辜伟,以及類擴展,做相應(yīng)的說明脊另。

1.UNNotificationContent以及UNMutableNotificationContent(通知內(nèi)容和可變通知內(nèi)容)

通知內(nèi)容分為可變的以及不可變的兩種類型导狡,類似于可變數(shù)組跟不可變數(shù)組。后續(xù)我們通過某一特定標(biāo)識符更新通知偎痛,便是用可變通知了旱捧。
不管是可變通知還是不可變通知,都有以下的幾個屬性:

// 1.附件數(shù)組,存放UNNotificationAttachment類
@property (NS_NONATOMIC_IOSONLY, copy) NSArray <UNNotificationAttachment *> *attachments ;

// 2.應(yīng)用程序角標(biāo)枚赡,0或者不傳氓癌,意味著角標(biāo)消失
@property (NS_NONATOMIC_IOSONLY, copy, nullable) NSNumber *badge;

// 3.主體內(nèi)容
@property (NS_NONATOMIC_IOSONLY, copy) NSString *body ;

// 4.app通知下拉預(yù)覽時候展示的圖
@property (NS_NONATOMIC_IOSONLY, copy) NSString *launchImageName;

// 5.UNNotificationSound類,可以設(shè)置默認(rèn)聲音贫橙,或者指定名稱的聲音
@property (NS_NONATOMIC_IOSONLY, copy, nullable) UNNotificationSound *sound ;

// 6.推送內(nèi)容的子標(biāo)題
@property (NS_NONATOMIC_IOSONLY, copy) NSString *subtitle ;

// 7.通知線程的標(biāo)識
@property (NS_NONATOMIC_IOSONLY, copy) NSString *threadIdentifier;

// 8.推送內(nèi)容的標(biāo)題
@property (NS_NONATOMIC_IOSONLY, copy) NSString *title ;

// 9.遠程通知推送內(nèi)容
@property (NS_NONATOMIC_IOSONLY, copy) NSDictionary *userInfo;

// 10.category標(biāo)識
@property (NS_NONATOMIC_IOSONLY, copy) NSString *categoryIdentifier;

以上的的屬性贪婉,我都增加了相應(yīng)的說明,大家可以對照我的注釋來使用卢肃。

2.UNNotificationAttachment (附件內(nèi)容通知)

在UNNotificationContent類中疲迂,有個附件數(shù)組的屬性,這就是包含UNNotificationAttachment類的數(shù)組了莫湘。

@property (NS_NONATOMIC_IOSONLY, copy) NSArray <UNNotificationAttachment *> *attachments ;

蘋果的解釋說尤蒿,UNNotificationAttachment(附件通知)是指可以包含音頻,圖像或視頻內(nèi)容幅垮,并且可以將其內(nèi)容顯示出來的通知腰池。使用本地通知時,可以在通知創(chuàng)建時忙芒,將附件加入即可示弓。對于遠程通知,則必須實現(xiàn)使用UNNotificationServiceExtension類通知服務(wù)擴展匕争。

創(chuàng)建附件的方法是attachmentWithIdentifier:URL:options:error:避乏。在使用時爷耀,必須指定使用文件附件的內(nèi)容甘桑,并且文件格式必須是支持的類型之一。創(chuàng)建附件后歹叮,將其分配給內(nèi)容對象的附件屬性跑杭。 (對于遠程通知,您必須從您的服務(wù)擴展做到這一點咆耿。)
附件通知支持的類型如下圖:

QQ20160918-3.png-45.5kB
QQ20160918-3.png-45.5kB

下面是創(chuàng)建UNNotificationAttachment的方法:

+ (nullable instancetype)attachmentWithIdentifier:(NSString *)identifier URL:(NSURL *)URL options:(nullable NSDictionary *)options error:(NSError *__nullable *__nullable)error;

注意:URL必須是一個有效的文件路徑德谅,不然會報錯

這里我再在說下options的屬性,一共有4種選項(這幾個屬性可研究死我了)

  • 1UNNotificationAttachmentOptionsTypeHintKey此鍵的值是一個包含描述文件的類型統(tǒng)一類型標(biāo)識符(UTI)一個NSString。如果不提供該鍵萨螺,附件的文件擴展名來確定其類型窄做,常用的類型標(biāo)識符有
    kUTTypeImage,kUTTypeJPEG2000,kUTTypeTIFF,kUTTypePICT,kUTTypeGIF ,kUTTypePNG,kUTTypeQuickTimeImage等∥考迹看到這里你一定有疑問椭盏,這些類型導(dǎo)入報錯了啊N巧獭掏颊!我研究了蘋果文檔,發(fā)現(xiàn)大家需要添加以下框架才可以,具體大家可以通過以下類型來處理。

注意:
框架就是#import<MobileCoreServices/MobileCoreServices.h>

使用方法如下:

dict[UNNotificationAttachmentOptionsTypeHintKey] = (__bridge id _Nullable)(kUTTypeImage);
  • 2UNNotificationAttachmentOptionsThumbnailHiddenKey,是一個BOOL值乌叶,為YES時候盆偿,縮略圖將隱藏,默認(rèn)為YES准浴。如圖:


    IMG_0124.PNG-67.2kB
    IMG_0124.PNG-67.2kB

    大家可以對照上面的圖來看事扭,就明白是哪里的圖消失了。

使用方法如下:

    dict[UNNotificationAttachmentOptionsThumbnailHiddenKey] =  @YES;
  • 3UNNotificationAttachmentOptionsThumbnailClippingRectKey剪貼矩形的縮略圖乐横。這個密鑰的值是包含一個歸一化的CGRect - 也就是說句旱,一個單元的矩形,其值是在以1.0? 0.0 晰奖,表示要顯示的原始圖像的所述部分的字典谈撒。例如,指定的(0.25 匾南, 0.25)的原點和大锌心洹(0.5 ,0.5 )定義了剪輯矩形蛆楞,只顯示圖像的中心部分溯乒。使用CGRectCreateDictionaryRepresentation函數(shù)來創(chuàng)建字典的矩形。

上面這句話是蘋果的翻譯豹爹,太繞口了裆悄。我簡單說,就是我下面這幅圖臂聋。
QQ20160919.png-728.4kB
QQ20160919.png-728.4kB

整張圖被分割了光稼,整體比例為1,如果想得到圖中陰影面積孩等,就需要寫的CGRect(0.5,0.5,0.25,0.25),意思是艾君,從(0.5,0.5)為原點,面積為(0.25肄方,0.25)冰垄,大家可以理解成,即下面的方法权她。

使用方法如下:

    dict[UNNotificationAttachmentOptionsThumbnailClippingRectKey] = (__bridge id _Nullable)((CGRectCreateDictionaryRepresentation(CGRectMake(0.5, 0.5, 0.25 ,0.25))));;

使用上面的方法虹茶,可以得到一張圖的陰影部分的圖像,這張圖像會是通知的縮略圖隅要。比如我下面的這個圖蝴罪,縮略圖大家應(yīng)該可以發(fā)現(xiàn)變了吧。
QQ20160919-10.png-49.2kB
QQ20160919-10.png-49.2kB

這里為了理解拾徙,在給大家說幾個"坐標(biāo)點":
(0洲炊,0,0.25,0.25)左上角的最小正方形
(0暂衡,0询微,0.5,0.5) 四分之一的正方形狂巢,左上角
(0.5撑毛,0.5,0.5唧领,0.5)四分之一的正方形藻雌,右下角
(0.5,0斩个,0.5胯杭,0.5)四分之一的正方形,左下角
(0.25,0.25,0.5,0.5)最中心的正方形

特別注意:

調(diào)試到這里的時候受啥,我感覺蘋果應(yīng)該是有個bug,就是我在來回變化這個顯示縮略圖的frame的時候做个,來回改,永遠顯示為第一次寫的frame滚局。我在修改UNNotificationRequest的requestIdentifer屬性后居暖,可以變換屬性。所以我猜測可能相同requestIdentifer的通知藤肢,算一個通知太闺,所以只能調(diào)用更新的方法,來變化縮略圖的吃不膩吧嘁圈,或許也不是bug省骂。

  • 4UNNotificationAttachmentOptionsThumbnailTimeKey,一般影片附件會用到,指的是用影片中的某一秒來做這個縮略圖丑孩;

使用方法如下:

    dict[UNNotificationAttachmentOptionsThumbnailTimeKey] =@10;

這里我們可以直接傳遞一個NSNumber的數(shù)值冀宴,比如使用影片第10s的畫面來做縮略圖就按照上面的來寫灭贷。此外温学,要注意的是,這個秒數(shù)必須是這個影片長度范圍內(nèi)的甚疟,不然報錯仗岖。

3.UNTimeIntervalNotificationTrigger (通知觸發(fā)模式)

這個我在iOS開發(fā) iOS10推送必看(基礎(chǔ)篇)這篇文章中已經(jīng)初步介紹了,現(xiàn)在我在詳細介紹下览妖。

  • 1.UNPushNotificationTrigger (遠程通知觸發(fā))一般我們不會使用的

  • 2.UNTimeIntervalNotificationTrigger (本地通知) 一定時間之后轧拄,重復(fù)或者不重復(fù)推送通知。我們可以設(shè)置timeInterval(時間間隔)和repeats(是否重復(fù))讽膏。

使用方法:

UNTimeIntervalNotificationTrigger *triggerOne = [UNTimeIntervalNotificationTrigger triggerWithTimeInterval:5 repeats:NO];

解釋:上面的方法是指5秒鐘之后執(zhí)行檩电。repeats這個屬性,如果需要為重復(fù)執(zhí)行的,則TimeInterval必須大于60s,否則會報*** Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 'time interval must be at least 60 if repeating'的錯誤!

  • 3.UNCalendarNotificationTrigger(本地通知) 一定日期之后俐末,重復(fù)或者不重復(fù)推送通知 例如料按,你每天8點推送一個通知,只需要dateComponents為8卓箫。如果你想每天8點都推送這個通知载矿,只要repeats為YES就可以了。
// 周一早上 8:00 上班
NSDateComponents *components = [[NSDateComponents alloc] init];
// 注意烹卒,weekday是從周日開始的闷盔,如果想設(shè)置為從周一開始,大家可以自己想想~
components.weekday = 2;
components.hour = 8;
UNCalendarNotificationTrigger *trigger = [UNCalendarNotificationTrigger triggerWithDateMatchingComponents:components repeats:YES];
  • 4.UNLocationNotificationTrigger (本地通知)地理位置的一種通知旅急,使用這個通知逢勾,你需要導(dǎo)入
    #import<CoreLocation/CoreLocation.h>這個系統(tǒng)類庫。示例代碼如下:

//1藐吮、如果用戶進入或者走出某個區(qū)域會調(diào)用下面兩個方法
- (void)locationManager:(CLLocationManager *)manager
    didEnterRegion:(CLRegion *)region
- (void)locationManager:(CLLocationManager *)manager
    didExitRegion:(CLRegion *)region代理方法反饋相關(guān)信息

//2敏沉、一到某個經(jīng)緯度就通知,判斷包含某一點么
// 不建議使用Q茁搿C顺佟!A氏小T懿ぁ!CLRegion *region = [[CLRegion alloc] init];// 不建議使用G溉颉O街凇!:途础0颊ā!


CLCircularRegion *circlarRegin = [[CLCircularRegion alloc] init];
[circlarRegin containsCoordinate:(CLLocationCoordinate2D)];

UNLocationNotificationTrigger *trigger4 = [UNLocationNotificationTrigger triggerWithRegion:circlarRegin repeats:NO];
 

注意昼弟,這里建議使用CLCircularRegion這個繼承自CLRegion的類啤它,因為我看到蘋果已經(jīng)飛起了CLRegion里面是否包含這一點的方法,并且推薦我們使用CLCircularRegion這個類型

如果你喜歡我的文章舱痘,不要忘記關(guān)注我变骡,謝謝大家了~
另外如果你要轉(zhuǎn)載,希望可以注明出處芭逝,我會寫出更多更好的文章塌碌,來回饋大家~

稍后我會補充更多內(nèi)容,敬請期待QⅰLㄗ薄翎猛!

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市接剩,隨后出現(xiàn)的幾起案子办成,更是在濱河造成了極大的恐慌,老刑警劉巖搂漠,帶你破解...
    沈念sama閱讀 219,366評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件迂卢,死亡現(xiàn)場離奇詭異,居然都是意外死亡桐汤,警方通過查閱死者的電腦和手機而克,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,521評論 3 395
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來怔毛,“玉大人员萍,你說我怎么就攤上這事〖鸲龋” “怎么了碎绎?”我有些...
    開封第一講書人閱讀 165,689評論 0 356
  • 文/不壞的土叔 我叫張陵,是天一觀的道長抗果。 經(jīng)常有香客問我筋帖,道長,這世上最難降的妖魔是什么冤馏? 我笑而不...
    開封第一講書人閱讀 58,925評論 1 295
  • 正文 為了忘掉前任日麸,我火速辦了婚禮,結(jié)果婚禮上逮光,老公的妹妹穿的比我還像新娘代箭。我一直安慰自己,他們只是感情好涕刚,可當(dāng)我...
    茶點故事閱讀 67,942評論 6 392
  • 文/花漫 我一把揭開白布嗡综。 她就那樣靜靜地躺著,像睡著了一般杜漠。 火紅的嫁衣襯著肌膚如雪极景。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,727評論 1 305
  • 那天碑幅,我揣著相機與錄音戴陡,去河邊找鬼。 笑死沟涨,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的异吻。 我是一名探鬼主播裹赴,決...
    沈念sama閱讀 40,447評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼喜庞,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了棋返?” 一聲冷哼從身側(cè)響起延都,我...
    開封第一講書人閱讀 39,349評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎睛竣,沒想到半個月后晰房,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,820評論 1 317
  • 正文 獨居荒郊野嶺守林人離奇死亡射沟,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,990評論 3 337
  • 正文 我和宋清朗相戀三年殊者,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片验夯。...
    茶點故事閱讀 40,127評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡猖吴,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出挥转,到底是詐尸還是另有隱情海蔽,我是刑警寧澤,帶...
    沈念sama閱讀 35,812評論 5 346
  • 正文 年R本政府宣布绑谣,位于F島的核電站党窜,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏借宵。R本人自食惡果不足惜刑然,卻給世界環(huán)境...
    茶點故事閱讀 41,471評論 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望暇务。 院中可真熱鬧泼掠,春花似錦、人聲如沸垦细。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,017評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽括改。三九已至腻豌,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間嘱能,已是汗流浹背吝梅。 一陣腳步聲響...
    開封第一講書人閱讀 33,142評論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留惹骂,地道東北人苏携。 一個月前我還...
    沈念sama閱讀 48,388評論 3 373
  • 正文 我出身青樓,卻偏偏與公主長得像对粪,于是被迫代替她去往敵國和親右冻。 傳聞我的和親對象是個殘疾皇子装蓬,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,066評論 2 355

推薦閱讀更多精彩內(nèi)容