前言
最近在做類似微信公眾號消息的功能哄芜,由于我們的即時(shí)聊天是集成了環(huán)信诗轻,環(huán)信在群推上有欠缺,于是后端的小伙伴決定用極光完成公眾號消息的推送个榕。這就尷尬了篡石,即時(shí)聊天以及UI集成了環(huán)信,消息推送用的極光西采。
過程
極光推送凰萨,只是對蘋果官方推送(apns)的進(jìn)一步封裝,實(shí)際上也是走apns械馆。
首先說下app的狀態(tài)胖眷,詳情可參考 這篇文章:
Not running:
應(yīng)用還沒有啟動(dòng),或者應(yīng)用正在運(yùn)行但是途中被系統(tǒng)停止霹崎。
** Inactive:
當(dāng)前應(yīng)用正在前臺運(yùn)行珊搀,但是并不接收事件,Inactive一般是Active與其他狀態(tài)切換的過渡狀態(tài)尾菇,一般很短境析,故做消息推送時(shí)我是忽略的。
** Active:
當(dāng)前應(yīng)用正在前臺運(yùn)行派诬,并且接收事件劳淆。
Background:
應(yīng)用處在后臺,并且還在執(zhí)行代碼默赂。應(yīng)用進(jìn)入后臺后沛鸵,會(huì)短暫停留在此狀態(tài),大概十分鐘后會(huì)進(jìn)入Suspended狀態(tài)。
** Suspended**:
應(yīng)用處在后臺曲掰,并且已停止執(zhí)行代碼疾捍。
在Not running狀態(tài)下收到apns,點(diǎn)擊通知欄進(jìn)入程序栏妖,會(huì)調(diào)用-(void)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary*) launchOptions
這個(gè)方法乱豆,并且會(huì)把通知消息的數(shù)據(jù)放在launchOptions里;而點(diǎn)擊應(yīng)用圖標(biāo)進(jìn)入程序雖然也調(diào)用上面方法吊趾,但并不會(huì)傳遞消息數(shù)據(jù)咙鞍,launchOptions為空。
在** Active**狀態(tài)下趾徽,收到推送會(huì)調(diào)用
-(void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo
或 者 -(void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo fetchCompletionHandler:(void (^)(UIBackgroundFetchResult))completionHandler
,消息數(shù)據(jù)在userInfo中续滋;
在Background狀態(tài)下,可參照極光這篇文檔
開啟Remote notifications孵奶,并在推送消息中附加content-available:true 的字段疲酌,收到消息時(shí)便會(huì)調(diào)用
-(void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo fetchCompletionHandler:(void (^)(UIBackgroundFetchResult))completionHa
,雖然官方文檔只說了在上面這個(gè)方法調(diào)用,經(jīng)實(shí)測也會(huì)調(diào)用-(void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)user
當(dāng)然iOS 7后的最好用didReceiveRemoteNotification:fetchCompletion Handler:
,畢竟是蘋果官方推薦用的了袁。
在** Suspended狀態(tài)下朗恳,收到apns,系統(tǒng)會(huì)暫時(shí)將app切換回 Background狀態(tài)载绿,給用戶大概幾分鐘時(shí)間處理相關(guān)數(shù)據(jù)粥诫,同樣走上述Background**狀態(tài)流程。
針對我們這個(gè)公眾號的需求崭庸,應(yīng)用處于前臺和后臺的情況下怀浆,都可以滿足,但是在應(yīng)用未打開的情況下怕享,直接打開應(yīng)用圖標(biāo)無法獲取推送消息执赡,點(diǎn)擊通知欄,也只能通過launchOptions獲取被點(diǎn)擊的那個(gè)消息函筋;而且應(yīng)用長期處于后臺沙合,當(dāng)系統(tǒng)內(nèi)存吃緊時(shí),系統(tǒng)會(huì)把應(yīng)用殺掉跌帐。所以針對這種情況首懈,最好在app啟動(dòng)時(shí)調(diào)接口檢查是否有離線消息,這樣就不會(huì)有消息遺漏了谨敛。
另外究履,還有一點(diǎn)要補(bǔ)充,遠(yuǎn)程推送消息一般有兩種佣盒,分別是通知消息和自定義消息挎袜,自定義消息是只能在前臺收到的顽聂,只有通知消息才能前后臺都能收到肥惭。
結(jié)束
學(xué)習(xí)之路盯仪,與君共勉。