這兩天終于徹底搞定了ipa簽名的問(wèn)題,整理一下作為總結(jié)
打包流程

超好用的resign腳本
之前搜索了一個(gè)很簡(jiǎn)單的resign腳本,跟這里描述的做法差不多《iOS ipa重簽名》。然而在簽我們的ipa的時(shí)候卻發(fā)生失敗,仔細(xì)看了一下,原來(lái)是因?yàn)槲覀兊?strong>ipa是啟用了push notification的,需要用到entitlement,然而這個(gè)文件在xcode工程中是找不到的。后來(lái)又找到了一篇更實(shí)用的文章《iOS的ipa重簽名》,里面提到的fastlane/sign腳本能夠解決在簽名時(shí)遇到的各種問(wèn)題,只要mobileprovision文件和p12文件是對(duì)應(yīng)得上,并且證書名稱沒(méi)有寫錯(cuò),就絕對(duì)沒(méi)有問(wèn)題了。腳本的核心技術(shù)在于使用了PlistBuddy來(lái)解析plist文件里面的信息并做處理,腳本的核心代碼在這一行
/usr/bin/codesign ${VERBOSE} -f -s "$CERTIFICATE" --entitlements="$TEMP_DIR/newEntitlements" "$APP_PATH"
關(guān)于Entitlements
Entitlements其實(shí)是一個(gè)配置文件,對(duì)于一些要開啟的app功能,需要使用Entitlements文件來(lái)做配置。Entitlements文件管三個(gè)東西:iCloud、push notification、App沙盒(ios下app沙盒是自動(dòng)配置的,并不需要Entitlements,所以這里實(shí)際上是指mac下的app沙盒)。官方文檔地址如下:https://developer.apple.com/library/mac/documentation/Miscellaneous/Reference/EntitlementKeyReference/Chapters/AboutEntitlements.html
關(guān)于p12和mobileprovision
在平常用xcode開發(fā)的時(shí)候,我們經(jīng)常會(huì)被兩個(gè)東西卡住Code Signing Identity和Provisioning Profile。其實(shí)這兩個(gè)設(shè)置項(xiàng)對(duì)應(yīng)的就是p12文件和mobileprovision文件。按照蘋果官方的說(shuō)法,正確的理解應(yīng)該是這樣:
- mobileprovision:里面描述的是你這個(gè)開發(fā)者id對(duì)應(yīng)的后臺(tái)配置信息,譬如支持什么appid、添加了哪些測(cè)試設(shè)備、開啟了什么特殊功能(GameCenter、IAP、Push)等等,并帶上一個(gè)ID
- p12:實(shí)際上是一個(gè)鑰匙串,使用了非對(duì)稱加密算法,專門對(duì)你的app進(jìn)行簽名,確保你發(fā)布的app不會(huì)被人冒名頂替。在MemberCenter上下載的證書,實(shí)際上只含有publickey,即你只知道這個(gè)app能用什么名稱來(lái)進(jìn)行簽名,但如果真的需要對(duì)app進(jìn)行簽名的話,必須要持有privetakey的原始創(chuàng)建者才能進(jìn)行簽名
綜上,那為什么p12和mobileprovision是怎樣對(duì)應(yīng)上的呢,就是因?yàn)?strong>mobileprovision里面含有了p12文件的publickey。
總結(jié)一下:app打包的時(shí)候,通過(guò)mobileprovision文件來(lái)對(duì)代碼進(jìn)行簽收,通過(guò)p12文件完成加密過(guò)程,p12文件和mobileprovision文件通過(guò)publickey可以一一對(duì)應(yīng)
關(guān)于證書
蘋果的證書類型共有三種
- iOS Development:真機(jī)調(diào)試用證書,不能用于IPA打包
- iOS Distribution:打包IPA用證書,不能用于真機(jī)調(diào)試
-
Apple Push Services:用于后臺(tái)APNs用,前端用不上
一覽表如下
More:APNs是用Http2.0協(xié)議來(lái)工作的,非常時(shí)髦
