1. 程式人生 > >iOS 極光推送開發環境可以收到,生產環境收不到推送

iOS 極光推送開發環境可以收到,生產環境收不到推送

極光推送開發環境可以收到,生產環境收不到推送

首先闡述一下我遇到的問題

我們專案連通了極光推送,以前寫過的專案也是這樣 在開發環境下測試 好使了 但是打包ADHoc時候 就不好使了,當時也沒在意 因為網上好多人說 只要測試好使了 證書顯示配置成功了(綠燈) 那就沒問題了

so 上線 然後上線以後 發現推送功能完全不好使!這就尷尬了 趕緊下架

因為我們專案使用的是別名推送

使用極光網站推送時候 我使用了廣播,別名推送,regID推送,結果 都能收到(開發環境)

然後我在生產環境 再次傳送 廣播,別名,regID

結果 很顯然 別名收不到 這就糾結了 開始檢視問題吧

經過兩天的爬坑,終於找到了問題所在 也正在積極解決

在這裡再次感謝極光官方兩位大牛,如果沒有你們的幫忙 我想我還會糾結好久 Lris12 Helperhaps

好了 廢話少說 闡述問題跟程式碼

————————我是分割線———————————

初次發現這個問題的時候 首先排查的就是證書配置

這裡再次建議大家好好仔細的看看開發文件,因為很多錯誤都是細節處不注意造成的,附上開發文件地址

因為這個專案是接手別人已經做得差不多的 我就負責收尾 所以 證書這方面我會優先檢視 是否錯誤,

在developer.apple.com 中 我已經看到
這裡寫圖片描述
很明顯 開發環境的證書跟生產環境的證書 都已經配置完成,

那麼證書是沒有問題的 下面我們看看極光官網的配置
這裡寫圖片描述
也是已驗證,

這就奇怪了 到這 我表示 可能是程式碼出錯了 好吧 我們來看程式碼。
這裡寫圖片描述
別名設定 相信在官方文件中大家都明白怎麼寫

反覆檢視文件 我發現並沒有任何問題這麼寫。

經過跟 Lris12 大神的交流

覺得很可能是因為網路原因 在註冊極光還沒有返回成功的時候 就繫結別名 導致 regID跟別名沒有繫結成功

解決方法:
新增5個監聽,在監聽到extern NSString * const kJPFNetworkDidLoginNotification; // 登入成功
之後再設定別名

這裡寫圖片描述

Ps。這裡強烈建議這麼寫,安全第一 安全第一!!!!

這裡附上程式碼:

- (void)application:(UIApplication *)application didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken

{

NSNotificationCenter *defaultCenter = [NSNotificationCenter defaultCenter];

[defaultCenter addObserver:self selector:@selector(networkDidReceiveMessage:) name:kJPFNetworkDidLoginNotification object:nil];

[JPUSHService registerDeviceToken:deviceToken];

}

//通知方法

- (void)networkDidReceiveMessage:(NSNotification *)notification {

[JPUSHService setTags:nil aliasInbackground:[OpenUDID value]];

dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(1.0f * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{

[JPUSHService setTags:nil alias:[OpenUDID value] fetchCompletionHandle:^(int iResCode, NSSet *iTags, NSString *iAlias)

{

}];

});

//銷燬通知:

[[NSNotificationCenter defaultCenter] removeObserver:self name:kJPFNetworkDidLoginNotification object:nil];

}

然而 問題依舊沒有解決,但是這個時候 我們登入極光官網推送

我在生產環境 再次傳送 廣播,別名,regID

結果 都收到了!!

正當我高興的時候 發現 api推送依舊收不到!!收不到!!

絕望!!

繼續排查

按照開發文件 設定xcode配置, 嗯 依舊沒用

這裡我重點說一下 :iOS9 之後 解除安裝重灌後會改變token,所以registrationID會改變,如果你沒有用到idfa

如果你的專案使用的是regID推送 那麼你要注意 每次更新app 新使用者下載app 重新下載app等一系列狀況下 regID改變的問題

還有如果註冊成功後 會返回 設定成功,有callback為0

這個也要注意下

好 迴歸正題,

這時候時間已經過去一天半了, 最後我覺得 我所有的程式碼 配置 證書 環境 都沒有問題!

再去極光官網看看 到底咋回事

好嗎 這一看 終於發現了問題所在!
這裡寫圖片描述
這裡寫圖片描述
大家看沒看到 這裡寫的是 推送平臺 iOS-dev?

臥槽!!後臺給我推送的居然是 開發環境!!

果斷找後臺理論!!!

Lris大神告訴我

「釋出版本後無法有效推送」 or 「生產環境下收不到訊息」 按以下步驟排查問題: 客戶端 客戶端是否打包證書 檢查當前環境是否正確 裝置裡面的手機應用有沒有 新增/配置 這個tag/ 別名 服務端注意改變環境引數,option的apns_production的值(true:生產)(false開發)。根據客戶端環境改變服務端推送環境。環境要一致才能收到推送。

然後我們後臺給我傳送了一段程式碼 堵住了我的嘴:

$platform = 'android,ios' ;

$msg_content = json_encode(array('n_builder_id'=>0, 'n_title'=>$n_title, 'n_content'=>$n_content,'content-available'=>1,'apns_production'=>1));

$obj = new jpush($masterSecret,$appkeys);

我標紅的位置 人家已經設定了1 為什麼還不好用?

經過Helperhaps 大神的解釋 好吧 我懂了

我們後臺使用的 過期的V2 api

特別提示:建議不要在客戶端裡寫程式碼直接呼叫此 API。因為 Android apk 比較容易破解,別人很容易從客戶端程式碼裡找出來呼叫 JPush Remote API 所需要的保密資訊,從而可以模擬到你的身份來發起惡意的推送。

建議的使用方式是:呼叫 JPush Remote API 的程式碼放在你自己的應用伺服器上。你自己的應用伺服器對自己的客戶端提供介面來推送訊息。具體請參考推聊的作法:示例與程式碼。

升級到 v3 Push API:建議開發者升級到 v3 版本。此版本會繼續支援到 2015 年。

至此 這個問題才算是解決(至少對前端來說)

第一次發這樣的帖子感覺有點亂 嗯。。。

下次大家在推送上有問題的話。。先看開發文件走一遍流程 然後看看極光個人推送 廣播能否收到 然後就可以考慮跟服務端幹一仗了!!

最後祝大家 永無BUG!!!!!!!!!!!!!