AppExtension:NotificationServiceExtension集成、調(diào)試脖祈、打包的實(shí)踐

一肆捕、概述

Apple早在iOS10就退出NotificationServiceExtension的擴(kuò)展,并不是必備項(xiàng)目盖高,因此各家公司產(chǎn)品支持各不相同慎陵,主要取決于產(chǎn)品的實(shí)際需求是否需要。

2021年我所在項(xiàng)目的一個(gè)需求是:“推送內(nèi)容顯示圖片(title-image)喻奥,即推送支持簡圖”席纽,這個(gè)需求就需要用到NotificationServiceExtension 的相關(guān)內(nèi)容。

百度有很多集成的教程撞蚕,不知道為啥润梯,很多都只說了其中一個(gè)片面,其原因在于很多都只是看了官網(wǎng)的教程甥厦,實(shí)際開發(fā)中遇到的問題沒有寫出來纺铭。

以下是相關(guān)筆記,
特別是擴(kuò)展是如何與宿主App的Target關(guān)聯(lián)的刀疙?
如何被打包進(jìn)宿主App的舶赔?
它在宿主App的包里面長什么樣?
它是如何和宿主App一同提審谦秧?

二竟纳、NotificationServiceExtension原理篇

1、NotificationServiceExtension 的作用是什么疚鲤?

NotificationServiceExtension屬于AppExtension(擴(kuò)展)的范疇锥累,屬于官方推出的擴(kuò)展。同NotificationContentExtension一同豐富用戶的推送體驗(yàn)集歇,讓開發(fā)者可以本地?cái)r截和修改推送內(nèi)容的機(jī)會揩悄,可以自定義自己的推送內(nèi)容展示樣式。大大提高了整體的用戶體驗(yàn)鬼悠。

2删性、NotificationServiceExtension相關(guān)特性(官網(wǎng)翻譯)

  • 只允許修改推送內(nèi)容,不能包含任何的UI顯示焕窝。
    A Notification Service app extension doesn't present any UI of its own.

  • 開發(fā)者無法自己初始化蹬挺,在推送到達(dá)的時(shí)候iOS系統(tǒng)會自動創(chuàng)建UNNotificationServiceExtension對象。開發(fā)者只能通過擴(kuò)展Target下的NotificationServiceExtension的子類來修改自己App推送的內(nèi)容它掂。
    You don't create UNNotificationServiceExtension objects yourself. Instead, the Xcode template for a Notification Service Extension target contains a subclass for you to modify.

  • iOS收到App的推送的時(shí)候巴帮,系統(tǒng)自動初始化UNNotificationServiceExtension對象溯泣,然后回調(diào)給App的擴(kuò)展子類的方法didReceiveNotificationRequest:withContentHandler:
    When a remote notification for your app is received, the system loads your extension and calls its didReceiveNotificationRequest:withContentHandler: method

  • 響應(yīng)函數(shù)的操作時(shí)間只有30秒榕茧;如果未處理超時(shí)處理垃沦,系統(tǒng)會按照默認(rèn)顯示推送。
    Your didReceiveNotificationRequest:withContentHandler: method has only about 30 seconds to modify the payload and call the provided completion handler. If your code takes longer than that, the system calls the serviceExtensionTimeWillExpire method, at which point you must return whatever you can to the system immediately. If you fail to call the completion handler from either method, the system displays the original contents of the notification.

  • 服務(wù)端推送的payload格式要求
    必須是alert類型用押,aps字段必須包含有alert字段肢簿,alert里必須是title、subtitle蜻拨、body任何一個(gè)池充。
    The payload must include an alert dictionary with title, subtitle, or body information.

    aps字段里面必須有mutable-content字段,其值必須為1缎讼。
    The remote notification’s aps dictionary includes the mutable-content key with the value set to 1.

3收夸、UNNotificationServiceExtension工作原理篇

詳見鄙人另外整理筆記。AppExtension:擴(kuò)展的學(xué)習(xí)筆記

三血崭、UNNotificationServiceExtension的實(shí)踐

1卧惜、前提

推送主工程必須開啟推送功能,證書也必須支持夹纫,bundleId不能包含通配符序苏,這些是基礎(chǔ)知識。


1F44689C-0A8E-432D-A3F4-D25E42639203.png

2捷凄、創(chuàng)建

在項(xiàng)目工程中忱详,新建Target的方式集成(一個(gè)工程允許存在多個(gè)Targets),如下


19448884-9DF3-42B3-B64F-A5AD8C130CE0.png

系統(tǒng)模板自動創(chuàng)建:NotificationServiceExtension的文件夾跺涤、NotificationService : UNNotificationServiceExtension子類匈睁、info.plist配置文件。

CC6A72C8-1FAF-4E7A-ADEC-354DADEB01B4.png

其中info.plist配置文件桶错,擴(kuò)展關(guān)鍵配置如下航唆,id固定com.apple.usernotifications.service不能更改,class對應(yīng)子類類名院刁。后續(xù)擴(kuò)展Target的相關(guān)配置都在這里面糯钙,需要網(wǎng)絡(luò)的需要開啟App Transport Security SettingsAllow Arbitrary Loads為YES。

8BAD934E-85B5-4871-82A2-528DE45ADEF6.png

2退腥、主工程Target與擴(kuò)展Target的關(guān)系(關(guān)鍵的關(guān)鍵)

很多網(wǎng)上的教程都沒有說明這點(diǎn)任岸,以至于后續(xù)打包和提審都難以理解其原理。(網(wǎng)上很多直說無法單獨(dú)提審狡刘,必須與ContainApp一起提審享潜。)

  • 擴(kuò)展Target是通過 ”依賴的方式“ 的方式添加到主工程Target中。
    查看主工程Target的 BuildPhasesDependencies 關(guān)聯(lián)擴(kuò)展Target嗅蔬;同時(shí)多了個(gè) Embed App Extensions 里面關(guān)聯(lián)擴(kuò)展的編譯產(chǎn)物.appex執(zhí)行文件剑按。
    0693088B-0E07-482C-A441-A68B6EC97031.png
  • 擴(kuò)展最終被打包給.appex的bundle包疾就,同時(shí)被打包到ContainApp的包的Pluglns的目錄下。

    824DCA63-95E5-41B1-A70D-64B1E2449D8B.png

  • 使用Tree命令艺蝴,看看.appex的bundle包的內(nèi)容:

    419D7EDD-A72C-4020-9947-BB3CA2A9CDF6.png

3猬腰、調(diào)試

網(wǎng)上內(nèi)容也很多,主要是以下幾步:

  • 擴(kuò)展Target和主工程Target必須配置不同的證書猜敢,且主工程開啟推送功能姑荷。

  • 編譯的目標(biāo)順序
    1、主工程編譯锣枝,真機(jī)運(yùn)行厢拭。
    2兰英、擴(kuò)展Target編譯運(yùn)行撇叁,選擇主工程App,Attachment連接啟動畦贸。
    3陨闹、模擬推送一波,UNNotificationServiceExtension的擴(kuò)展之類薄坏,斷點(diǎn)即可執(zhí)行趋厉。

調(diào)試一些問題
  • 推送格式錯(cuò)誤,具體參見上面格式要求胶坠。
  • 對于舊工程君账,后續(xù)接入者莫名其妙的無法調(diào)試,可以重新刪掉Target沈善,重建一個(gè)名字一樣的擴(kuò)展乡数。

4、打包&提審

上面可知闻牡,擴(kuò)展的Target是通過依賴主工程Target的方式一同編譯打包的净赴,因此后續(xù)打包提審的時(shí)候只要對應(yīng)的配置好證書,打包主工程App罩润,然后提審就行玖翅。


47ACD5CC-88CD-4645-83EA-A857556C93A7.png

As with any target, an extension target specifies settings and files that combine to build a product within your app project.
Each template includes extension point–specific implementation files and settings, and produces a separate binary that gets added to your containing app’s bundle.

注意:打包導(dǎo)出的時(shí)候,需要同時(shí)勾選主Target和擴(kuò)展Target的對應(yīng)證書割以。


9CE6BFF5-D922-4CDB-9979-C464CB585B99.png

四金度、帶圖片的推送需求實(shí)現(xiàn)

”帶圖片的推送“需求具體實(shí)現(xiàn),主要是把圖片自行下載严沥,然后保存审姓,添加到對應(yīng)的類中屬性即可。

UNNotificationAttachment *resourceAttachment =
[UNNotificationAttachment attachmentWithIdentifier:@"photo" URL:obj options:nil error:&attachmentErrer];
if (resourceAttachment && !attachmentErrer) {
    strongSelf.bestAttemptContent.attachments = @[resourceAttachment];
}

本文不再累贅祝峻,參見iOS10推送必看UNNotificationServiceExtension魔吐,或者自行百度扎筒。

五、UNNotificationServiceExtension 其他

  • 與主工程代碼復(fù)用酬姆,同AppExtension嗜桌。
  • 與主工程的數(shù)據(jù)共享,同AppExtension辞色。

具體見AppExtension:擴(kuò)展的學(xué)習(xí)筆記


參考

官網(wǎng)-UNNotificationServiceExtension
官網(wǎng)-Modifying Content in Newly Delivered Notifications

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
禁止轉(zhuǎn)載,如需轉(zhuǎn)載請通過簡信或評論聯(lián)系作者相满。
  • 序言:七十年代末立美,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子碌更,更是在濱河造成了極大的恐慌洞慎,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,122評論 6 505
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件旭绒,死亡現(xiàn)場離奇詭異焦人,居然都是意外死亡垃瞧,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,070評論 3 395
  • 文/潘曉璐 我一進(jìn)店門脉幢,熙熙樓的掌柜王于貴愁眉苦臉地迎上來嗦锐,“玉大人,你說我怎么就攤上這事奕污√寄” “怎么了缘眶?”我有些...
    開封第一講書人閱讀 164,491評論 0 354
  • 文/不壞的土叔 我叫張陵髓废,是天一觀的道長。 經(jīng)常有香客問我顶燕,道長冈爹,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,636評論 1 293
  • 正文 為了忘掉前任恳谎,我火速辦了婚禮惠爽,結(jié)果婚禮上瞬哼,老公的妹妹穿的比我還像新娘租副。我一直安慰自己,他們只是感情好结胀,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,676評論 6 392
  • 文/花漫 我一把揭開白布责循。 她就那樣靜靜地躺著院仿,像睡著了一般。 火紅的嫁衣襯著肌膚如雪歹垫。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,541評論 1 305
  • 那天吭敢,我揣著相機(jī)與錄音鹿驼,去河邊找鬼。 笑死畜晰,一個(gè)胖子當(dāng)著我的面吹牛舷蟀,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播野宜,決...
    沈念sama閱讀 40,292評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼匈子,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了游岳?” 一聲冷哼從身側(cè)響起其徙,我...
    開封第一講書人閱讀 39,211評論 0 276
  • 序言:老撾萬榮一對情侶失蹤唾那,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后闹获,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體避诽,經(jīng)...
    沈念sama閱讀 45,655評論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,846評論 3 336
  • 正文 我和宋清朗相戀三年鲤妥,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了旭斥。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片古涧。...
    茶點(diǎn)故事閱讀 39,965評論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖菇爪,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情熙揍,我是刑警寧澤氏涩,帶...
    沈念sama閱讀 35,684評論 5 347
  • 正文 年R本政府宣布是尖,位于F島的核電站,受9級特大地震影響蛔添,放射性物質(zhì)發(fā)生泄漏兜辞。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,295評論 3 329
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望胁塞。 院中可真熱鬧压语,春花似錦、人聲如沸扰才。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,894評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至柄延,卻和暖如春缀程,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背摆昧。 一陣腳步聲響...
    開封第一講書人閱讀 33,012評論 1 269
  • 我被黑心中介騙來泰國打工绅你, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留昭躺,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,126評論 3 370
  • 正文 我出身青樓窍仰,卻偏偏與公主長得像,于是被迫代替她去往敵國和親针史。 傳聞我的和親對象是個(gè)殘疾皇子碟狞,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,914評論 2 355

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