ios10推送框架快速集成及功能介紹

簡(jiǎn)介

UserNotifications.framework框架是iOS 10中一個(gè)重要的更新碰辅,它統(tǒng)一了舊版本雜亂的和通知相關(guān)的API.
iOS 10后最大的特色是可以支持多媒體推送爹谭,包括圖像jpg杯巨、gif以及聲音及視頻等,另外還可以自定義推送視圖练般、撤回通知以及在不增加推送信息數(shù)量的情況下更新推送內(nèi)容等等矗漾。

快速集成步驟
1、新的請(qǐng)求推送權(quán)限

//彈出允許權(quán)限通知提示不應(yīng)該在app啟動(dòng)的時(shí)候薄料,應(yīng)該在程序需要的地方調(diào)用敞贡,僅提示一次
            UNUserNotificationCenter *center = [UNUserNotificationCenter currentNotificationCenter];
            center.delegate=self;
            UNAuthorizationOptions types10=UNAuthorizationOptionBadge|UNAuthorizationOptionAlert|UNAuthorizationOptionSound;
            [center requestAuthorizationWithOptions:types10 completionHandler:^(BOOL granted, NSError * _Nullable error) {
                if (granted) {
                    //點(diǎn)擊允許
                    NSLog(@"允許");
                } else {
                    //點(diǎn)擊不允許
                    
                    NSLog(@"不允許");
                }
            }];

2、新的接收及處理推送信息

//iOS10新增:處理前臺(tái)收到通知的代理方法
(void)userNotificationCenter:(UNUserNotificationCenter *)center willPresentNotification:(UNNotification *)notification withCompletionHandler:(void (^)(UNNotificationPresentationOptions))completionHandler
{
    NSDictionary * userInfo = notification.request.content.userInfo;
    if([notification.request.trigger isKindOfClass:[UNPushNotificationTrigger class]]) {
        //應(yīng)用處于前臺(tái)時(shí)的遠(yuǎn)程推送接受
        //關(guān)閉友盟自帶的彈出框
        [UMessage setAutoAlert:NO];
        //必須加這句代碼
        [UMessage didReceiveRemoteNotification:userInfo];
        
    }else{
        //應(yīng)用處于前臺(tái)時(shí)的本地推送接受
    }
    //當(dāng)應(yīng)用處于前臺(tái)時(shí)提示設(shè)置摄职,需要哪個(gè)可以設(shè)置哪一個(gè)
    completionHandler(UNNotificationPresentationOptionSound|UNNotificationPresentationOptionAlert);
}

//iOS10新增:處理后臺(tái)點(diǎn)擊通知的代理方法
-(void)userNotificationCenter:(UNUserNotificationCenter *)center didReceiveNotificationResponse:(UNNotificationResponse *)response withCompletionHandler:(void (^)())completionHandler
{
    [[YKPushNotificationManager shareInstance]dealWithNotificationBackgroundIniOS10:response Completion:completionHandler];
}

多媒體推送

1誊役、工程中導(dǎo)入
UserNotifications.framework以及UserNotificationsUI.framework

2获列、在開(kāi)發(fā)者賬戶中新建對(duì)應(yīng)項(xiàng)目bundle ID對(duì)應(yīng)的WildCardAppId:


4AF6006B-3438-481B-92BD-1133083607B9.png

如工程的bundle ID為:com.test.xxx
則wildCardAppID為 :com.test.xxx.*

3、如果需要在推送信息中顯示圖像蛔垢、聲音或者視頻击孩,需要建立NotificationService與NotificationContent兩個(gè)target,其中NotificationServiceExtendsion用來(lái)處理推送中的多媒體資源鹏漆,
NotificationContentExtentsion用來(lái)處理自定義視圖巩梢。

B024ADE9-A7EF-4686-B003-3ADC1F7745EE.png

新建的兩個(gè)target都包含了info.plist文件,如果需要在推送中顯示多媒體資源艺玲,多媒體中的鏈接要求為https括蝠,否則需要在需要在info.plist中把ATS Setting設(shè)置為yes。


A1DA7563-8289-445E-8EBA-6FF1B86D684F.png

ContentTarget中的info.plist內(nèi)的UNNotificationExtensionCategory表示推送的類(lèi)別標(biāo)識(shí)饭聚,推送信息中帶上這個(gè)標(biāo)識(shí)可以顯示自定義視圖以及自定義的按鈕交互忌警。

585CBE56-0F8A-46D4-A2FE-4681602E4DBD.png

NotificationServiceExtendsion中生成了兩個(gè)自帶的方法,

  • (void)didReceiveNotificationRequest:(UNNotificationRequest *)requestwithContentHandler:用于處理接受推送后用來(lái)請(qǐng)求媒體資源秒梳,

另一個(gè)用于請(qǐng)求超時(shí)的處理操作

  • (void)serviceExtensionTimeWillExpire
- (void)didReceiveNotificationRequest:(UNNotificationRequest *)request
                   withContentHandler:(void (^)(UNNotificationContent * _Nonnull))contentHandler {
    self.contentHandler = contentHandler;
    self.bestAttemptContent = [request.content mutableCopy];
    self.bestAttemptContent.title = [NSString stringWithFormat:@"%@ [modified]", self.bestAttemptContent.title];
    
    NSDictionary *apsDic = [request.content.userInfo objectForKey:@"aps"];
    
    //設(shè)定標(biāo)識(shí)交互
    NSString *category = [apsDic objectForKey:@"category"];
    self.bestAttemptContent.categoryIdentifier = category;
    
    NSString *imageUrl = [apsDic objectForKey:@"image"];
    NSString *gifUrl = [apsDic objectForKey:@"gif"];
    NSString *videoUrl = [apsDic objectForKey:@"video"];
    NSString *audioUrl = [apsDic objectForKey:@"audio"];
    NSString *typeString;
    NSURL *url;
    if (imageUrl.length > 0)
    {
        url = [NSURL URLWithString:imageUrl];
        typeString = @"jpg";
    }
    if (gifUrl.length > 0)
    {
        url = [NSURL URLWithString:gifUrl];
        typeString = @"gif";
    }
    if (videoUrl.length > 0)
    {
        url = [NSURL URLWithString:videoUrl];
        typeString = @"mp4";
    }
    if (audioUrl.length > 0)
    {
        url = [NSURL URLWithString:audioUrl];
        typeString = @"mp3";
    }
    
    NSURLSession *session = [NSURLSession sharedSession];
    
    if (url)
    {
        NSURLSessionDownloadTask *downloadTask = [session downloadTaskWithURL:url completionHandler:
                                                  ^(NSURL * _Nullable location,
                                                    NSURLResponse * _Nullable response,
                                                    NSError * _Nullable error)
                                                  {
                                                      NSString *caches = [NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES) lastObject];
                                                      
                                                      NSString *toPath = [caches stringByAppendingString:[NSString stringWithFormat:@".%@",typeString]];

                                                      NSLog(@"fileToPath = %@",toPath);
                                                      // 將臨時(shí)文件剪切或者復(fù)制Caches文件夾
                                                      NSFileManager *mgr = [NSFileManager defaultManager];
                                                      // AtPath : 剪切前的文件路徑
                                                      // ToPath : 剪切后的文件路徑
                                                      [mgr moveItemAtPath:location.path toPath:toPath error:nil];
                                                      
                                                      if (toPath && ![toPath isEqualToString: @""])
                                                      {
                                                          UNNotificationAttachment *attch = [UNNotificationAttachment attachmentWithIdentifier:@""
                                                                                                                                           URL:[NSURL URLWithString:[@"file://" stringByAppendingString:toPath]]
                                                                                                                                       options:nil
                                                                                                                                         error:nil];
                                                          if(attch)
                                                          {
                                                              self.bestAttemptContent.attachments = @[attch];
                                                          }
                                                      }
                                                      self.contentHandler(self.bestAttemptContent);
                                                  }];
        [downloadTask resume];
    }
    else
    {
        self.contentHandler(self.bestAttemptContent);
    }
}

- (void)serviceExtensionTimeWillExpire {
    // Called just before the extension will be terminated by the system.
    // Use this as an opportunity to deliver your "best attempt" at modified content, otherwise the original push payload will be used.
    self.contentHandler(self.bestAttemptContent);
}

本地推送

//能夠通過(guò)identitifier來(lái)區(qū)別其他通知法绵,并且能夠進(jìn)行本地消息的更新、尋找酪碘、刪除等朋譬,其中更新通知能夠在不增加推送條數(shù)的情況下更新內(nèi)容。
NSString *requestIdentifier = @"sampleRequest";
UNNotificationRequest *request = [UNNotificationRequest requestWithIdentifier:requestIdentifier
                                                                          content:content
                                                                          trigger:trigger1];
[center addNotificationRequest:request withCompletionHandler:^(NSError * _Nullable error) {

}];

category id 必須對(duì)應(yīng) Notification info.plist 里面才能顯示自定義交互
每一個(gè)推送內(nèi)容最好帶上一個(gè)catagory婆跑,這樣方便我們根據(jù)不同的categoryId來(lái)自定義不同類(lèi)型的視圖,以及自定義交互庭呜。

有可能遇到的坑:
一滑进、不能收到多媒體信息,仍然顯示普通文本
解決方法:
1募谎、推送信息中檢查是否包含: "mutable-content" = 1 扶关,通知權(quán)限要設(shè)置UNNotificationPresentationOptionAlert
2、更換不同的系統(tǒng)版本数冬,在測(cè)試中發(fā)現(xiàn)10.3系統(tǒng)終端能收到节槐,10.2.1系統(tǒng)不能收到

二、調(diào)試的時(shí)候要選擇對(duì)應(yīng)的target才能斷點(diǎn)

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末拐纱,一起剝皮案震驚了整個(gè)濱河市铜异,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌秸架,老刑警劉巖揍庄,帶你破解...
    沈念sama閱讀 206,839評(píng)論 6 482
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異东抹,居然都是意外死亡蚂子,警方通過(guò)查閱死者的電腦和手機(jī)沃测,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,543評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)食茎,“玉大人蒂破,你說(shuō)我怎么就攤上這事”鹩妫” “怎么了附迷?”我有些...
    開(kāi)封第一講書(shū)人閱讀 153,116評(píng)論 0 344
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)钠糊。 經(jīng)常有香客問(wèn)我挟秤,道長(zhǎng),這世上最難降的妖魔是什么抄伍? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 55,371評(píng)論 1 279
  • 正文 為了忘掉前任艘刚,我火速辦了婚禮,結(jié)果婚禮上截珍,老公的妹妹穿的比我還像新娘攀甚。我一直安慰自己,他們只是感情好岗喉,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,384評(píng)論 5 374
  • 文/花漫 我一把揭開(kāi)白布秋度。 她就那樣靜靜地躺著,像睡著了一般钱床。 火紅的嫁衣襯著肌膚如雪荚斯。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 49,111評(píng)論 1 285
  • 那天查牌,我揣著相機(jī)與錄音事期,去河邊找鬼。 笑死纸颜,一個(gè)胖子當(dāng)著我的面吹牛兽泣,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播胁孙,決...
    沈念sama閱讀 38,416評(píng)論 3 400
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼唠倦,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了涮较?” 一聲冷哼從身側(cè)響起稠鼻,我...
    開(kāi)封第一講書(shū)人閱讀 37,053評(píng)論 0 259
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎狂票,沒(méi)想到半個(gè)月后枷餐,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,558評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,007評(píng)論 2 325
  • 正文 我和宋清朗相戀三年毛肋,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了怨咪。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,117評(píng)論 1 334
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡润匙,死狀恐怖诗眨,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情孕讳,我是刑警寧澤匠楚,帶...
    沈念sama閱讀 33,756評(píng)論 4 324
  • 正文 年R本政府宣布,位于F島的核電站厂财,受9級(jí)特大地震影響芋簿,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜璃饱,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,324評(píng)論 3 307
  • 文/蒙蒙 一与斤、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧荚恶,春花似錦撩穿、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,315評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至廓潜,卻和暖如春抵皱,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背辩蛋。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,539評(píng)論 1 262
  • 我被黑心中介騙來(lái)泰國(guó)打工呻畸, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人堪澎。 一個(gè)月前我還...
    沈念sama閱讀 45,578評(píng)論 2 355
  • 正文 我出身青樓擂错,卻偏偏與公主長(zhǎng)得像味滞,于是被迫代替她去往敵國(guó)和親坡慌。 傳聞我的和親對(duì)象是個(gè)殘疾皇子蝠猬,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,877評(píng)論 2 345

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