概述
在公司開發到了測試階段需要頻繁打包交付給測試,看似簡單的工作,重復的流程總是感覺不是那么好,我們可以借助蘋果提供的編譯指令編譯項目。
自動化腳本編譯打包IPA
常見的iOS項目就是基於xcodeproj
。目前大部分公司項目都是用CocoaPod
管理第三方庫,也就是項目基於xcworkspace
。這兩種項目在編譯時候命令有一些區別,下面分別寫兩種腳本供參考。
普通項目編譯
PackageApplication
方式生成ipa的方式蘋果已經不建議使用了,取而代之的是xcodebuild -exportArchive
。
#!/bin/bash
ZWProjectName="TestProj"
ZWScheme="TestProj"
ZWConfiguration="Release"
ZWDate=`date +%Y%m%d_%H%M`
ZWWorkspace=`pwd`
echo "workspace=$ZWWorkspace-----------------------"
ZWBuildDir="$ZWWorkspace/build" #build路徑
ZWBuildTempDir="$ZWBuildDir/temp/$ZWDate" #構建過程中的文件
HCIpaDir="$ZWBuildDir/ipa" #生成ipa文件路徑
:<<!
#編譯 鏈接 簽名 生成app
#如果要構建workspace,你必須指定-workspace和-scheme參數。
xcodebuild \
-workspace "$ZWWorkspace/$ZWProjectName.xcodeproj/project.xcworkspace" \
-scheme "$ZWScheme" \
-configuration "$ZWConfiguration" \
clean \
build \
-derivedDataPath "$ZWBuildTempDir"
#CODE_SIGN_IDENTITY=證書
#PROVISIONING_PROFILE=描述文件UUID
#生成ipa 本質主要是對生成app進行壓縮成ipa
xcrun -sdk iphoneos \
-v PackageApplication "$ZWBuildTempDir/Build/Products/$ZWConfiguration-iphoneos/$ZWProjectName.app" \
-o "$HCIpaDir/$ZWDate.ipa" #這里反復報錯 如果輸出的目錄不存在就報錯 Unable to create '....." 解決辦法 手動穿件輸出測文件夾層級結構
#清除構建的文件
rm -rf $ZWBuildDir/temp
open $HCIpaDir
!
#-------PackageApplication已經不推薦使用了 warning: PackageApplication is deprecated, use `xcodebuild -exportArchive` instead.-----
xcodebuild archive \
-workspace "$ZWWorkspace/$ZWProjectName.xcodeproj/project.xcworkspace" \
-scheme "$ZWScheme" \
-configuration "$ZWConfiguration" \
-archivePath "$ZWBuildTempDir/$ZWProjectName.xcarchive"
CODE_SIGN_IDENTITY="" #證書
PROVISIONING_PROFILE="" #描述文件UUID
xcodebuild \
-exportArchive \
-archivePath "$ZWBuildTempDir/$ZWProjectName.xcarchive" \
-exportPath "$HCIpaDir/$ZWDate/" \
-exportOptionsPlist "./exportOptionsPlist.plist" \
#CODE_SIGN_IDENTITY="" #證書
#PROVISIONING_PROFILE="" #描述文件UUID
#這里不需要設置證書
#編譯流程
#1.首先看ZWConfiguration是Release還是Debug
#2.如果是Release那么就去General->Signing(Release)的Provisioning Profile編譯
#3.如果是Debug那么就去General->Signing(Debug)的Provisioning Profile編譯
#如果是發布store的包 只需將配置設置General->Signing(Release)的Provisioning Profile選擇Store 描述文件
:<<!
編寫過程遇到的報錯:
1.exportOptionsPlist.plist文件的編寫
xcode直接先Archive 拿到ExportOptions.plist
2.下面這個報錯糾結了我好久,
# Error Domain=NSCocoaErrorDomain Code=384
# 詳細報錯
#2018-03-06 17:18:43.013 xcodebuild[2836:4964380] [MT] IDEDistribution: -[IDEDistributionLogging _createLoggingBundleAtPath:]: Created bundle at path '/var/folders/rj/k7nnqyqd5xz7_lh9s2dc9z4m0000gn/T/TestProj_2018-03-06_17-18-43.012.xcdistributionlogs'.
#2018-03-06 17:18:43.476 xcodebuild[2836:4964380] [MT] IDEDistribution: Step failed: <IDEDistributionPackagingStep: 0x7f8ca5d414e0>: Error Domain=NSCocoaErrorDomain Code=3840 "No value." UserInfo={NSDebugDescription=No value., NSFilePath=/var/folders/rj/k7nnqyqd5xz7_lh9s2dc9z4m0000gn/T/ipatool-json-filepath-U38ZKM}
#error: exportArchive: The data couldn’t be read because it isn’t in the correct format.
#Error Domain=NSCocoaErrorDomain Code=3840 "No value." UserInfo={NSDebugDescription=No value., NSFilePath=/var/folders/rj/k7nnqyqd5xz7_lh9s2dc9z4m0000gn/T/ipatool-json-filepath-U38ZKM}
#** EXPORT FAILED **
# 最終發現了問題關閉compileBitcode 設置為NO
!
#通過蒲公英提供的上傳應用 API,調用系統的 curl 命令來上傳應用。
#FilePath="$HCIpaDir/$ZWDate/${ZWScheme}.ipa"
#UKey="User key" #開發者的用戶 Key,在應用管理-API中查看
#ApiKey="API key" #是開發者的 API Key,在應用管理-API中查看 注意不是APPKey
#chmod -R 777 "${FilePath}"
#curl \
#-F "file=@${FilePath}" \
#-F "uKey=${UKey}" \
#-F "_api_key=${ApiKey}" \
#https://www.pgyer.com/apiv2/app/upload
基於CocoaPod的工程腳本編譯
對於使用工作空間
管理工程,唯一不同的是在xcodebuild archive
需要加參數-workspace
與scheme
。
#!/bin/bash
ZWProjectName="lifeCristal"
ZWScheme="lifeCristal"
ZWConfiguration="Release"
ZWDate=`date +%Y%m%d_%H%M`
ZWWorkspace=`pwd`
echo "workspace=$ZWWorkspace-----------------------"
ZWBuildDir="$ZWWorkspace/build" #build路徑
ZWBuildTempDir="$ZWBuildDir/temp/$ZWDate" #構建過程中的文件
HCIpaDir="$ZWBuildDir/ipa" #生成ipa文件路徑
xcodebuild archive \
-workspace "$ZWWorkspace/$ZWProjectName.xcworkspace" \
-scheme "$ZWScheme" \
-configuration "$ZWConfiguration" \
-archivePath "$ZWBuildTempDir/$ZWProjectName.xcarchive"
CODE_SIGN_IDENTITY="" #證書
PROVISIONING_PROFILE="" #描述文件UUID
xcodebuild \
-exportArchive \
-archivePath "$ZWBuildTempDir/$ZWProjectName.xcarchive" \
-exportPath "$HCIpaDir/$ZWDate/" \
-exportOptionsPlist "./exportOptionsPlist.plist" \
CODE_SIGN_IDENTITY="" #證書
PROVISIONING_PROFILE="" #描述文件UUID
FilePath="$HCIpaDir/$ZWDate/${ZWScheme}.ipa"
UKey="013cca42bc5347715f895cfc8061f75f"
ApiKey="4861c59806712e3473c867520884236f"
chmod -R 777 "${FilePath}"
curl \
-F "file=@${FilePath}" \
-F "uKey=${UKey}" \
-F "_api_key=${ApiKey}" \
https://www.pgyer.com/apiv2/app/upload
證書跟描述文件UUID獲取
- 獲取本機可用的開發證書
security find-identity -v -p codesigning
- 獲取描述文件的UUDI
我們Mac電腦所有描述文件目錄個人資源庫/MobileDevice/Provisioning Profiles/
執行命令
/usr/bin/security cms -D -i 描述文件路徑
通常描述文件的名稱就是描述文件的UUID。
exportOptionsPlist.plist文件獲取
這個文件中的內容會隨着Xode的版本而發生改變。我這邊做法是自己手動打包第一次,將生成的ExportOptions.plist
改名為exportOptionsPlist.plist
。后續每次打包都是用這個plist就可以了。
創建的編譯報錯
在實際使用避免不了各種錯誤,下面對一些常見的錯誤解決。
Bitcode引發的錯誤
解決辦法:在exportOptionsPlist.plist
關閉Bitcode
為NO
。