前言:ios
iOS程序包分爲「.app格式的二進制文件包」和「.ipa格式的渠道包」兩種。xcodebuild 是一款用來打包 Xcode projects 或者 workspaces 的命令行工具。用xcodebuild把工程打成 app格式後,再用xcrun來簽名和打成ipa格式的包。本篇文章簡單講解一下本身使用的app打包命令。shell
正文:xcode
1、經過xcodebuild命令和xcrun命令打包服務器
xcodebuild命令和xcrun兩個命令必需在xxx.xcodeproj或者xxx.xcworkspace所在的目錄執行。app
(1) xcodebuildiphone
shell編譯工具,用xcodebuild把工程打成 app 格式,好比咱們有個叫作hello的項目,xcodebuild命令以下:工具
xcodebuild -workspace hello.xcworkspace -scheme hello -derivedDataPath "./" -sdk iphoneos -configuration Release clean build
參數解釋:ui
-workspace workspacename :指定 workspace 的名稱。spa
-scheme schemename:指定 scheme 的名稱,編譯 workspace 時是必須的。命令行
-derivedDataPath path:覆蓋編譯 workspace 的 scheme 時的結果數據存放的路徑。
-sdk [<sdkfullpath> | <sdkname>]:指定編譯時所用的 SDK。參數能夠是 SDK 的絕對路徑,也能夠是 SDK 的名稱。
可使用以下命令查看所支持的SDK : xcodebuild -showsdks .
-configuration configurationname:當編譯每一個 target 時使用 configurationname 指定的配置。默認是Release的。
CODE_SIGN_IDENTITY:選擇簽名的證書。
能夠用系統自帶的工具「鑰匙訪問串」來查看名字,若是不帶側參數,那麼在工程配置中必定要配置好證書以及受權文件!
clean built:每次生成app以前都會清除掉舊的記錄。
編譯過程:
好比有個ios工程叫hello,它由兩個project組成,一個是業務代碼hello,一個是引入的第三方庫Pods。project hello裏
project hello, 對應target hello
project Pods, 對應 target XX一、XX二、XX3...
那麼,上面的xcodebuild命令會作以下的事情:
(1)先clean掉project Pods對應的各個target XX一、XX二、XX3...
(2)而後build project Pods對應的各個target XX一、XX二、XX3..., 生成xxx.a文件。
(3)接下來build project Pods對應的target Pods-hello,生成libPods-hello.a文件。
(4)最後build project hello對應的target hello(此時會檢查鑰匙串中對應的證書)
即
=== CLEAN TARGET XXX OF PROJECT Pods WITH CONFIGURATION Distribution ===
=== BUILD TARGET XXX OF PROJECT Pods WITH CONFIGURATION Distribution ===
=== BUILD TARGET Pods-hello OF PROJECT Pods WITH CONFIGURATION Distribution ===
=== BUILD TARGET hello OF PROJECT hello WITH CONFIGURATION Distribution ===
xcodebuild會根據你的Xcode中的證書配置去鑰匙串裏,找你的工程裏配置的簽名證書。因此,必定要把證書安裝在mac的鑰匙串裏(打包服務器同樣),而且,Xcode的build setting中指定的Code Sign Identity與安裝的證書一致。不然會報錯:「No certificate matching 'iPhone Distribution: XXXX': Select a different signing certificate for CODE_SIGN_IDENTITY, a team that matches your selected certificate, or switch to automatic provisioning.」。
xcodebuild 執行成功以後,會在工程的根目錄下產生一個build文件夾,在build/Distribution-iphoneos目錄下就能找到生成的app文件。
(2) xcrun
xcrun是ipa打包工具,用xcrun來對.app格式的包簽名和打成ipa格式的包。下面用xcrun把第一步xcodebuild產生的.app文件生成.ipa文件:
xcrun -sdk iphoneos PackageApplication -v Build/Products/Distribution-iphoneos/hello.app -o `pwd`/Build/Products/hello.ipa
參數解釋:
-v 對應的是app文件的絕對相對路徑
–o 對應ipa文件的路徑跟文件名,`pwd` 是當前路徑的意思
2、對ipa包重簽名
要先準備好配置文件EIMMyApp.mobileprovison,以及簽名的plist格式的Entitilements文件。另外,要把對應的證書安裝到鑰匙串中。而後按照下面的5步運行就能夠對.ipa包進行重簽名了:
(1).ipa包解壓成.app包:
unzip myAppName.ipa ,生成Payload/myAppName.app
(2)移除老的 code signatures:
rm -r Payload/myAppName.app/_CodeSignature
(3)拷貝EIMMyApp.mobileprovison來覆蓋原來的embedded.mobileprovision :
cp EIMMyApp.mobileprovision Payload/myAppName.app/embedded.mobileprovision
(4)重簽名:
codesign -f -v -s "iPhone Distribution: XXXX" --entitlements entitlements.plist Payload/myAppName.app
(咱們知道如今的簽名都是根據plist格式的Entitlements文件來指定的)
(5)將.app包打包成.ipa包:
zip -yr eimQQ.resigned.ipa Payload