寫在前面:
最近公司的項目需要集成遠程推送溪椎,由于人事變動氛改,以及公司以前沒把推送重視起來稍刀,導(dǎo)致推送的代碼已經(jīng)年久失修了撩独,根本不能用了, 公司甚至把極光推送的賬號都給忘記了账月。開始本著能修改好就修改好, 不要大動综膀,可是修改了一天卻發(fā)現(xiàn)sdk已經(jīng)很老了, 很多方法都不能用了局齿,更新sdk后各種問題, 最后一咬牙剧劝,干脆把極光推送全部從工程中移除。重新集成抓歼。
極光推送的文檔寫的還是比較詳細的讥此,而且只有一個.a文件和一個點.h文件拢锹,你可以用cocoapod集成, 也可以直接拉到工程里萄喳, 都是很方便的卒稳。也有相應(yīng)的視頻教程, 對于集成極光推送而言(指的是能收到推送)他巨, 除了生成推送證書比較麻煩之外展哭,其他的都很簡單。 詳細教程可以參考極光推送官方文檔和視頻介紹闻蛀。
http://docs.jiguang.cn極光推送官方文檔
在本篇文章里我主要介紹下自定義消息和APNs消息的使用匪傍,如何在進程被殺掉的情況下獲取推送內(nèi)容。
準備資料
極光推送SDK Version:v2.1.9 (最新的, 兼容iOS10)
APP Version:8.0
使用場景
在使用app的時候觉痛,肯定有很多用戶都會雙擊Home鍵役衡, 然后劃掉進程或者你按下Home鍵, 退到后臺薪棒, 假如有一天時間沒有使用手蝎, 這兩種情況也都可以收到推送(好像說的是廢話一樣),但是俐芯,這時如果你收到推送棵介, 而且收到的不只是一條推送。此時你點擊推送過來的橫幅吧史,或者通知欄的橫幅邮辽,此時會走?
- (void)application:(UIApplication *)application didReceiveLocalNotification:(UILocalNotification *)notification{} 方法
你此時只能獲取你點擊的這一條的推送的內(nèi)容。 那么問題來了贸营, 如果用戶此時不點擊推送的內(nèi)容吨述, 而是直接點擊icon啟動程序, 根本不會走
- (void)application:(UIApplication *)application didReceiveLocalNotification:(UILocalNotification *)notification{}方法,?
你也獲取不到推送的內(nèi)容. 在這種情況下揣云,極光的自定義消息就派上用場了冰啃。
自定義消息和APNs的區(qū)別:
極光的自定義消息是應(yīng)用程序必須是在前臺的狀態(tài)下,才會收到阎毅, 如果處于后臺焚刚, 極光會把此條消息保存為離線消息(離線的時長是可以設(shè)置的,這個由后臺來設(shè)置)净薛,等你回到前臺時,才會收到自定義消息。自定義消息是不會有推送的橫幅效果雌团。
APNs消息, 只有退到后臺士聪,才會有推送的橫幅效果锦援,如果你在前臺, 也能收到消息,但是不會有橫幅的效果剥悟。
實現(xiàn)思路:
對于一條推送区岗,讓后臺進行自定義消息和APNs消息同時推送 (對于客戶端而言,這是兩條消息(APNs消息和自定義消息)叮称,但是對于服務(wù)端而言這是一條消息(如果后臺告訴你藐鹤,不能做瓤檐, 那肯定是不想麻煩娱节, 因為安卓使用遠程推送消息,在iOS這邊叫APNs消息是完全可以實現(xiàn)所有需求的谴古, 但是由于iOS系統(tǒng)本身的局限性悄窃,我們無法實現(xiàn)),自定義消息和APNs消息擁有同一個_j_msgid)轧抗,此時你需要使用APNs消息來進行橫幅彈窗瞬测, 當用戶點擊某個橫幅時月趟, 對該條消息下進行處理。使用自定義消息類進行數(shù)據(jù)本地化孝宗。
要在- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions里面進行通知注冊
由于極光推送的自定義消息和APNs消息的數(shù)據(jù)格式是不一樣的因妇,需要分別處理猿诸。
對于極光推送的文章介紹也有很多了梳虽,都比較詳細, 但是對于我遇到的這個問題窜觉,找了好久才找到解決方案, 所以記錄下來, 分享一下,也許可以幫助其他遇到此問題的人北专。 文章主要介紹了使用自定義消息進行數(shù)據(jù)持久化的解決思路, 如果你有其它的見解或者文章有錯誤的地方特咆,歡迎留言斧正录粱。
補充: iOS 10以上的系統(tǒng), 當App在前臺時, 收到APNs通知時也會彈出一個橫幅
iOS 10 原生版本
```
@protocol UNUserNotificationCenterDelegate@optional
//在前臺獲取通知
- (void)userNotificationCenter:(UNUserNotificationCenter *)center willPresentNotification:(UNNotification *)notification withCompletionHandler:(void (^)(UNNotificationPresentationOptions options))completionHandler;
//點擊通知進入
- (void)userNotificationCenter:(UNUserNotificationCenter *)center didReceiveNotificationResponse:(UNNotificationResponse *)response withCompletionHandler:(void(^)())completionHandler ;
@end
```
極光推送版本
```
@protocol JPUSHRegisterDelegate/*
* @brief handle UserNotifications.framework [willPresentNotification:withCompletionHandler:]
* @param center [UNUserNotificationCenter currentNotificationCenter] 新特性用戶通知中心
* @param notification 前臺得到的的通知對象
* @param completionHandler 該callback中的options 請使用UNNotificationPresentationOptions
*/
- (void)jpushNotificationCenter:(UNUserNotificationCenter *)center willPresentNotification:(UNNotification *)notification withCompletionHandler:(void (^)(NSInteger options))completionHandler;
/*
* @brief handle UserNotifications.framework [didReceiveNotificationResponse:withCompletionHandler:]
* @param center [UNUserNotificationCenter currentNotificationCenter] 新特性用戶通知中心
* @param response 通知響應(yīng)對象
* @param completionHandler
*/
- (void)jpushNotificationCenter:(UNUserNotificationCenter *)center didReceiveNotificationResponse:(UNNotificationResponse *)response withCompletionHandler:(void(^)())completionHandler;
@end
```
注意:
這個方法在iOS 10 以后被廢棄了
這個方法是iOS 7才有的, 按照目前的市場來看, 上面的那個方法完全可以廢棄, 直接使用下面這個方法來接收通知
坑: iOS 11以前, 當App在前臺的時候, 會走下面??這個方法, 點金通知欄的通知進入, 也會走下面這個方法.?
但是在iOS 11 的情況下, 當手機在前臺時, 接收到通知下面這個方法不會執(zhí)行(已被坑吐血了), ?只有點擊通知欄的通知時, 才會執(zhí)行, 所以, 如果要在這個方法里面做跳轉(zhuǎn)的操作, 這里需要判斷一下版本.
if UIApplication.shared.applicationState == .inactive {
//跳轉(zhuǎn)
}else if (UIApplication.shared.applicationState == .active) {
if #available(iOS 11.0, *) {
//跳轉(zhuǎn)
}
}