在使用腳本xcodebuild自動打包的時候,會用到簽名證書和描述文件,我在編譯的時候搞了好長時間才搞明白,下面介紹如何得到正確配置。
證書:證書是用來給應用程序簽名的,只有經過簽名的應用程序才能保證他的來源是可信任的,並且代碼是完整的, 未經修改的。在Xcode Build Setting的Code Signing Identity中,你可以設置用於為代碼簽名的證書。
.p12:因為直接從Apple下載的證書只有公鑰,沒有私鑰。沒辦法證明這個證書是你的(沒有辦法證明你有這個權利)。而從本地鑰匙串中導出的.p12文件是包含公鑰和私鑰的,也就是說可以把證書上描述的權利賦予他人。
描述文件:描述文件里包含了App ID , Certificates (證書), Devices(設備)。 說明生成描述文件需要用到這些信息。我們要打包或者在真機上運行一個應用程序,首先需要證書來進行簽名,用來標識這個應用程序是合法的、安全的、完整的等等。然后需要指明它的App ID,並且驗證Bundle ID是否與其一致。再次,如果是真機調試,需要確認這台設備能否用來運行程序。而Provisioning Profile就把這些信息全部打包在一起,方便我們在調試和發布程序打包時使用,這樣我們只要在不同的情況下選擇不同的profile文件就可以了。而且這個Provisioning Profile文件會在打包時嵌入.ipa的包里。
一、“手動管理證書”與“自動管理證書”
在Xcode8以后蘋果引入了自動管理證書(automatically manage signing),設置自動管理證書后xcode會根據賬號證書和蘋果開發者中心設置的內容,自動生成描述文件並下載到機器中使用。
如果我們想手動管理證書,請將xcode中的“automatically manage signing”勾掉。
二、正確獲得證書“常用名稱”
首先要安裝證書或者直接安裝到處的p12文件。其次要得到“常用名稱”
1、打開“鑰匙串訪問”
在“Launch”中搜索“鑰匙串訪問”
2、找到你的證書,單擊鼠標右鍵,單擊“顯示簡介”
3、其中常用名稱就是證書名稱copy待用
三、得到對應證書的描述文件
得到證書名稱還不夠還需要得到描述文件(Provisioning Profiles)
每個用戶有其相應的Provisioning Profiles配置目錄在當前用目錄中,我的目錄如下
cd /Users/rongshenglai/Library/MobileDevice/Provisioning Profiles
其中就是我目前持有的描述文件。
1、登錄“蘋果開發者中心” https://developer.apple.com/
2、點擊“Certificates, Identifiers & Profiles”
這里就是我的描述文件,“Development”是開發者描述文件可以打包后在真機上安裝,“Distribution”是發布描述文件如果要發布到appstore需要這個描述文件。
3、創建描述文件
a)單擊“+”創建一個描述文件
b)選擇開發者描述文件還是發布描述文件,選擇后單擊“continue”
c)選擇appid(也就是設置此描述文件應用於那個app,如果你有多個app需要給每個app都配置一個描述文件),選擇好后單擊“continue”
d)選擇那個證書可以使用此描述文件,不知道全選即可,單擊“Continue”
e)選擇打包后可以在那些設備上使用,選擇好后單擊“Continue”
f)在Profile Name中輸入此描述文件的名字,單擊“Continue”。
4、下載描述文件
證書創建完成后需要把描述文件手動下載到本機
找到你要使用的描述文件(開發者、發布)單擊后顯示如下內容,單擊“Download”后保存到 “/Users/rongshenglai/Library/MobileDevice/Provisioning Profiles” 目錄中注意每個人的個人目錄不同根據情況修改。
下載的文件名類似“XXXX.mobileprovision” 前邊的XXXX記錄下來它就是描述文件名,使用時不要帶.mobileprovision
注意:剛才制作描述文件時一定要選擇你使用的證書。
四、Provisioning Profile文件的說明
以下為典型供應配置文件 *.mobileprovision 的構成簡析:
(1)Name:該mobileprovision的文件名。
(2)UUID:該mobileprovision文件的真實文件名。
(3)TeamName:Apple ID賬號名。
(4)TeamIdentifier:Team Identity。
(5)AppIDName:explicit/wildcard App ID name(ApplicationIdentifierPrefix)。
(6)ApplicationIdentifierPrefix:完整App ID的前綴(TeamIdentifier.*)。
(7)DeveloperCertificates:包含了可以為使用該配置文件應用簽名的所有證書<data><array>。
證書是基於 Base64 編碼,符合 PEM(PrivacyEnhanced Mail, RFC 1848) 格式的,可使用 OpenSSL 來處理(opensslx509 -text -in file.pem)。
從 DeveloperCertificates 提取 <data></data> 之間的內容到文件 cert.cer(cert.perm):
-----BEGIN CERTIFICATE-----
將<data></data>之間的內容拷貝至此
-----END CERTIFICATE-----`
Mac 下右鍵 QuickLook 查看 cert.cer(cert.perm),在 Keychain Access 中右鍵 Get Info 查看對應證書 ios_development.cer,正常情況(公私鑰 KeyPair 配對)應吻合;Windows 下沒有足夠信息(WWDRCA.cer),無法驗證該證書。
如果你用了一個不在這個列表中的證書進行簽名,無論這個證書是否有效,這個應用都將 CodeSign Fail。
(8)Entitlements 鍵<key>對應的<dict>:
keychain-access-groups:$(AppIdentifierPrefix),參見Code Signing Entitlements(*.entitlements)。
每個應用程序都有一個可以用於安全保存一些如密碼、認證等信息的 keychain,一般而言自己的程序只能訪問自己的 keychain。通過對應用簽名時的一些設置,還可以利用keychain的方式實現同一開發者簽證(就是相同bundle seed)下的不同應用之間共享信息的操作。比如你有一個開發者帳戶,並開發了兩個不同的應用A和B,然后通過對A和B的 keychain access group 這個東西指定共用的訪問分組,就可以實現共享此 keychain 中的內容。
application-identifier:帶前綴的全名,例如$(AppIdentifierPrefix)com.apple.garageband。
com.apple.security.application-groups:App Group ID(group. com.apple),參見Code Signing Entitlements(*.entitlements)。
com.apple.developer.team-identifier:同Team Identifier。
(9)ProvisionedDevices:該mobileprovision授權的開發設備的UDID <array>。
參考文檔:
https://blog.csdn.net/potato512/article/details/52180916
https://www.cnblogs.com/ym123/p/4292002.html
https://blog.csdn.net/phunxm/article/details/42685597/