Xcode8開發(fā)iOS10推送通知過程

iOS10發(fā)布后输虱,簡書優(yōu)先開發(fā)增加了iOS10的新通知希痴。本文分享整個feature的開發(fā)過程遇到的問題际跪。

1躏敢、工程配置

Xcode8發(fā)生了很大的變化闷愤,直接打開原來的工程編譯運行,這個時候是獲取不到Push token的件余,打印didFailToRegisterForRemoteNotificationsWithError中的error可以看到

fail to register with error Error Domain=NSCocoaErrorDomain Code=3000 
"no valid 'aps-environment' entitlement string found for application" 
UserInfo={NSLocalizedDescription=no valid 'aps-environment' 
entitlement string found for application}

Google了解到是Xcode8的變化讥脐,entitlements由本地的entitlements文件配置,主Target的Capabilities下啼器,Push Notification處于關(guān)閉的狀態(tài)旬渠,必須手動打開。

Capabilities

2端壳、Code Sign

工程增加了Notification ContentNotification Service兩個Extension告丢,Signing默認(rèn)是自動模式.。

Signing

據(jù)網(wǎng)上介紹Xcode8簽名管理方式比Xcode7更智能损谦,那我就試一下吧岖免。選完Team它就自動生成了授權(quán)文件。然而照捡,Xcode8還幫我生成了一個新的證書颅湘,相當(dāng)于增加了一個開發(fā)人員,也就是我現(xiàn)在的證書不在原來的授權(quán)文件中栗精,后果就是原來手動配置的授權(quán)文件要重新生成闯参。
Certificates

這時候如果想使用原始的手動配置瞻鹏,不僅要把Automatically manage signing去掉,還要在Key Chains里把新生成的證書刪掉鹿寨,然后在Web端生成授權(quán)文件新博。使用Automatically manage signing最好把每個Target都使用相同的方式。

3释移、Swift版本

如果你在創(chuàng)建Target的時候開發(fā)語言選了Swift叭披,默認(rèn)是使用Swift3.0,Xcode8同時支持3.0和2.3玩讳,可能你還沒來及掌握3.0的API變化涩蜘,想繼續(xù)使用2.3的API,只要在對應(yīng)Target的Build SettingUse Legacy Swift Language Version設(shè)為YES就可以繼續(xù)使用2.3熏纯。

4同诫、Architectures

工程配好之后,只有模板代碼樟澜,先跑起來寫個Hello World再說误窖。Command+R之后,編譯報錯了

Check dependencies
No architectures to compile for (ONLY_ACTIVE_ARCH=YES, active arch=x86_64, VALID_ARCHS=i386).

VALID_ARCHS中沒有對應(yīng)的active arch
這時需要在對應(yīng)Target的Build SettingValid Architectures中增加arm64

Architectures

5秩贰、Notification Service

接下來霹俺,開始代碼編寫了,大部分是參考喵神的這篇文章活久見的重構(gòu) - iOS 10 UserNotifications 框架解析Demo毒费、還有WWDC 708 Advanced Notifications丙唧、PDF
在service中觅玻,我們會把后端push過來的數(shù)據(jù)中的圖片下載到本地文件夾想际,然后作為attachments。
之前我們的推送都只顯示一句alert溪厘,不過推送的json數(shù)據(jù)alert字段可以是string胡本,也可以是dictionary,如果是string畸悬,相當(dāng)于dictionary中的body侧甫,在iOS8.2之后dictionary可以增加titlesubtitle等蹋宦。為了讓推送更豐富闺骚,我們想把原來的body變成title,增加文章摘要放到body里妆档,如果直接改aps內(nèi)的alert,那么8.2以前的設(shè)備推送顯示的是文章摘要了虫碉。后來我們想了一個辦法贾惦,Notification Service不是可以修改推送內(nèi)容嗎?apsalert還是保持不變,json增加一個新的titlebody须板,Service收到通知之后把json中的titlebody取出來賦給bestAttemptContenttitlebody碰镜。

{
  "aps":{ 
        "alert":"test test",
        "mutable-content":1 
  }, 
  "title": "new title",
  "body": "new body"
}

6、Notification Content

如果通知有attachments习瑰,默認(rèn)情況下長按通知會顯示圖片或視頻绪颖,但是我們覺得顯示那么大一個圖片不美觀,而且要有action button甜奄,就是下面這種效果柠横,所以要用到Notification Content

效果

其實這里沒有自定義通知的UI课兄,而是直接把這個View隱藏了牍氛。Info.plistUNNotificationExtensionInitialContentSizeRatio表示view的初始height/width(其他屬性參考WWDC),把它設(shè)為0.001(不能設(shè)為0)烟阐,在viewDidload中設(shè)置self.preferredContentSize = CGSizeZero;來隱藏view搬俊。
Info.plist

這個Extension可以響應(yīng)多個category,而每個category可以注冊自己的action buttons蜒茄,所以action buttons和customUI view是相互獨立的唉擂,不過可以通過action buttons更新customUI view。
Action buttons默認(rèn)的行為會打開APP檀葛,由delegate處理響應(yīng)玩祟,使用了Notification Content后,我們可以在Notification Content直接處理響應(yīng)而不用打開APP驻谆,也可以forward打開APP由delegate處理卵凑。

5、真機調(diào)試

代碼寫得差不多了胜臊,那就開始調(diào)試了勺卢。Extension調(diào)試過程中有時會遇到Could not attach to process ID <ID number>錯誤。

Could not attach to process ID

有時重啟Xcode能解決象对,有時不能解決黑忱,這時候有一個方法,這個窗口彈出之后點OK勒魔,接著點Debug > Attach to Process > 你的Extension甫煞,這時候就能捕獲斷點了。

6冠绢、提交TestFlight

測試過了準(zhǔn)備提交TestFlight抚吠,結(jié)果校驗出錯了。

Application Loader

錯誤信息很明顯弟胀,Extension.appex中包含了Frameworks文件夾楷力。如果Extension使用了Cocoapods喊式,Cocoapods會創(chuàng)建這個文件夾,實際沒什么用萧朝。解決辦法就是在Build Phases最后增加一個Build Phase岔留,執(zhí)行一段shell腳本把Frameworks文件夾刪掉。

cd "${CONFIGURATION_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/"
if [[ -d "Frameworks" ]]; then
rm -fr Frameworks
fi
Build Phase

簡書每個版本都會進(jìn)行公測 公測詳情检柬,歡迎想要搶鮮的用戶前往下載體驗献联。

7、寫在最后

簡書作為一個優(yōu)質(zhì)原創(chuàng)內(nèi)容社區(qū)何址,擁有大量優(yōu)質(zhì)原創(chuàng)內(nèi)容里逆,提供了極佳的閱讀和書寫體驗,吸引了大量文字愛好者和程序員头朱。簡書技術(shù)團(tuán)隊在這里分享技術(shù)心得體會运悲,是希望拋磚引玉,吸引更多的程序員大神來簡書記錄项钮、分享班眯、交流自己的心得體會。這個專題以后會不定期更新簡書技術(shù)團(tuán)隊的文章烁巫,包括Android署隘、iOS、前端亚隙、后端等等磁餐,歡迎大家關(guān)注。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末阿弃,一起剝皮案震驚了整個濱河市诊霹,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌渣淳,老刑警劉巖脾还,帶你破解...
    沈念sama閱讀 206,839評論 6 482
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異入愧,居然都是意外死亡鄙漏,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,543評論 2 382
  • 文/潘曉璐 我一進(jìn)店門棺蛛,熙熙樓的掌柜王于貴愁眉苦臉地迎上來怔蚌,“玉大人,你說我怎么就攤上這事旁赊¤胗唬” “怎么了?”我有些...
    開封第一講書人閱讀 153,116評論 0 344
  • 文/不壞的土叔 我叫張陵终畅,是天一觀的道長钞钙。 經(jīng)常有香客問我鳄橘,道長,這世上最難降的妖魔是什么芒炼? 我笑而不...
    開封第一講書人閱讀 55,371評論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮术徊,結(jié)果婚禮上本刽,老公的妹妹穿的比我還像新娘。我一直安慰自己赠涮,他們只是感情好子寓,可當(dāng)我...
    茶點故事閱讀 64,384評論 5 374
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著笋除,像睡著了一般斜友。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上垃它,一...
    開封第一講書人閱讀 49,111評論 1 285
  • 那天鲜屏,我揣著相機與錄音,去河邊找鬼国拇。 笑死洛史,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的酱吝。 我是一名探鬼主播也殖,決...
    沈念sama閱讀 38,416評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼务热!你這毒婦竟也來了忆嗜?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,053評論 0 259
  • 序言:老撾萬榮一對情侶失蹤崎岂,失蹤者是張志新(化名)和其女友劉穎捆毫,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體该镣,經(jīng)...
    沈念sama閱讀 43,558評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡冻璃,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,007評論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了损合。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片省艳。...
    茶點故事閱讀 38,117評論 1 334
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖嫁审,靈堂內(nèi)的尸體忽然破棺而出跋炕,到底是詐尸還是另有隱情,我是刑警寧澤律适,帶...
    沈念sama閱讀 33,756評論 4 324
  • 正文 年R本政府宣布辐烂,位于F島的核電站遏插,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏纠修。R本人自食惡果不足惜胳嘲,卻給世界環(huán)境...
    茶點故事閱讀 39,324評論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望扣草。 院中可真熱鬧了牛,春花似錦、人聲如沸辰妙。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,315評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽密浑。三九已至蛙婴,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間尔破,已是汗流浹背街图。 一陣腳步聲響...
    開封第一講書人閱讀 31,539評論 1 262
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留呆瞻,地道東北人台夺。 一個月前我還...
    沈念sama閱讀 45,578評論 2 355
  • 正文 我出身青樓,卻偏偏與公主長得像痴脾,于是被迫代替她去往敵國和親颤介。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 42,877評論 2 345

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