iOS開發系列-Shell腳本生成IPA


概述

在公司開發到了測試階段需要頻繁打包交付給測試,看似簡單的工作,重復的流程總是感覺不是那么好,我們可以借助蘋果提供的編譯指令編譯項目。

自動化腳本編譯打包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需要加參數-workspacescheme

#!/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關閉BitcodeNO


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM