本文由信鴿工程師uwei提供。javascript
本文針對iOS推送接入過程當中遇到的一個實際案例,提出了iOS推送排查問題的思路,在解決該問題的基礎上,更給出了通用的iOS推送自測的檢查路徑。
文末提供了一種基於騰訊移動推送(信鴿)的自測工具,歡迎試用與反饋。前端
對於互聯網APP的產品運營來講,因爲咱們的用戶是不可見的,有時候甚至是在身邊的陌生人就在用咱們的產品,可是咱們卻有一種近在眼前,遠在天邊的感受, 物理上的隔離成爲了天生的屏障,特別是當產品須要作一個線上有時效性的活動的時候,咱們是多麼但願用戶都坐在咱們面前,以便咱們能夠隨時通知到關於活動的事情。而互聯網的運營人員的手段方法多種多樣,可是消息推送一直絕對是產品運營的一個必須且重要的手段,消息推送讓咱們的用戶與咱們之間擺脫了看不見摸不着的尷尬局面。無論咱們的用戶在哪裏,只要他們聯網,消息推送能拉近用戶與咱們之間的距離,即便遠在天邊,可是秒級觸達,感受好像盡在身邊。java
能夠說,如今的APP們,90%都有推送的剛需。而市面上如今已經有不少的第三方推送工具,集成第三方推送工具無疑是一件相對輕鬆的任務。
但不正確的集成姿式,或者某些錯誤的配置,經常會致使推送沒法正常使用。
好比,
1.Xcode開發環境中關於推送的配置不正確
2.推送證書設置錯誤或者是證書過時失效ios
那麼,集成推送須要注意些什麼?
集成以後,怎樣確認本身是否正確集成了遠程消息推送呢?服務器
相信iOS開發的同窗對下圖來講是比較眼熟的:網絡
以上圖片就是Xcode不一樣版本中關於推送的配置是不一樣的,表現如上,可是不一樣點具體在哪兒呢?app
使用Xcode7.3以上版本打包app,導出iPA(這是一個壓縮的文件夾),在mac系統中,鼠標右鍵,使用系統自帶Archive Utility工具解開,在進入app所在的Payload文件夾,選擇app,點擊右鍵,選擇Show Package Contents,進入App包中,能夠找到兩個文件函數
embedded.mobileprovision
(配置App簽名信息)archived-expanded-entitlements.xcent
(配置App權限功能,例如遠程推送,App Group等)工具
使用以下命令security cms -D -i embedded.mobileprovision
能夠查看App的簽名信息,其中關於推送的部分以下圖ui
可是關於archived-expanded-entitlements.xcent文件,在不一樣的Xcode版本中,文件內容是不一樣的,具體看下圖
能夠發現:
在使用Xcode7.3.1版本進行打包開啓了遠程推送的工程的時候,工程中並不會自動建立Target-entitlements
文件,進而archived-expanded-entitlements.xcent
文件中也就不會有aps-environment
鍵值對的信息。
在使用Xcode8.3.2版本進行打包開啓了遠程推送的工程的時候,工程中會自動建立Target-entitlements
文件,進而archived-expanded-entitlements.xcent
文件中也就會有aps-environment
鍵值對的信息。
因而可知Xcode的版本更新對推送的配置是有更改的,這個配置的變化,致使有些App即便集成了遠程推送,可是在iOS10上卻收不到推送。
問題描述:
某 iOS app在接入信鴿SDK 集成推送功能時,遇到在iOS 10 如下版本能夠正常推送,可是在iOS 10的版本中,收不到推送消息。
具體現象:
而後將iOS10的設備鏈接到Xcode,在Xcode中打開鏈接的設備的控制檯,啓動某遊戲App,在輸出的log中,發現了下面輸出:
Apr 21 17:53:53 uwei SpringBoard(UserNotificationsServer)[53]
<Notice>: No valid 'aps-environment' entitlement string found for application 'com.tencent.dragonnest':
(null). Notifications will not be delivered.
Apr 21 17:53:53 uwei dragon[3644] <Notice>: JoyYou-TencentMSDK ::: Register remote notifications failed 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}複製代碼
第一步,
先確認在iOS 10如下操做系統中是否正常,
在一臺iOS 8的越獄手機上,抓取到了device token,定向推送消息,能夠正常收到。
在iOS 9的設備上,使用帳號登陸,反查device token,能夠看到登陸的帳號下是有device toekn的,而後使用定向推送,能夠正常收到推送消息。
在iOS 10.3.1的設備上,從操做同iOS9的一致,後臺顯示沒有綁定到device token。反覆下載重試,結果同樣。
第二步,驗證包
檢查AppStore中的包是否存在問題(咱們不能保證咱們上傳的包沒有通過Apple的二次改修,事實上Apple會修改咱們上傳的iPA文件)
在本地使用iTunes,從AppStore下載某遊戲App的最新包,解開包中的文件,找到了archived-expanded-entitlements.xcent文件,打開查看,
No valid 'aps-environment' entitlement string found for application 'com.tencent.dragonnest'
而配置了遠程通知的app,在app包中凡是擁有archived-expanded-entitlements.xcent這個文件的,文件內容中必需要有如下鍵值對才能正確使用遠程推送
<key>aps-environment</key>
<string>production</string>
而正確的內容應該以下:(舉例)
security cms -D -i embedded.mobileprovision > embeded.plist
2.2. 使用文本工具打開 archived-expanded-entitlements.xcent,內容是
由此能夠得出結論:
某遊戲App在打包的時候,生成的包關於推送的配置存在問題
引入緣由:
Unity裏面放了一份entitlements文件,導出到XCode的時候沒有被識別到,因此每次XCode都生成一個新的entitlements,致使部分數據丟失(aps-environment鍵值對)
解決辦法:
手動在entitlements文件中添加aps-environment鍵值對
建議若是在工程代碼不存在IDE版本兼容問題的要求,請使用新版本Xcode進行配置打包,而後在根據文檔中提到的方法檢查iPA包。
最後簡單介紹iOS APNs的機制,讓咱們瞭解消息推送的總體流程,
第一步以下圖:
application:didRegisterForRemoteNotificationsWithDeviceToken
: 回調函數下發設備token到App第二步
當使用前端網頁建立全量推送的時候,XG後臺將根據指定的APP,將(推送的內容+在當前這個App下所擁有的token+App指定的證書)做爲參數,發送推送請求到APNs,
APNs解密token和token key,以校驗請求的有效性,以及推送的目標設備,若是APNs判斷請求是合法的,以後就會向指定設備發送通知消息。
以下圖:
整個APNs消息的推送流程,能夠粗略歸納爲下圖:
針對iOS平臺的推送集成,信鴿iOS開發團隊提供了【推送診斷工具】,能夠在信鴿官網中【應用列表】->【應用配置】->【信鴿推送助手】
但願經過以上介紹,可以讓團隊在使用推送技術的路上,少踩坑,少走彎路,多一點了解,多一點高效。
歡迎訪問信鴿官網聯繫咱們。或經過如下方式:商務合做請聯繫郵箱:data@tencent.com技術業務請聯繫郵箱:dtsupport@tencent.com