根據蘋果官方的說明,自 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 必須的操作:

為所有項目簽名增加時間戳

另外還有:

去掉debug文件,注意debug模式下不要去掉不然你就不能debug了
去掉debug文件,注意debug模式下不要去掉不然你就不能debug了

上傳

這裡有幾點要注意,首先上傳結果輸出到 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 文件最後一行:

依靠這個 UUID,我們可以使用命令來檢查 notarize 的狀態實現等待,一旦成功,就可以 staple 了。

實際上返回的內容是這樣的:

但我們只檢測文中是否包含 成功 即可,一旦包含,就使用 xcrun 訂書機 釘書針 "Great.app" 來完成 notarize。

接下來,就是原本的操作了,生成 sparkle 更新包,上傳分發。

 

參考文獻

本文由 落格博客 原創撰寫:落格博客 » macOS app 實現自動化 notarize 腳本

轉載請保留出處和原文鏈接:https://www.logcg.com/archives/3222.html

由...出版 落格博客

如非聲明,本人所著文章均為原創手打,轉載請註明本頁面鏈接和我的名字。

加入對話

4 註釋

您的電子郵件地址不會被公開. 必填字段標 *