1. 程式人生 > >iOS 應用打包命令一覽

iOS 應用打包命令一覽

文章排版部分根據自己的理解做了一些修改。

各種命令的簡介

使用命令打包iOS 應用一般會用到 xcodebulidxcrun
xcodebuild主要是用來編譯工程。
xcrun 則是打包出ipa安裝包。
altool 適用於提交到AppStore 的。

想要知道更多關於xcodebuild 命令引數,則可以使用xcodebuild -help 檢視;
想要知道更多關於xcrun 命令引數,則可是用xcrun -help 檢視。

另外,官方文件中有對 Workspace、Project、Scheme、Target更詳細的講解,地址是:Xcode Concepts

altool

這個工具實際上是ApplicationLoader,開啟Xcode-左上角Xcode-Open Developer Tool-Application Loader,altool的路徑是:

/Applications/Xcode.app/Contents/Applications/Application\ Loader.app/Contents/Frameworks/ITunesSoftwareService.framework/Support/altool

如果使用時,報如下錯誤:

altool[] *** Error: 
Exception while launching iTunesTransporter: Transporter not
found at path: /usr/local/itms/bin/iTMSTransporter. You should reinstall the application.

建立軟鏈:

ln -s /Applications/Xcode.app/Contents/Applications/Application\ Loader.app/Contents/itms /usr/local/itms

如果想要在指令碼中修改或者讀取plist檔案的內容,可以使用PlistBuddyPlistBuddy是Mac裡一個用於命令列下讀寫plist檔案的工具,在/usr/libexec/目錄下。

下面是一段讀取與修改 plist 中版本號的shell指令碼:

#!/bin/sh
# PlistBuddy程式的絕對路徑
PlistBuddyPath=/usr/libexec/PlistBuddy
# 工程中的plist 檔案路徑
appInfoPlistPath="/Volumes/SourceCode/showstart_ios/ShowStart_3.0/Info.plist"
# 讀取bundleShortVersion 版本號
bundleShortVersion=$($PlistBuddyPath -c "print CFBundleShortVersionString" ${appInfoPlistPath})
# 讀取bundleVersion 版本號
bundleVersion=$($PlistBuddyPath  -c "print CFBundleVersion" ${appInfoPlistPath})
# 在終端中列印版本號
echo "$bundleShortVersion"
echo "$bundleVersion"

buildNumber="3.69"
# 重新設定 plist檔案中的bundleVersion版本號
bundleVersion=$($PlistBuddyPath  -c "Set :CFBundleVersion $buildNumber" ${appInfoPlistPath})
# 再次讀取bundleVersion 版本號
bundleVersion=$($PlistBuddyPath  -c "print CFBundleVersion" ${appInfoPlistPath})
# 列印版本號
echo "$bundleVersion"

Xcode 8之前的打包命令

在Xcode 8之前打包,都是使用xcodebuild+xcrun 來打包ipa包。比如:

xcodebuild -workspace XXX -scheme XXX -configuration Release
xcrun -sdk iphoneos PackageApplication -v "/XXX/XXX.app" -o "/XXX/XXX"

需要注意的是,如果我們同時安裝了多個Xcode,比如我這裡同時安裝的Xcode 7 和 Xcode 8,使用 xcodeuild+xcrun 來打包ipa包 時,會出現如下錯誤:

2016-11-07 13:43:04.724 xcodebuild[22235:709735] CoreSimulator is attempting to unload a stale CoreSimulatorService job.  Detected Xcode.app relocation or CoreSimulatorService version change.  Framework path (/Applications/Xcode.app/Contents/Developer/Library/PrivateFrameworks/CoreSimulator.framework) and version (209.19) does not match existing job path (/Applications/Xcode_8.app/Contents/Developer/Library/PrivateFrameworks/CoreSimulator.framework/Versions/A/XPCServices/com.apple.CoreSimulator.CoreSimulatorService.xpc/Contents/MacOS/com.apple.CoreSimulator.CoreSimulatorService) and version (303.8).
2016-11-07 13:43:04.982 xcodebuild[22235:709735] Failed to locate a valid instance of CoreSimulatorService in the bootstrap.  Adding it now.
2016-11-07 13:43:04.996 xcodebuild[22235:709735] *** Assertion failure in -[SimServiceContext reloadServiceIfMovedOrAbortIfWeAreInvalid], /BuildRoot/Library/Caches/com.apple.xbs/Sources/CoreSimulator/CoreSimulator-209.19/CoreSimulator/SimServiceContext.m:536
** INTERNAL ERROR: Uncaught exception **
Uncaught Exception: The loaded com.apple.CoreSimulator.CoreSimulatorService job does not match our expectations: pathOfLoadedJob: /Applications/Xcode_8.app/Contents/Developer/Library/PrivateFrameworks/CoreSimulator.framework/Versions/A/XPCServices/com.apple.CoreSimulator.CoreSimulatorService.xpc/Contents/MacOS/com.apple.CoreSimulator.CoreSimulatorService, our frameworkPath: /Applications/Xcode.app/Contents/Developer/Library/PrivateFrameworks/CoreSimulator.framework

我在stackoverflow上找到了解決方案:
在終端中執行如下命令:

launchctl remove com.apple.CoreSimulator.CoreSimulatorService || true

Xcode 8 以及 之後的打包命令

安裝Xcode 8之後,使用xcodebuild+xcrun 打包時, 會提示 讓我們使用 -exportArchive 命令來構建。

關於 -exportArchive,在 xcodebuild -help 中有如下提示:

xcodebuild -exportArchive -archivePath <xcarchivepath> -exportPath <destinationpath> -exportOptionsPlist <plistpath>

······

-exportOptionsPlist PATH            specifies a path to a plist file that configures archive exporting

如何獲取工程的CODE_SIGN_IDENTITYPROVISIONING_PROFILE

右鍵 xxx.xcodeproj 顯示包內容 然後開啟project.pbxproj檔案
command F 搜尋 CODE_SIGN_IDENTITYPROVISIONING_PROFILE

PROVISIONING_PROFILE 使用uuid或者名稱都可以。
因為我這裡打包用的Release模式所以,我在查詢CODE_SIGN_IDENTITYPROVISIONING_PROFILE都是找的Release模式配置。
使用atool時 最終輸出的xml 中包含 success-message表示成功,如果包含product-errors表示失敗。

我們可以將要執行的命令,寫進一個shell指令碼檔案中,這樣更方便執行。
給一個檔案新增執行許可權的命令是:

chmod +x xcodebuild.sh

進入指令碼所在的目錄,執行指令碼,有兩種方式

// 第一種
sh xxxx.sh
// 第二種
./xxxx.sh

指令碼中執行if 條件判斷的格式:

if []
then
.......//執行的命令
else
.......//執行的命令
fi

完整的指令碼如下:

#!/bin/sh

echo "~~~~~~~~~~~~~~~~開始執行指令碼~~~~~~~~~~~~~~~~"
# 開始時間
beginTime=`date +%s`
DATE=`date '+%Y-%m-%d-%T'`
#需要編譯的 targetName
TARGET_NAME="xxxx"
#編譯模式 工程預設有 Debug Release 
CONFIGURATION_TARGET=Release
#編譯路徑
BUILDPATH=~/Desktop/${TARGET_NAME}_${DATE}
#archivePath
ARCHIVEPATH=${BUILDPATH}/${TARGET_NAME}.xcarchive
#輸出的ipa目錄
IPAPATH=${BUILDPATH}

#證書名
CODE_SIGN_IDENTITY="xxxxx"
#描述檔案
PROVISIONING_PROFILE_NAME="xxxx"

#蘋果賬號
AppleID="xxxx"
AppleIDPWD="xxxx"

#匯出ipa 所需plist
ADHOCExportOptionsPlist=./ADHOCExportOptionsPlist.plist
AppStoreExportOptionsPlist=./AppStoreExportOptionsPlist.plist

ExportOptionsPlist=${ADHOCExportOptionsPlist}

# 是否上傳蒲公英
UPLOADPGYER=false
# 是否上傳AppStore
UPLOADAPPSTore=false

echo "~~~~~~~~~~~~~~~~選擇打包方式~~~~~~~~~~~~~~~~"
echo "        1 ad-hoc (預設)"
echo "        2 AppStore "

# 讀取使用者輸入並存到變數裡
read parameter
sleep 0.5
method="$parameter"

# 判讀使用者是否有輸入 
if [ -n "$method" ]
then
    if [ "$method" = "1" ]
    then 
    PROVISIONING_PROFILE_NAME="xxxx"
    ExportOptionsPlist=${ADHOCExportOptionsPlist}
    elif [ "$method" = "2" ]
    then
    UPLOADAPPSTore=true
    PROVISIONING_PROFILE_NAME="xxxx"
    ExportOptionsPlist=${AppStoreExportOptionsPlist}
    else
    echo "引數無效...."
    exit 1
    fi
else
    ExportOptionsPlist=${ADHOCExportOptionsPlist}
fi

if [ $UPLOADAPPSTore = false ]
then
    echo "~~~~~~~~~~~~~~~~是否上傳蒲公英~~~~~~~~~~~~~~~~"
    echo "        1 不上傳 (預設)"
    echo "        2 上傳 "
    read para
    sleep 0.5

    if [ -n "$para" ]
    then
        if [ "$para" = "1" ]
        then 
        UPLOADPGYER=false
        elif [ "$para" = "2" ]
        then
        UPLOADPGYER=true
        else
        echo "引數無效...."
        exit 1
        fi
    else
        UPLOADPGYER=false
    fi
fi


echo "~~~~~~~~~~~~~~~~開始編譯~~~~~~~~~~~~~~~~~~~"
echo "~~~~~~~~~~~~~~~~開始清理~~~~~~~~~~~~~~~~~~~"
# 清理 避免出現一些莫名的錯誤
xcodebuild clean -workspace ${TARGET_NAME}.xcworkspace \
-configuration \
${CONFIGURATION} -alltargets

echo "~~~~~~~~~~~~~~~~開始構建~~~~~~~~~~~~~~~~~~~"
#開始構建
xcodebuild archive -workspace ${TARGET_NAME}.xcworkspace \
-scheme ${TARGET_NAME} \
-archivePath ${ARCHIVEPATH} \
-configuration ${CONFIGURATION_TARGET} \
CODE_SIGN_IDENTITY="${CODE_SIGN_IDENTITY}" \
PROVISIONING_PROFILE="${PROVISIONING_PROFILE_NAME}"

echo "~~~~~~~~~~~~~~~~檢查是否構建成功~~~~~~~~~~~~~~~~~~~"
# xcarchive 實際是一個資料夾不是一個檔案所以使用 -d 判斷
if [ -d "$ARCHIVEPATH" ]
then
echo "構建成功......"
else
echo "構建失敗......"
rm -rf $BUILDPATH
exit 1
fi
endTime=`date +%s`
ArchiveTime="構建時間$[ endTime - beginTime ]秒"


echo "~~~~~~~~~~~~~~~~匯出ipa~~~~~~~~~~~~~~~~~~~"

beginTime=`date +%s`

xcodebuild -exportArchive \
-archivePath ${ARCHIVEPATH} \
-exportOptionsPlist ${ExportOptionsPlist} \
-exportPath ${IPAPATH}

echo "~~~~~~~~~~~~~~~~檢查是否成功匯出ipa~~~~~~~~~~~~~~~~~~~"
IPAPATH=${IPAPATH}/${TARGET_NAME}.ipa
if [ -f "$IPAPATH" ]
then
echo "匯出ipa成功......"
else
echo "匯出ipa失敗......"
# 結束時間
endTime=`date +%s`
echo "$ArchiveTime"
echo "匯出ipa時間$[ endTime - beginTime ]秒"
exit 1
fi

endTime=`date +%s`
ExportTime="匯出ipa時間$[ endTime - beginTime ]秒"

# 上傳AppStore
if [ $UPLOADAPPSTore = true ]
then    

    altoolPath="/Applications/Xcode.app/Contents/Applications/Application\ Loader.app/Contents/Frameworks/ITunesSoftwareService.framework/Versions/A/Support/altool"
    ${altoolPath} --validate-app \
    -f ${IPAPATH} \
    -u ${AppleID} \
    -p ${AppleIDPWD} \
    -t ios --output-format xml

        if [ $? = 0 ]
        then
        echo "~~~~~~~~~~~~~~~~驗證ipa成功~~~~~~~~~~~~~~~~~~~"
            ${altoolPath} --upload-app \
            -f ${IPAPATH} \
            -u ${AppleID} \
            -p ${AppleIDPWD} \
            -t ios --output-format xml

            if [ $? = 0 ]
            then
            echo "~~~~~~~~~~~~~~~~提交AppStore成功~~~~~~~~~~~~~~~~~~~"
            else
            echo "~~~~~~~~~~~~~~~~提交AppStore失敗~~~~~~~~~~~~~~~~~~~"
            fi
        else
        echo "~~~~~~~~~~~~~~~~驗證ipa失敗~~~~~~~~~~~~~~~~~~~"
        fi
else
    # 上傳蒲公英    
    if [ $UPLOADPGYER = true ]
    then
        echo "~~~~~~~~~~~~~~~~上傳ipa到蒲公英~~~~~~~~~~~~~~~~~~~"
        curl -F "[email protected]$IPAPATH" \
        -F "uKey=xxxxx" \
        -F "_api_key=xxxx" \
        -F "password=xxxxx" \
        -F "isPublishToPublic=xxxx" \
        https://www.pgyer.com/apiv1/app/upload --verbose

        if [ $? = 0 ]
        then
        echo "~~~~~~~~~~~~~~~~上傳蒲公英成功~~~~~~~~~~~~~~~~~~~"
        else
        echo "~~~~~~~~~~~~~~~~上傳蒲公英失敗~~~~~~~~~~~~~~~~~~~"
        fi
    fi
fi

echo "~~~~~~~~~~~~~~~~配置資訊~~~~~~~~~~~~~~~~~~~"
echo "開始執行指令碼時間: ${DATE}"
echo "編譯模式: ${CONFIGURATION_TARGET}"
echo "匯出ipa配置: ${ExportOptionsPlist}"
echo "打包檔案路徑: ${ARCHIVEPATH}"
echo "匯出ipa路徑: ${IPAPATH}"

echo "$ArchiveTime"
echo "$ExportTime"
exit 1

相關推薦

iOS 應用打包命令一覽

文章排版部分根據自己的理解做了一些修改。 各種命令的簡介 使用命令打包iOS 應用一般會用到 xcodebulid 和 xcrun。 xcodebuild主要是用來編譯工程。 xcrun 則是打包出ipa安裝包。 altool 適用於提交到Ap

iOS應用打包完後再在開發者網站新增應用測試ID能夠加入測試嗎

1、明確指出 不行: 1、打包測試包前一定要先新增測試裝置的UDID 2、新增測試的裝置UDID一定要先於打包測試包,否則裝置無法參加測試 3、使用蒲公英分享測試包,檢視可參加測試的裝置UDID 2、上傳與檢視步驟 2.1 上傳 登

IOS應用打包釋出遇到的坑

http://blog.csdn.net/shanglanxin/article/details/42423323 http://blog.csdn.net/fuzongjian/a

iOS越獄開發】怎樣將應用打包成.ipa文件

ria font 配置文件 例如 方法 col stat pack 應該 在項目開發中。我們經常須要將project文件打包成.ipa文件。提供給越獄的iphone安裝。 以下是一種方法: 1、首先應該給project安裝好配置文件(這裏不再敖述),在ios de

HBuilder工作筆記001---HBuilder打包安卓和ios應用

     JAVA技術交流QQ群:170933152  我打包的時候報這個錯誤: 這裡的證書需要用蘋果賬號,在中國蘋果網站上,進行申請,稽核,生成,就可以了,但是生成的時候,聽同事說,需要繫結 手機的唯一標識,也就是說,哪個

iOS 測試 xcodebuild 命令打包遇到的坑與解決方案 2017

第一個問題 ** INTERNAL ERROR: Uncaught exception ** Uncaught Exception: -[__NSCFString objectForKeyedSubscript:]: unrecognized selector sent to instance

React Native釋出APP之打包iOS應用

瞭解更多,可學習《React Native視訊教程》 ,或關注我的GitHub和加入: React Native學習交流群 用React Native開發好APP之後,如何將APP釋出以供使用者使用呢?一款APP的釋出流程無外乎:簽名打包—>釋出到各s

springboot 應用打包及啟動命令

maven 打jar 包 首先pom.xml檔案中需要有這麼一個配置 1.使用IDEA中的maven工具打包: 在一連串下載後得出 說明打包成功 2.使用 mvn package 命令打包: 可以利用IDEA 的 Terminal ,其預設的路徑就

用hbuilder打包網站專案為apk或ios應用

打包之前,必須將原來核心檔案中呼叫檔案改為絕對地址:  * API核心檔案  */ require("http://www.ilele.top/class/con.php"); require("http://www.ilele.top/class/sql.php"); r

Ad_Hoc方式打包iOS應用程式

如果想要將做的iOS應用程式安裝到自己的iOS裝置上測試、或者安裝到別人的iOS裝置上,或者想釋出到App Store中,先要給應用簽名。簽名就要有證書,這就需要申請證書的過程了。 把自己的應用程式安裝到裝置中,主要有一下幾種方式: 1、 把iOS裝置與電

iOS自動構建以及打包命令(xcodebuild,xcrun)

兩個命令的語法以及使用方法,資料比較多,到處都可以找到,比如: xcodebuild負責將工程原始檔編譯成xxx.appxcrun負責給xxx.app(簽名並)打包成xxx.ipa 構建APP

如何使用別人的證書通過xcode打包iOS應用

要在別的電腦使用別人的蘋果帳號打包app,需要兩個檔案:●該證書匯出的“.p12”檔案.p12檔案是包含證書公鑰和私鑰的檔案,通過“鑰匙串”程式匯出●蘋果開發者帳號中與“證書”對應的“描述檔案”(.mobieProvison profile)在apple developer後

(九)將iOS應用注入dylib和hook後,重新簽名並打包

iOS攻防 - (九)將iOS應用hook和注入dylib後,重新簽名並打包 1.下載微信,並解密WeChat.ipa 2.檢視解密後的微信的基本資訊 通過cd命令到解密後微信的目錄,名稱com.tencent.xin-iOS7.0-(Clut

iOS自動構建以及打包命令(xcbuild)

xcbuild是一個相容Xcode的編譯工具,它能使編譯更快快速,更友好的編譯過程日誌,可以執行在多個平臺(主要指OS X和Linux)。 目前該專案還比較新,應該是剛從xctool中剝離出來,只能

iOS]關於 App 混合(Hybrid)開發的優化,包括H5、Weex等(本篇博客主要針對 iOS 應用講解,但該思想同樣適用於Android)

color 數據 後臺 lib 新版 生成 下載地址 代碼 版本   我們知道混合開發,可以節省很多成本(時間成本,經濟成本等等),所以有很多公司比較鐘愛這種開發形式,今天所講的優化方式,也是我在我們公司的應用中實際用了的,而且我寫的這個優化的 SDK 已經開源到 gith

iOS 應用內跳轉到系統設置

photo pod style software lin vol ios5 per man 在iOS5下面版本號使用下面方法:【IOS5.1+之後不能使用此方法,iOS8的跳轉方法已找到見下方,iOS7的正在摸索。歡迎大家給出觀點意見】 通過URL Scheme的方

iOS 應用評分

nsurl ati .com ppi dap type nbsp 展示 uia 為了提高應用的用戶體驗,經常需要邀請用戶對應用進行評分 應用評分無非就是跳轉到AppStore展示自己的應用,然後由用戶自己撰寫評論 如何跳轉到AppStore,並且展示自己的應用 方法1

IOS 應用跳轉 (IOS9白名單)

tom super created reat 獲取 import 字符 ges ict 跳轉到指定app的實現 IOS中應用的跳轉是通過URL實現的,因此在實現應用跳轉之前我們要設置一下對應的URL。 圖一(尋找配置軟件的URL) 圖二(具體配置選項) 註意: 如果IO

避免SIGPIPE導致的iOS應用閃退/Avoiding SIGPIPE signal crash in iOS(mach_msg_trap、SIGPIPE信號)

sig and 連接 mac os 找到 option sock ram round 問題描述: 應用運行時,鎖屏後再打開有一定幾率閃退。通過真機調試發現程序會中斷在此處: libsystem_kernel.dylib`mach_msg_trap: 解決思路: 通

unix關於打包命令zip的使用

art 嘗試 home 關於 命令 ext javascrip 全部 解壓 unix zip命令的基本使用方法是: zip [參數] [打包後的文件名稱] [打包的文件夾路徑] linux zip命令參數列表: -a 將文件轉成ASCII模式