iOS極光推送帶圖片模式(Service Extension)

以下所有內(nèi)容均為個人觀點,轉(zhuǎn)載請注明出處<簡書--小蝸牛吱呀之悠悠 >,謝謝!

最近工作中新增一個告警推送帶圖片的需求拨匆,要求在云端服務(wù)器向極光推送圖片地址,APP在收到推送消息以后能夠?qū)⒌刂穼?yīng)的圖片下載完成并顯示在推送欄右側(cè)挽拂,經(jīng)過一段時間對極光推送官方文檔和iOS10新特性Service Extension的研究惭每,終于實現(xiàn)了該功能的開發(fā)。由于是初次使用此功能亏栈,遇到不少問題台腥,為做記錄以及方便大家查閱,故寫下這篇博客绒北,若有不恰當(dāng)之處敬請留言指導(dǎo)黎侈,不勝感激,話不多說闷游,開始正文蜓竹!

一、極光推送的流程介紹

通常储藐,后臺推送比較常見,本文僅介紹關(guān)于后臺極光推送的實現(xiàn)流程嘶是。如下圖紅色箭頭所示


image.png

1钙勃、云服務(wù)器調(diào)用極光的接口向極光發(fā)送消息,極光收到消息后會將消息發(fā)送給蘋果的APNs服務(wù)器聂喇,蘋果再根據(jù)唯一標(biāo)示找到手機辖源,手機收到推送消息后,會在屏幕上方彈出推送消息希太。

2克饶、iOS 10以前,iOS的推送只能實現(xiàn)推送文字消息誊辉,這時候就需要云服務(wù)器將推送的內(nèi)容發(fā)送給極光矾湃,APP展示在界面上。iOS 10以后堕澄,蘋果官方新增了一些特性邀跃,其中包括新的推送方式----推送攔截(Service Extension),這種推送方式允許iOS開發(fā)者對接收到的推送消息進行一定的處理蛙紫,以便達到自己想要的效果拍屑。

2、Service Extension介紹
image.png

如上圖所示坑傅,在iOS 10以后僵驰,在APNs與APP之間增加了一個擴展,這意味著在APNs到達我們的設(shè)備之前,還會經(jīng)過一層允許用戶自主設(shè)置的Extension服務(wù)進行處理蒜茴,為APNs增加了多樣性星爪,在這個Extension中,我們可以圖片矮男、音頻(比如支付寶的到賬提醒語音)移必,我們甚至可以修改顯示的文字消息(意義不大,如果需要修改毡鉴,直接讓服務(wù)器去修改推送的內(nèi)容就可以了)崔泵。

3、Service Extension集成介紹

極光推送的內(nèi)容此處忽略猪瞬,需要學(xué)習(xí)的請參考https://docs.jiguang.cn/jpush/client/iOS/ios_guide_new/
1憎瘸、新建Service Extension,File->New->Target

image.png

image.png

需要注意的一點是,這是一個新的target陈瘦,bundle ID與主APP不同幌甘,它是主APP的一個擴展,必須是主APP的bundle ID拼上target的名字痊项。
創(chuàng)建完成后锅风,會多一個target,如下圖:
image.png

2鞍泉、此時主工程需要如下配置:


image.png

3皱埠、對Extension做如下配置:


image.png

4、將極光的庫導(dǎo)入工程并引入依賴庫:
image.png

5咖驮、接下來就需要為新的target制作證書了边器,從APP IDs 到 Provisioning Profiles, 配置好開發(fā)環(huán)境托修、生產(chǎn)環(huán)境的Provisioning Profile之后忘巧,依次選擇對應(yīng)的證書即可,關(guān)于如何制作證書睦刃,這里不贅述砚嘴,請出門右拐找度娘。
證書配置完畢后涩拙,APP的準(zhǔn)備工作算是完成了枣宫,服務(wù)器需要將字段:"mutable -content" 設(shè)置為true后再發(fā)給極光,具體的集成步驟吃环,請服務(wù)器人員自行參考極光官網(wǎng)也颤。

二、Service Extension target編碼

進入到Xcode自動給你創(chuàng)建的.m文件中郁轻,會發(fā)現(xiàn)有2個方法翅娶。

  • didReceiveNotificationRequest:(UNNotificationRequest *)request withContentHandler:(void (^)(UNNotificationContent *contentToDeliver))contentHandler
  • serviceExtensionTimeWillExpire

第一個方法就是我們用于攔截推送消息后文留,自定義消息內(nèi)容的方法。第二個方法是對第一個方法的補救竭沫。第二個方法會在過期之前進行回調(diào)燥翅,此時你可以對你的APNs消息進行一下緊急處理,比如多媒體文件過大蜕提,下載的時間過長森书,會直接調(diào)用此方法。

注意:媒體資源文件不宜過大谎势,否則耗時過長凛膏,無法達到攔截效果
- (void)didReceiveNotificationRequest:(UNNotificationRequest *)request withContentHandler:(void (^)(UNNotificationContent * _Nonnull))contentHandler {
    self.contentHandler = contentHandler;
    self.bestAttemptContent = [request.content mutableCopy];
/*
*  解析圖片的地址
*  收到的字典數(shù)據(jù)結(jié)構(gòu)并不是和服務(wù)器約定好的,為了通用性脏榆,此處遞歸解析字典
*/ 
    NSString *imgUrl = [self getURLForUserInfo:self.bestAttemptContent.userInfo];
    if (imgUrl) {
        //download
        NSURL *fileURL = [NSURL URLWithString:imgUrl];
        [self downloadAndSave:fileURL handler:^(NSString *localPath) {
            if (localPath) {
                UNNotificationAttachment * attachment = [UNNotificationAttachment attachmentWithIdentifier:@"myAttachment" URL:[NSURL fileURLWithPath:localPath] options:nil error:nil];
                self.bestAttemptContent.attachments = @[attachment];
            }
            //此方法為極光SDK中的用于上傳appKey的方法
            [self apnsDeliverWith:request];
        }];
    }else{
        [self apnsDeliverWith:request];
    }
}

此處收到的字典猖毫,但字典的數(shù)據(jù)結(jié)構(gòu)并不是與云服務(wù)器約定好的結(jié)構(gòu),此問題咨詢過極光的工作人員须喂,并未給出合理的解釋吁断,此處為了規(guī)避數(shù)據(jù)結(jié)構(gòu)異常導(dǎo)致的問題,采用遞歸解析的方式獲取地址坞生。解析方法如下:

- (NSString *)getURLForUserInfo:(NSDictionary *)userInfo {
    __block NSString *url = nil;
    __block __weak __typeof(&*self)weakSelf = self;
    [userInfo enumerateKeysAndObjectsUsingBlock:^(id  _Nonnull key, id  _Nonnull obj, BOOL * _Nonnull stop) {
        if ([key containsString:@"url"]) {
            *stop = YES;
            url = obj;
        }
        if ([obj isKindOfClass:[NSDictionary class]] || [obj isKindOfClass:[NSArray class]]) {
           url = [weakSelf getURLForUserInfo:obj];
        }
    }];
    return url;
}

由于這是擴展的target仔役,無法使用主工程的網(wǎng)絡(luò)請求庫,需要使用原生的網(wǎng)絡(luò)請求方法下載資源文件:

- (void)downloadAndSave:(NSURL *)fileURL handler:(void (^)(NSString *))handler {
    
    NSURLSession * session = [NSURLSession sharedSession];
    NSURLSessionDownloadTask *task = [session downloadTaskWithURL:fileURL completionHandler:^(NSURL * _Nullable location, NSURLResponse * _Nullable response, NSError * _Nullable error) {
        NSString *localPath = nil;
        if (!error) {
            //臨時文件夾路徑是己,APP沒有運行時會自動清除圖片又兵,不會占用內(nèi)存
            NSString * localURL = [NSString stringWithFormat:@"%@/%@", NSTemporaryDirectory(),fileURL.lastPathComponent];
            if ([[NSFileManager defaultManager] moveItemAtPath:location.path toPath:localURL error:nil]) {
                localPath = localURL;
            }
        }
        handler(localPath);
    }];
    [task resume];
    
}

資源文件下載失敗,緊急處理:

- (void)serviceExtensionTimeWillExpire {
    self.contentHandler(self.bestAttemptContent);
}
三赃泡、Service Extension target調(diào)試

編碼完成后,通常需要調(diào)試乘盼,主要涉及兩個方面升熊,一個是擴展工程的在線調(diào)試,另一個是極光推送的編譯環(huán)境調(diào)試绸栅。

1级野、極光在線調(diào)試

進入極光主頁,進入如下界面:


image.png

配置相關(guān)信息粹胯,需要注意的一點是蓖柔,Service Extension target需要勾選下圖中的選項:


image.png

點擊推送后,APP即可收到后臺推送消息风纠。如果需要顯示圖片况鸣,則在附件字段一欄,設(shè)置好鍵值對竹观。
2镐捧、擴展工程在線調(diào)試

首先需要運行主工程文件潜索,等主工程文件運行起來后點擊下圖操作,過一段時間會出現(xiàn)你的擴展工程(有時候會出不來懂酱,感覺像是Xcode的bug)竹习,當(dāng)你接受的推送后,會在你的擴展工程中的斷點處停下列牺。


擴展工程調(diào)試.png
3整陌、字段調(diào)試

如果2中所提的調(diào)試方法無法使用斷點,可以采用修改推送內(nèi)容的方式來調(diào)試瞎领,如下:

self.bestAttemptContent.title = [NSString stringWithFormat:@"%@ [NotificationService]", self.bestAttemptContent.title];

此時泌辫,你收到的推送消息將會拼接上[NotificationService],如果是這種格式顯示的默刚,那么恭喜你甥郑,你的擴展攔截是OK的;如果收到的沒有拼接上荤西,那么澜搅,說明你攔截失敗,需要考慮你的集成步驟是否正確邪锌,或者是證書的生成是否OK勉躺。

附上一張帶圖片推送的圖片
UNADJUSTEDNONRAW_thumb_33.jpg
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市觅丰,隨后出現(xiàn)的幾起案子饵溅,更是在濱河造成了極大的恐慌,老刑警劉巖妇萄,帶你破解...
    沈念sama閱讀 206,311評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件蜕企,死亡現(xiàn)場離奇詭異,居然都是意外死亡冠句,警方通過查閱死者的電腦和手機轻掩,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,339評論 2 382
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來懦底,“玉大人唇牧,你說我怎么就攤上這事【厶疲” “怎么了丐重?”我有些...
    開封第一講書人閱讀 152,671評論 0 342
  • 文/不壞的土叔 我叫張陵,是天一觀的道長杆查。 經(jīng)常有香客問我扮惦,道長,這世上最難降的妖魔是什么亲桦? 我笑而不...
    開封第一講書人閱讀 55,252評論 1 279
  • 正文 為了忘掉前任径缅,我火速辦了婚禮掺栅,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘纳猪。我一直安慰自己氧卧,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 64,253評論 5 371
  • 文/花漫 我一把揭開白布氏堤。 她就那樣靜靜地躺著沙绝,像睡著了一般。 火紅的嫁衣襯著肌膚如雪鼠锈。 梳的紋絲不亂的頭發(fā)上闪檬,一...
    開封第一講書人閱讀 49,031評論 1 285
  • 那天,我揣著相機與錄音购笆,去河邊找鬼粗悯。 笑死,一個胖子當(dāng)著我的面吹牛同欠,可吹牛的內(nèi)容都是我干的样傍。 我是一名探鬼主播,決...
    沈念sama閱讀 38,340評論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼铺遂,長吁一口氣:“原來是場噩夢啊……” “哼衫哥!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起襟锐,我...
    開封第一講書人閱讀 36,973評論 0 259
  • 序言:老撾萬榮一對情侶失蹤撤逢,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后粮坞,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體蚊荣,經(jīng)...
    沈念sama閱讀 43,466評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 35,937評論 2 323
  • 正文 我和宋清朗相戀三年莫杈,在試婚紗的時候發(fā)現(xiàn)自己被綠了互例。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,039評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡姓迅,死狀恐怖敲霍,靈堂內(nèi)的尸體忽然破棺而出俊马,到底是詐尸還是另有隱情丁存,我是刑警寧澤,帶...
    沈念sama閱讀 33,701評論 4 323
  • 正文 年R本政府宣布柴我,位于F島的核電站解寝,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏艘儒。R本人自食惡果不足惜聋伦,卻給世界環(huán)境...
    茶點故事閱讀 39,254評論 3 307
  • 文/蒙蒙 一夫偶、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧觉增,春花似錦兵拢、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,259評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至嘹履,卻和暖如春腻扇,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背砾嫉。 一陣腳步聲響...
    開封第一講書人閱讀 31,485評論 1 262
  • 我被黑心中介騙來泰國打工幼苛, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人焕刮。 一個月前我還...
    沈念sama閱讀 45,497評論 2 354
  • 正文 我出身青樓舶沿,卻偏偏與公主長得像,于是被迫代替她去往敵國和親济锄。 傳聞我的和親對象是個殘疾皇子暑椰,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 42,786評論 2 345