根據蘋果官方的說明,自 macOS 10.15 起,所有從互聯網下載的未進行 notarize 的 app,默認將無法被打開,所以在 App Store 外分發的 app,也必須在發布前將 app 上傳到蘋果的服務器進行處理。
使用 Xcode 自帶 archive 工具可以很方便地進行 notarize,但這個操作無法實現自動化處理,為了方便分發,我將 落格輸入法 macOS 2 的分發流程都做成了自動化腳本,現在,只好給腳本添加自動化提交功能了。
命令工具
蘋果官方實際上有提供cli 命令,首先你需要運行 Xcode中-選擇 --安裝 來安裝支持,然後我們使用 $ xcrun altool --公證-應用 --主-束-ID "" --用戶名 "" --密碼 "" --文件 "" 來上傳app給蘋果服務器;使用 $ xcrun altool --公證-信息 -u "" 來輪詢檢查處理結果(儘管官方說在一小時內,但一般很快,幾分鐘就搞定);最後使用 $ xcrun 訂書機 釘書針 "" 來給文件蓋章。
我應該提交哪些文件?
首先,我們要搞明白應該提交哪些(個)文件到服務器,比如,你有個 Great.app 這個編譯結果,然後你可能還有一個 Great.pkg,用來給用戶安裝 Great.app,最後,為了分發方便,你可能還會把這個 pkg 文件放入 Great.dmg 中,這樣,我們就有了三個文件:Great.app,Great.pkg,Great.dmg 。
實際上,Great.app 就是個目錄,所以,如果你僅僅分發 app,那麼你需要將 Great.app 打包成 Great.app.zip,然後再上傳到蘋果的服務器進行 notarize。
總之,如果你和我一樣,一次有這麼三個互相包含的文件,那麼你【只需要】上傳嵌套最多的 Great.dmg 即可,蘋果的服務器會自動將你的 dmg 文件打開,取出 pkg,然後取出 app,並為【三者】完成 notarize。
這樣,當 notarize 完成,我們雖然沒有上傳 app 和 pkg,但依舊可以為這兩個文件單獨完成 staple。
項目設定
實際上,當你在使用 Xcode 自帶 archive 進行 notarize 時,它為你完成了很多工作,如果我們自己使用命令,則需要進行額外的配置,打開你的 Xcode 項目,project 的 Build Settings 中,設置代碼簽名包含時間戳,這是 notarize 必須的操作:
另外還有:
上傳
1 |
xcrun altool --notarize-app --primary-bundle-id "app bundle id" --username "your appleid" --password "one-time-password" --file "Great.dmg" -itc_provider "your team id" &> tmp |
這裡有幾點要注意,首先上傳結果輸出到 tmp 文件供稍後獲取查詢id,注意使用 &> 而不是 > ,後者無法把輸出的內容放入 tmp ;
對於 -ITC_provider "你的團隊的ID" 這個參數,如果你的 Apple ID 下只有一個開發者賬號,那就不需要這個參數了,如果你和我一樣,Apple ID除了自己的開發者賬號,還加入了別人的組,那你就有了多個“ provider”需要手動指明是上傳到哪個,要查看你的 provider ,到 App Store的連接,登錄後在右上角點擊菜單,選擇編輯賬號信息,你能找到一個叫做“Team ID”的字段,裡邊的內容就是;
對於 --主-束-ID "應用程序捆綁ID" ,就是你app的 bundle id,如果你上傳的是 Great.app.zip,那麼這個參數不是必須的;
還有就是注意 --密碼 "一次性密碼" 這個參數,要生成一次性密碼。
等待並完成
總之,上傳成功之後,我們會得到 tmp 文件最後一行:
1 |
RequestUUID = 2EFE2717-52EF-43A5-96DC-0797E4CA1041 |
依靠這個 UUID,我們可以使用命令來檢查 notarize 的狀態實現等待,一旦成功,就可以 staple 了。
1 |
uuid=[crayon-66fe6df37bb98296283781 inline="true" ]cat tmp | grep -Eo '\w{8}-(\w{4}-){3}\w{12}$' |
雖然是真的; 做
迴聲 “檢查公證…”
xcrun 工具 –公證信息 “$烏伊德” –用戶名 “Apple ID” –密碼 “一次性密碼” &> tmp
r=
cat tmp
t=
迴聲 "$ - [R" | grep的 "成功"
f=
迴聲 "$ - [R" | grep的 "無效"
如果 [[ “$ŧ” != “” ]]; 然後
迴聲 “完成公證!”
xcrun 訂書機 “Great.app”
xcrun 訂書機 “Great.dmg”
迴聲 “訂書機完成!”
打破
菲
如果 [[ “$F” != “” ]]; 然後
迴聲 “$ - [R”
返回 1
菲
迴聲 “還沒有完成, sleep 2m 然後再次檢查…”
睡覺 120
DONE[/蠟筆]
實際上返回的內容是這樣的:
1 2 3 4 5 6 |
RequestUUID: 2EFE2717-52EF-43A5-96DC-0797E4CA1041 Date: 2018-07-02 20:32:01 +0000 Status: invalid LogFileURL: https://osxapps.itunes.apple.com/... Status Code: 2 Status Message: Package Invalid |
但我們只檢測文中是否包含 成功 即可,一旦包含,就使用 xcrun 訂書機 釘書針 "Great.app" 來完成 notarize。
接下來,就是原本的操作了,生成 sparkle 更新包,上傳分發。
參考文獻
本文由 落格博客 原創撰寫:落格博客 » macOS app 實現自動化 notarize 腳本
轉載請保留出處和原文鏈接:https://www.logcg.com/archives/3222.html
我看了一下 xcrun altool –notarize-app primary-bundle-id 這條命令的文檔,有點哭笑不得。
包括primary-bundle-id選項(必需),以指定標識符,以幫助您跟踪來自公證服務的自動通信. 您提供的值不需要與提交的應用程序的捆綁包標識符匹配或具有任何特定值, 只要對你有意義.
感覺是說在上傳 pkg 的時候,這個 bundle ID 隨便填就好了嗎?
哈哈哈,沒錯,說是這個就用來給你自己分辨不同的項目~
如果 pkg 包中有兩個 app 文件怎麼辦?
按照文中所述,直接上傳你的pkg即可,這樣你的pkg文件和兩個app都會被驗證,得到的結果可以直接給三個文件單獨簽名。
xcrun altool 一直卡這不動了,用xcode archive上傳也是一直卡在不動,這個什麼原因呢,
那可能是網絡問題,如果Xcode archive 都上傳不能,那你得看看你網絡配置啥的了,比如防火牆?
這個每次出包都要傳一次嗎,還是只要每個版本傳一次就好了
每一次都需要,所以最好弄成自動化,不然煩死。
如果我的包是沒有壓縮再dmg裡,比如我有個pkg包和.zip的包。那我需要上傳2次嗎
是的,你pkg不能拆出app, zip 和 pkg 要分別上傳。