本文由信鴿工程師uwei提供。
文章提要
本文針對iOS推送接入過程中遇到的一個實際案例,提出了iOS推送排查問題的思路,在解決該問題的基礎上,更給出了通用的iOS推送自測的檢查路徑。
文末提供了一種基於騰訊移動推送(信鴿)的自測工具,歡迎試用與反饋。
問題背景
對於網際網路APP的產品運營來說,由於我們的使用者是不可見的,有時候甚至是在身邊的陌生人就在用我們的產品,但是我們卻有一種近在眼前,遠在天邊的感覺, 物理上的隔離成為了天生的屏障,特別是當產品需要做一個線上有時效性的活動的時候,我們是多麼希望使用者都坐在我們面前,以便我們可以隨時通知到關於活動的事情。而網際網路的運營人員的手段方法多種多樣,但是訊息推送一直絕對是產品運營的一個必須且重要的手段,訊息推送讓我們的使用者與我們之間擺脫了看不見摸不著的尷尬局面。不管我們的使用者在哪裡,只要他們聯網,訊息推送能拉近使用者與我們之間的距離,即使遠在天邊,但是秒級觸達,感覺好像盡在身邊。
可以說,現在的APP們,90%都有推送的剛需。而市面上現在已經有很多的第三方推送工具,整合第三方推送工具無疑是一件相對輕鬆的任務。
但不正確的整合姿勢,或者某些錯誤的配置,常常會導致推送無法正常使用。
比如,
1.Xcode開發環境中關於推送的配置不正確
2.推送證照設定錯誤或者是證照過期失效
那麼,整合推送需要注意些什麼?
整合之後,怎樣確認自己是否正確整合了遠端訊息推送呢?
坑:iOS 10推送失敗
相信iOS開發的同學對下圖來說是比較眼熟的:
以上圖片就是Xcode不同版本中關於推送的配置是不同的,表現如上,但是不同點具體在哪兒呢?
使用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的簽名資訊,其中關於推送的部分如下圖
但是關於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檔案,開啟檢視,
發現檔案中缺少aps-environment的鍵值對,而這正好符合與iOS 10裝置的控制檯看到的log相符:
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>
而正確的內容應該如下:(舉例)
- 檢查提交Apple稽核的iPA包,開啟包中embedded.mobileprovision,archived-expanded-entitlements.xcent的檔案,檢視其中的內容
使用以下命令開啟第一個檔案:security cms -D -i embedded.mobileprovision > embeded.plist
這個檔案中存在關於推送的簽名資訊,說明當前App是配置了推送證照的。
2.2. 使用文字工具開啟 archived-expanded-entitlements.xcent,內容是
與從AppStore中下載的安裝包中的檔案是一致的,說明Apple並沒有做額外的處理
由此可以得出結論:
某遊戲App在打包的時候,生成的包關於推送的配置存在問題
引入原因:
Unity裡面放了一份entitlements檔案,匯出到XCode的時候沒有被識別到,所以每次XCode都生成一個新的entitlements,導致部分資料丟失(aps-environment鍵值對)
解決辦法:
手動在entitlements檔案中新增aps-environment鍵值對
坑:問題結論
建議如果在工程程式碼不存在IDE版本相容問題的要求,請使用新版本Xcode進行配置打包,然後在根據文件中提到的方法檢查iPA包。
延伸:如何檢查iOS推送
最後簡單介紹iOS APNs的機制,讓我們瞭解訊息推送的整體流程,
第一步如下圖:
- App使用註冊API註冊APNs遠端推送,如果App已經註冊過,並且App指定的token沒有發生變化,系統會立即返回給App已經存在的token,直接執行第四步
- 當需要生成一個新的token時,APNs會使用在裝置中的證照來建立,使用一個token key來加密token,然後返回到裝置
- 系統通過
application:didRegisterForRemoteNotificationsWithDeviceToken
: 回撥函式下發裝置token到App - 一旦App接收到device token,在回撥方法中,使用信鴿SDK中的介面,將這個token傳送XG伺服器。
第二步
當使用前端網頁建立全量推送的時候,XG後臺將根據指定的APP,將(推送的內容+在當前這個App下所擁有的token+App指定的證照)作為引數,傳送推送請求到APNs,
APNs解密token和token key,以校驗請求的有效性,以及推送的目標裝置,如果APNs判斷請求是合法的,之後就會向指定裝置傳送通知訊息。
如下圖:
整個APNs訊息的推送流程,可以粗略概括為下圖:
那麼通過以上的介紹,推送出現問題的可能就可以歸納為以下:
- 開發環境中關於推送開關選項,推送許可權的檔案配置不正確
- 推送證照設定錯誤或者是證照過期失效等
- device-token 未獲取到,或者是獲取到了device token,但是傳送給XG伺服器的姿勢不正
- 使用者裝置關閉了訊息推送,或者是裝置的網路連線有問題
- Apple或者是XG伺服器不穩定
再延伸:推送診斷
針對iOS平臺的推送整合,信鴿iOS開發團隊提供了【推送診斷工具】,可以在信鴿官網中【應用列表】->【應用配置】->【信鴿推送助手】
希望通過以上介紹,能夠讓團隊在使用推送技術的路上,少踩坑,少走彎路,多一點了解,多一點高效。
歡迎訪問信鴿官網聯絡我們。或通過以下方式:
商務合作請聯絡郵箱:data@tencent.com
技術業務請聯絡郵箱:dtsupport@tencent.com