關于推送,要說好像也沒太多東西,但要細說,又是有很多可以說。如何配置,今天就不說了,各個平臺不一樣,每個平臺都會有自己的配置文檔,像友盟的,看它的官方文檔就行。今天主要說一下接收跟一些業(yè)務邏輯。留個記錄,方便自己以后查閱。蘋果官方文檔通知部分
1.數(shù)據(jù)格式
可能有很多人都沒注意到這一點,蘋果推送通知的格式是固定的,甚至還規(guī)定了特定字段的數(shù)據(jù)格式,如下是一般APP接收到的推送的數(shù)據(jù)格式,其中alert字段下的數(shù)據(jù),是直接顯示在設備通知欄的,iOS開發(fā)者并不能像安卓那樣,先讀取到數(shù)據(jù),再處理選擇性展示,所以title,body等字段的數(shù)據(jù)格式,都是規(guī)定死。開發(fā)者如果需要更多的數(shù)據(jù),一般都是放payload字段下,或者自定義的key,如gameID等。如有敏感數(shù)據(jù),最好加密傳輸。
{
“aps” : {
“alert” : {//APP直接展示的內(nèi)容
“title” : “Game Request”,
“subtitle” : “Five Card Draw”
“body” : “Bob wants to play poker”,
“title-loc-key” : “國際化多語言用到的字段”,
“title-loc-args” : “國際化,用以替換本地string文件的內(nèi)容”,
“mutable-content” : “判斷是否富文本推送的標志”,
},
“category” : “GAME_INVITATION”//標志通知樣式
},
“gameID” : “12345678”
“payload” :“服務器給APP的數(shù)據(jù)”
}
具體各個字段的數(shù)據(jù)格式,可以看官方文檔,這里貼出一部分

以上便是一般推送通知所需注意的,本來想寫的挺多的,后來看了一天官方文檔,不知道要寫些什么了,先放一個前人的連接,總結(jié)的較為詳細關于推送的文章。
2.富文本推送通知
這個,上面那篇文章也有說到,我這里記一下自己的總結(jié)。富文本,就是大家平時看到的在通知欄顯示圖片,播放視頻,甚至可以玩小游戲 widget game。富文本推送通知,主要是用到兩個擴展類,NotificationContentExtension, NotificationServiceExtension。

關于這兩個擴展類,網(wǎng)上也有很多資料,這里就不再贅述,可自行搜索一下,我主要記一下我覺得比較關鍵的點。
富文本,主要用的在推送消息里的兩個key,category ,mutable-content,
- category,用來標志通知類型,你可以添加多個擴展類以展示不同類型的通知,從而配置不同UI,代碼中,就是用category去區(qū)分選擇用哪一個擴展類去展示;
- mutable-content,只有當mutable-content為1時,NotificationServiceExtension才能成功攔截消息;
補一句,多看官方文檔。
3.點擊推送消息后的頁面跳轉(zhuǎn)
這里要分3種情況
- APP在前臺或APP在后臺但已啟動
- (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo;
此時消息處理,頁面跳轉(zhuǎn)等邏輯就可以在這里處理
- APP在后臺且未啟動
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions;
此時通知的內(nèi)容為,UIApplicationLaunchOptionsRemoteNotificationKey
NSDictionary *pushNotification = [launchOptions objectForKey:UIApplicationLaunchOptionsRemoteNotificationKey];
注意當用戶之間點擊APP圖標進入APP時,pushNotification為nil,也就獲取不到推送消息的內(nèi)容了,只有用戶點擊推送消息進入APP,才能獲取推送內(nèi)容。且,此時程序還是會跑"didReceiveRemoteNotification"方法的。按道理這時候??(他人的結(jié)論)
這個時候會走didReceiveRemoteNotification這些的方法(有很多人認為不會走,經(jīng)過測試這個是會走的),但是這這里面寫跳轉(zhuǎn)什么的 ,就有點比較難處理了,因為didFinishLaunchingWithOptions這個方法沒有走,先走的didReceiveRemoteNotification再走的 didFinishLaunchingWithOptions 。這時候很多app的基本設置,比如做的跟視圖,自動登陸,等等很多的注冊什么的都還沒執(zhí)行,就直接跳轉(zhuǎn)這個是很麻煩的處理起來,所以一般是在“ didFinishLaunchingWithOptions”方法下去處理頁面跳轉(zhuǎn)邏輯
但是我也試過不在“ didFinishLaunchingWithOptions”做任何處理,直接都是在“didFinishLaunchingWithOptions”處理,APP也是能完美運行。如果有遇到不能直接在“didFinishLaunchingWithOptions”處理的,可以留個評論,有知道的大神也麻煩告知一下,謝謝了。
以上,簡單的總結(jié)。不全面,有錯誤煩請指正。