天天看點

那些年,我們一起走過的 iOS 推送的坑

本文針對iOS推送接入過程中遇到的一個實際案例,提出了iOS推送排查問題的思路,在解決該問題的基礎上,更給出了通用的iOS推送自測的檢查路徑。

對于網際網路APP的産品營運來說,由于我們的使用者是不可見的,有時候甚至是在身邊的陌生人就在用我們的産品,但是我們卻有一種近在眼前,遠在天邊的感覺, 實體上的隔離成為了天生的屏障,特别是當産品需要做一個線上有時效性的活動的時候,我們是多麼希望使用者都坐在我們面前,以便我們可以随時通知到關于活動的事情。而網際網路的營運人員的手段方法多種多樣,但是消息推送一直絕對是産品營運的一個必須且重要的手段,消息推送讓我們的使用者與我們之間擺脫了看不見摸不着的尴尬局面。不管我們的使用者在哪裡,隻要他們聯網,消息推送能拉近使用者與我們之間的距離,即使遠在天邊,但是秒級觸達,感覺好像盡在身邊。

可以說,現在的APP們,90%都有推送的剛需。而市面上現在已經有很多的第三方推送工具,內建第三方推送工具無疑是一件相對輕松的任務。

但不正确的內建姿勢,或者某些錯誤的配置,常常會導緻推送無法正常使用。

比如,

1.Xcode開發環境中關于推送的配置不正确

2.推送證書設定錯誤或者是證書過期失效

那麼,內建推送需要注意些什麼?

內建之後,怎樣确認自己是否正确內建了遠端消息推送呢?

相信iOS開發的同學對下圖來說是比較眼熟的:

那些年,我們一起走過的 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等)

使用如下指令

可以檢視App的簽名資訊,其中關于推送的部分如下圖

那些年,我們一起走過的 iOS 推送的坑

但是關于archived-expanded-entitlements.xcent檔案,在不同的Xcode版本中,檔案内容是不同的,具體看下圖

那些年,我們一起走過的 iOS 推送的坑

可以發現:

在使用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中,發現了下面輸出:

調查路徑——

第一步,

先确認在iOS 10以下作業系統中是否正常,

在一台iOS 8的越獄手機上,抓取到了device token,定向推送消息,可以正常收到。

在iOS 9的裝置上,使用賬号登入,反查device token,可以看到登入的賬号下是有device toekn的,然後使用定向推送,可以正常收到推送消息。

在iOS 10.3.1的裝置上,從操作同iOS9的一緻,背景顯示沒有綁定到device token。反複下載下傳重試,結果一樣。

第二步,驗證包

1.檢查AppStore中的包是否存在問題(我們不能保證我們上傳的包沒有經過Apple的二次改修,事實上Apple會修改我們上傳的iPA檔案)

在本地使用iTunes,從AppStore下載下傳某遊戲App的最新包,解開包中的檔案,找到了archived-expanded-entitlements.xcent檔案,打開檢視,

那些年,我們一起走過的 iOS 推送的坑

發現檔案中缺少aps-environment的鍵值對,而這正好符合與iOS 10裝置的控制台看到的log相符:

No valid 'aps-environment' entitlement string found for application 'com.tencent.dragonnest'

而配置了遠端通知的app,在app包中凡是擁有archived-expanded-entitlements.xcent這個檔案的,檔案内容中必須要有以下鍵值對才能正确使用遠端推送

而正确的内容應該如下:(舉例)

那些年,我們一起走過的 iOS 推送的坑

2.檢查送出Apple稽核的iPA包,打開包中embedded.mobileprovision,archived-expanded-entitlements.xcent的檔案,檢視其中的内容

使用以下指令打開第一個檔案:

那些年,我們一起走過的 iOS 推送的坑

這個檔案中存在關于推送的簽名資訊,說明目前App是配置了推送證書的。

2.2.使用文本工具打開 archived-expanded-entitlements.xcent,内容是

那些年,我們一起走過的 iOS 推送的坑

與從AppStore中下載下傳的安裝包中的檔案是一緻的,說明Apple并沒有做額外的處理

由此可以得出結論:

某遊戲App在打包的時候,生成的包關于推送的配置存在問題

引入原因:

Unity裡面放了一份entitlements檔案,導出到XCode的時候沒有被識别到,是以每次XCode都生成一個新的entitlements,導緻部分資料丢失(aps-environment鍵值對)

解決辦法:

手動在entitlements檔案中添加aps-environment鍵值對

建議如果在工程代碼不存在IDE版本相容問題的要求,請使用新版本Xcode進行配置打包,然後在根據文檔中提到的方法檢查iPA包。

最後簡單介紹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伺服器。

那些年,我們一起走過的 iOS 推送的坑

第二步

當使用前端網頁建立全量推送的時候,XG背景将根據指定的APP,将(推送的内容+在目前這個App下所擁有的token+App指定的證書)作為參數,發送推送請求到APNs,

APNs解密token和token key,以校驗請求的有效性,以及推送的目标裝置,如果APNs判斷請求是合法的,之後就會向指定裝置發送通知消息。

如下圖:

那些年,我們一起走過的 iOS 推送的坑

整個APNs消息的推送流程,可以粗略概括為下圖:

那些年,我們一起走過的 iOS 推送的坑

那麼通過以上的介紹,推送出現問題的可能就可以歸納為以下:

開發環境中關于推送開關選項,推送權限的檔案配置不正确

推送證書設定錯誤或者是證書過期失效等

device-token 未擷取到,或者是擷取到了device token,但是發送給XG伺服器的姿勢不正确

使用者裝置關閉了消息推送,或者是裝置的網絡連接配接有問題

Apple或者是XG伺服器不穩定

針對iOS平台的推送內建,信鴿iOS開發團隊提供了【推送診斷工具】,可以在信鴿官網中【應用清單】->【應用配置】->【信鴿推送助手】

希望通過以上介紹,能夠讓團隊在使用推送技術的路上,少踩坑,少走彎路,多一點了解,多一點高效。

文章來源:【騰訊大資料】微信号:tencentbigdata