通過推送后台查看到 線上還沒有有效設備,意思就是沒有注冊設備。 則集成可能少了步驟,需重新查看小米推送的集成文檔。或是出現xcode本身的參數配置錯誤:
https://dev.mi.com/console/doc/detail?pId=98
2.3. 配置SDK運行參數
運行SDK注冊小米推送服務的時候,需要使用AppID,AppKey,等參數來驗證使用者的合法性。
- 打開工程下資源文件Info.plist
- 文件為源代碼形式打開,添加以下信息
<dict> <key>MiSDKAppID</key> <string>1000888</string> <key>MiSDKAppKey</key> <string>500088888888</string> <key>MiSDKRun</key> <string>Online</string> </dict>
- 如果開發版本較多,修改連接環境比較繁瑣,提供以下方式。
!--請注意MiSDKRun寫法, 用buildSetting里面的宏替換-- <dict> <key>MiSDKAppID</key> <string>1000888</string> <key>MiSDKAppKey</key> <string>500088888888</string> <key>MiSDKRun</key> <string>${MiSDKRun}</string> </dict>
其中在Build Settings中添加添加宏MiSDKRun的方法為:
- MiSDKAppID, MiSDKAppKey 為在小米開發者網站http://developer.xiaomi.com,注冊App后的AppID,AppKey。MiSDKRun 是設定SDK是連接Development環境/Distribution環境 對應參數為debug/online
####################### xcode參數錯誤 #########################################
一天又一天,淹沒在無窮無盡剪不斷理還亂的業務線,時不時出來跑下腳本,打打各種環境的包。
最近在聯調push的時候,又碰上一些奇怪的問題,一番拉扯,終於搞定,特此記錄。
錯誤信息
NSError(NSCocoaErrorDomain:3000) 未找到應用程序的“aps-environment”的授權字符串
嘗試解決
1、打開 Capabilites -> Push Notifications 開關屬性為 ON (確認已打開)。
2、刪除本地 profile 文件,重新download,無效。
3、Command+shift+K 清空Xcode緩存,無效。
4、Build Setting 搜索 code sign。
觀察 Code Signing Entitlements ,確認值為 entitlements 文件正確路徑。
觀察 Code Signing Identity,不同環境對應不同打包證書,開發環境對應開發證書,正式環境對應生產證書,確認是ok的。
5、stackoverflow 上看到這么一條挺心動的,大概意思是這么說的,確保你的 profile 文件生成在推送證書生成之后。於是重新生成了一波,無效。
APNs Development iOS 開發環境推送證書
Apple Push Services 生產環境推送證書
額,到這里,似乎有點山窮水盡了啊,不行,殊死一搏
1
|
刪除mac鑰匙串中心所有關於項目的證書,包括開發證書,生產證書,開發推送證書,生產推送證書等等。
|
重啟,重新應用,重新打包,然后,居然…竟然…特么的好了!!!Are you fucking kidding me?!!
四種打包模式的區別
-
Save for iOS App Store Deployment
保存到本地 准備上傳App Store 或者在越獄的iOS設備上使用 -
Save for Ad Hoc Deployment
蘋果的官方解釋是:To distribute your app to users with designated devices, select “Save for Ad Hoc Deployment.” The app will be code signed with the distribution certificate.(保存到本地 准備在賬號添加的可使用設備上使用(具體為在開發者賬戶下添加可用設備的udid),該app包是發布證書編譯的) -
Save for Enterprise Deployment 生成企業包
這種主要針對企業級賬戶下 准備本地服務器分發的app,也可直接發給你的客戶或測試人員安裝,無需在帳號中添加設備的udid。注意:此證書為299$的企業證書 -
Save for Development Deployment
蘋果的官方解釋是:To distribute your app for internal testing, select “Save for Development Deployment.” The app will be code signed with your development certificate. (針對內部測試使用,主要給開發者的設備(具體也為在開發者賬戶下添加可用設備的udid)。該app包是開發證書編譯的)
至於 Save for Ad Hoc Deployment 和 Save for Development Deployment兩個選項的區別,官方給出的解釋是證書的區別,但是對於我們來說,還不是特別清楚具體的用處。其實最早當我們選擇Save for Ad Hoc Deployment來生成ipa包的時候,我們是可以選擇開發證書的,但是現在,它需要我們使用發布證書。我們最早在做程序真機測試的時候,大部分時候是用的開發證書,並沒有發布證書,所有我認為,Save for Development Deployment是我們前期用開發證書,給測試人員發包測試的時候使用的,而到程序開發的后期,我們為了發布,生成了發布證書,此時,我們給client或者tester的時候,應該選擇Save for Ad Hoc Deployment,使用發布證書打包, 而官方對Ad Hoc的解釋是:Ad Hoc模式的包,和將來發布到App Store的包在各種功能測試上是一樣的,只要Ad Hoc模式下測試(推送,內購等)沒有問題,發布到App Store也是沒有問題的。
entitlements文件
Xcode8之后,我們如果需要打開推送功能,必不可少的一步就是打開 Capabilites -> Push Notifications 開關屬性為 ON,細心的同學就會發現,Xcode為我們自動生成了一個 xxx.entitlements文件,xxx是我們的項目名稱,打開這個文件,里面只有一對鍵值對如下
1
|
APS Environment: development
|
這個有什么作用呢?
我們此時Archive出一個ipa包來,右鍵解壓並查看包內容,會發現一個embedded.mobileprovision,里面放的是各種PP文件屬性,包括關於項目的一些權限字段和功能開關,其中,我們要關注的則是 aps-environment 這個字段,這個字段的值真正決定我們打出來的包是正式環境的push還是開發環境的push,值為 development 代表開發環境push,distribution 代表正式環境的push。
然而,經過測試,無論我們如何修改上面生成的 xxx.entitlements 文件中 APS Environment 的值,打出來的包內容 embedded.mobileprovision 中 aps-environment始終為 development,這是為什么呢?
經過本人親自反復多次測試,我們手動修改 xxx.entitlements 的 APS Environment 是沒有用的,因為Xcode打包會自動幫我們修改 APS Environment 的值,而這個值只取決於我們的打包方式, 即使我們把 APS Environment 的值改成 abc 都沒有關系。
打包方式 | 最終實際 aps-environment |
---|---|
Save for iOS App Store Deployment | distribution |
Save for Ad Hoc Deployment | distribution |
Save for Enterprise Deployment | 尚未測試 |
Save for Development Deployment | development |
所以,我們得出一個結論,使用 firim 或者 蒲公英 分發平台給測試push發包的時候,就需要選擇正確的打包模式,否則后端調起的推送證書是開發環境還是生產環境將直接影響我們app是否會受到推送。
校驗正式環境的push功能,選擇 ad-hoc 模式打包。
校驗測試環境的push功能,選擇 Development Deployment 模式打包。
小彩蛋
如何查看 embedded.mobileprovision 文件內容?
方法一:直接在Finder左鍵選中該文件,修改Finder查看方式為圖標、列表、分欄或封面流方式顯示項目(默認從左往右第三個查看方式),那么我們就會在右邊封面流看到文件內容了。
方法二:cd到該文件目錄下,使用命令 security cms -D -i embedded.mobileprovision 即可查看。