了解 xcodebuild 命令 ,自動打包ipa

2022-08-02 16:09:16 字數 3505 閱讀 9145

引用部落格:

在 ios 開發中,如果需要把工程打包成 ipa 檔案,通常的做法就是在 xcode 裡點選 「product -> archive」,等待整個工程 archive 後,然後在自動彈出的 「organizer」 中進行選擇,根據需要匯出 ad hoc,enterprise 型別的 ipa 包。雖然 xcode 通過提供的 gui 操作已經遮蔽了大部分的細節,但作為乙個偷懶的程式設計師,當然只是想簡單的執行乙個命令,然後坐下來愜意地喝一杯茶,靜靜等待整個過程的完成。那 xcodebuild 這個命令就是來完成這個事情的。

目前已經有不少封裝得很不錯的第三方打包服務可以用,比如最出名的有 afnetworking 的作者 mattt 大大的 shenzhen (沒錯,就是深圳),還有乙個名叫 gym 也很不錯。這些庫都是對 xcodebuild 這個命令做了一些封裝,更方便使用而已。

xcodebuild 命令是 xcode command line tools 的一部分。通過呼叫這個命令,可以完成 ios 工程的編譯,打包和簽名過程。這個命令隨著 xcode 的版本不同使用方法上也會有所不同。開啟命令列,呼叫以下命令檢視使用方法

xcodebuild --help
雖然這個命令遮蔽了大量編譯器的細節,實際使用起來還是較為繁瑣,使用的話最好還是對其做一層封裝,來更方便地使用,這個之後的文章裡再細說。

上面截圖中顯示了命令執行結果。當前環境是目前最新的 xcode 7.1。

我們就根據顯示的幫助資訊來呼叫命令完成整個打包的過程吧。首先需要了解的是,archive 工程後,實際上我們是把整個工程編譯,然後簽名,變成了乙個字尾名為 xcarchive 的檔案。通過呼叫以下命令,我們將整個工程編譯,簽名,然後將生成的 xcarchive 檔案放到工程根路徑下的 build 資料夾裡。

xcodebuild -scheme -archivepath build/.xcarchive archive
引數說明:schemename 就是工程的 scheme 的名字,在 xcode 中可以看到。如下圖

如果工程使用了 cocoapods 來管理第三方庫,那麼命令的執行方式上有所不同,因為 cocoapods 會把工程變成乙個 workspace。將 workspace 工程 archive 的命令如下。

xcodebuild -workspace -scheme -archivepath build/.xcarchive archive
這個命令和上面的命令區別就在於需要指定 workspace 的檔名。

上面這兩個命令適用於不同型別的工程: workspace 或者非 workspace。執行中讀取的配置都是在工程的 target 或者 scheme 中設定好的配置。比如,archive 進行編譯的是 release 環境,這個在工程的 scheme 中可以看到。而簽名的證書預設也是在各個 target 的 build setting 中的配置。

命令中可以新增一些引數實現在命令執行時配置不同的環境。比如,如果想 archive 出 debug 環境的包,那麼就可以在命令中新增-configuration debug引數。對於非 workspace 的工程,還可以通過新增provisioning_profile=的引數來指定簽名所用的 profile 檔案,引數的值為 profile 檔案的 uuid。

注意:如果下一步中需要匯出的是 enterprise 型別的 ipa 包,則匯出過程中使用的 profile 檔案中指定的 identifier 一定要和相應的 target 的 bundle identifier 完全一樣,不能使用包含萬用字元*的 profile

接下來就是將上一步生成的 xcarchive 檔案匯出,生成 ipa 檔案。這裡需要用到的命令是xcodebuild -exportarchive

從上面的幫助檔案中可以看到命令的使用方法。這裡需要注意的是,目前的 xcode 7 中此命令的使用已經變成使用-exportoptionsplist的引數形式了。這種形式支援 bitcode 的功能。但在實際的使用中,我發現使用這種形式我們工程並不能正確匯出 ipa 包。原因我暫未找到,關於 xcodebuild 的資料也真是少的可憐。我猜測是我們工程未使用 bitcode 導致。所以我改為使用了 xcode 6 時代的-exportformat ipa引數來完成匯出 ipa 包的功能。

xcodebuild  -exportarchive -exportformat ipa -archivepath -exportpath
如果匯出的 ipa 中要更換 profile 檔案,也就是需要修改上一步中 archive 檔案用於簽名的 profile 檔案,有兩種方式可以完成這個任務。

一種方式是直接指定新的 profile 檔案,用法是新增引數-exportprovisioningprofile這種用法適用於只有乙個 target 的專案。

如果工程中有多於乙個的 tagert, 比如提供了 watchkit 的功能。由於 watchkit 和 watchkitextension 的 target 也分別需要不同的 profile,需要使用第二種形式的引數,-exportsigningidentity只要相關的 profile 檔案已經正確安裝,那麼就可以匯出需要的 ipa 檔案。 identity 可以在 keychain 中找到。如下圖

以乙個實際工程舉例,該工程的名字叫 tyrion。scheme 名字也是 tyrion。 那麼 archive 的命令如下

xcodebuild -scheme tyrion  -archivepath build/tyrion.xcarchive archive
匯出 ipa 包的命令如下

xcodebuild  -exportarchive -exportformat ipa -archivepath build/tyrion.xcarchive -exportpath build/tyrion.ipa
依次執行完這兩個命令後,工程根路徑下的 build 資料夾內容如下圖。

匯出 ipa 包後,就可以利用 ifunbox 之類的軟體直接安裝到對應的 iphone ,或者利用 items-service 協議來遠端安裝。

就整個 ci 環境搭建來說,能夠通過命令列正確匯出 ipa 包只是完成了第一步,要完成整個自動化構建,還需要能夠自動將 ipa 包發布出去。這篇文章就到此為止啦~~

Xcode Build版本號自增

如何使得xcode的build版本號自增的問題一直困擾著我,今天通過google終於找到,分享給大家。注 本人使用的xcode版本號為4.3.2 1 進入 tagerts 開啟 build phases 2 選擇 add build phases 選擇 add run script 3 在shell...

使用 xcodebuild 命令匯出 ipa 檔案

一 開啟乙個 terminal 視窗,進入到 xcode 工程檔案所在目錄,對於 cocos 工程需要進入到 proj.ios mac 目錄 二 執行 xcodebuild clean 進行清除 三 執行 xcodebuild archive scheme newcocosproject1 mobi...

命令列編譯之xcodebuild

a.確保xcodebuild命令能正常執行 如果使用xcodebuild命令出現如下錯誤 解決辦法 xcode select switch 新的xcode路徑 如b.xcodebuild使用 1.檢視xcode版本號和build號 b imac demo maricoliu xcodebuild v...