環境: IDE xcode 11.3.1 (11C504)
1、確認您的xcode能順利編譯通過
2、Project-Archive
xcode會自動編譯並且打包,並且完成后會彈出Archive對話框
3、點擊右側的Validate App
會自動連接App Store Connect來進行初步的驗證。
勾選Strip Swift symbols來 減少 app size
4、選擇發布的證書來完成發布(這個要在developer.apple.com的account中設置)
好了,下面就會自動檢測了,如果不通過會給你一些提示。按提示來修改再次打包就可以了。
下面講一下,我碰到的問題:
A valid provisioning profile for this executable was not found
字面意思就是app沒有一個有效的配制文件
這里要說到一些概念:
Certificates, Identifiers & Profiles
Certificates:證書
Identifies:app的bundle identifier(圖1)
Devices:測試設備(比如說你的iphone,ipad等等)
Profiles: 對證書、bundle identifier,devcies的一個總結吧,也就是包括了這些信息,這樣你的xcode,還有蘋果app store connect才會通過您的認證,
這樣你才可以安裝到你的測試設備上,或者發布到testflight(公測),最好上架到app store去供用戶購買。
證書可以通過xcode來生成:Xcode - Preferences
開發、發布,根據情況來建立。
圖1
在蘋果開發者網站上,可以建一個app id ( Application Id)
注冊一個App IDs:
加入一個測試手機:
這點,點擊download, 下載您的設置到本地,然后雙擊,這樣xcode就可以認到了。
這樣的話,基本上就完成了設置工作。
下面我們來看一下xcode中,是如何設置的。
Debug與Release設置是一樣的,配制文件不一樣,一個選擇dev,一個選擇release。
還有一個地方也是報錯,也是我碰到的
最后還得搞一張圖,打包的時候一直報錯,大體是這樣的錯,但都跟 libPods-工程名.framework有關系:
1、Invalid Swift Support : The file 工程.app/Frameworks/libPods-工程.framework doesn't have the corrent file type for this location.
2、Invalid Bundle Structure: The binary file '工程.app/Frameworks/libPods-工程.framework' is not permitted. Your app can't contain standalone
executables or libraries, other than a valid CFBundle Executable of Supprted bundles.
以上是我記憶中的解決方法及打包發布到testflight應該處理的。
時間一長就會忘記,還是記錄下,當然如果您碰到了相關的問題,希望能幫到您。
不當之處,可以相互學習,共同提高。
下面講一下打包成功后,上傳到Apple Store Connect
打包成功后,可以導出來
然后選擇發布證書,然后就可以導出來了。
導出來以后,會有一個ipa文件,這個文件就是我們需要上傳的文件,可以安裝一個Transporter
第一次打開用您的app id登錄,然后將導出的ipa文件,直接拖進去,然后一般通過了Validate App的話,
直接拖進去就可以了,然后再點提交。
提交完后,apple會在很短的時候里,給你回郵件email,還給我發了幾個需要調整的地方:
ITMS-90683: Missing Purpose String in Info.plist - Your app's code references one or more APIs that access sensitive user data. The app's Info.plist file should contain a NSBluetoothPeripheralUsageDescription key with a user-facing purpose string explaining clearly and completely why your app needs the data. Starting Spring 2019, all apps submitted to the App Store that access user data are required to include a purpose string
這個意思其實很簡單:就是你用的權限中沒有明確的指出干嘛用的,也就是在value里面加入一個說明即可
比如,藍牙是用來連接打印機的
到此上傳到App Store Connect就成功了,到此,還需要登錄到developer.apple.com -- Account
打開會員中心,然后點擊App Store Connect,去構建您的項目,這樣就可以提交到TestFlight
讓專業人員去幫你審核了,審核通過,都會給你發Email。
只要在App Store Connect后台加入測試人員的email
如果沒有收到email的話,可以再點擊發送邀請,這樣就會收到一封邀請,
1)打開郵件,您會看到一個TestFlight前往的按鈕,點一下,就會彈出來一個對話框,里面有一個邀請碼,拷貝。
2)然后在手機上的TestFlight “兌換”,帖上您的邀請碼,確認。
3)然后就可以看到待安裝的App了,安裝,打開,輸入賬號密碼,開啟測試。
下面我們再來看看mac, xcode, 手機,開發者服務(apple),這些家伙究竟是咱根據證書還有配制文件,
來處理一些下載到手機安裝,打包發布等等工作的。
Code Signing Identity 是咱個工作原理,這里帖個圖:
Xcode 中配置的 Code Signing Identity(entitlements、certificate)必須與 Provisioning Profile 匹配,
並且配置的 Certificate 必須在本機 Keychain Access 中存在對應 Public/Private Key Pair,否則編譯會報錯。
Xcode 所在的 Mac 設備(系統)使用 CA 證書(WWDRCA.cer)來判斷 Code Signing Identity 中 Certificate 的合法性:
若用 WWDRCA 公鑰能成功解密出證書並得到公鑰(Public Key)和內容摘要(Signature),證明此證書確乃 AppleWWDRCA 頒布,即證書來源可信;
再對證書本身使用哈希算法計算摘要,若與上一步得到的摘要一致,則證明此證書未被篡改過,即證書完整。
Verify Code Signature with Certificate
iOS/Mac 設備(系統)使用 App Provisioning Profile(Code Signing Identity)中的開發證書來判斷App的合法性:
若用證書公鑰能成功解密出 App(executable bundle)的內容摘要(_CodeSignature),證明此 App 確乃認證開發者發布,即來源可信;
再對 App(executable bundle)本身使用哈希算法計算摘要,若與上一步得到的摘要一致,則證明此 App 未被篡改過,即內容完整。
總結
- 基於 Provisioning Profile 校驗了 CodeSign 的一致性;
- 基於 Certificate 校驗 App 的可靠性和完整性;
- 啟動時,真機的 device ID(UDID)必須在 Provisioning - Profile 的 ProvisionedDevices 授權之列。
- 無論是 Xcode 對 APP 進行簽名打包還是真機運行 APP 進行校驗,都使用了基於證書體系的非對稱加密機制。
以上是官方出的二張圖,我是在下面兄弟的blog看到的:
原文鏈接:https://blog.csdn.net/kuangdacaikuang/article/details/52984642
我的理解:
1、我們在xcode中進行了配制,這樣xcode就可以通過我們提供的Provisioning Profile證書來安裝APP到手機上,
手機上也會有一份這樣的配制,不然,啟動APP的時候也不會成功。
還記得以前用免費的APP ID進行開發的時候,有時候第二天就過期,有時候過個3,5天過期,一點就一閃,其實是證書過期了,
每次安裝APP的時候,都會連網去驗證合法性。
2、一般情況下,只要配制到位了,那肯定不會有Validate App不通過的情況,也就是說不通過一般是配制不到位,不是這里少了,就是這里多了。
或者比如說我們手工設置了,就不要讓xcode自動生成了。
這樣懂得了原理,我們工作就可以事半功倍了。