使用xcodebuild打包 導出ipa 上傳蒲公英或者提交AppStore

/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文件的內(nèi)容可以使用PlistBuddy,PlistBuddy是Mac里一個用于命令行下讀寫plist文件的工具杭措,在/usr/libexec/下∈炙兀可以通過它讀取或修改plist文件的內(nèi)容。
#!/bin/sh
# PlistBuddy程序的絕對路徑
PlistBuddyPath=/usr/libexec/PlistBuddy
appInfoPlistPath="/Volumes/SourceCode/showstart_ios/ShowStart_3.0/Info.plist"
bundleShortVersion=$($PlistBuddyPath -c "print CFBundleShortVersionString" ${appInfoPlistPath})
bundleVersion=$($PlistBuddyPath  -c "print CFBundleVersion" ${appInfoPlistPath})
echo "$bundleShortVersion"
echo "$bundleVersion"

buildNumber="3.69"

bundleVersion=$($PlistBuddyPath  -c "Set :CFBundleVersion $buildNumber" ${appInfoPlistPath})
bundleVersion=$($PlistBuddyPath  -c "print CFBundleVersion" ${appInfoPlistPath})
echo "$bundleVersion"

開始打包

  • 百度了一下大多數(shù)文章使用xcodeuildxcrun編譯導出ipa
xcodebuild -workspace XXX -scheme XXX -configuration Release
xcrun -sdk iphoneos PackageApplication -v "/XXX/XXX.app" -o "/XXX/XXX"
  • 另一種是xcodebuildarchive-exportArchive,然而最新需要使用--exportOptionsPlist選項,而不再使用--exportFromat
  • 使用xcodebuild -help命令可查看--exportOptionsPlist選項具體描述

如何獲取工程的CODE_SIGN_IDENTITYPROVISIONING_PROFILE

  • 右鍵 xxx.xcodeproj 顯示包內(nèi)容 然后打開project.pbxproj文件
  • command F 搜索 CODE_SIGN_IDENTITY PROVISIONING_PROFILE
QQ20161106-0.png
QQ20161106-1.png
  • PROVISIONING_PROFILE 使用uuid或者名稱都可以

  • 注意 因為我這里打包用的Release模式所以,我在查找CODE_SIGN_IDENTITYPROVISIONING_PROFILE都是找的Release模式配置

  • 使用atool時 最終輸出的xml 中包含 success-message表示成功,如果包含product-errors表示失敗

  • 執(zhí)行腳本

// 首先把兩個plist和腳本放到工程根目錄,然后打開terminal進入項目
// 第一次需要設(shè)置腳本的執(zhí)行權(quán)限
chmod +x xcodebuild.sh
// 執(zhí)行腳本
./xcodebuild.sh

完整的腳本 其中 xxxx 替換為你自己的

#!/bin/sh

echo "~~~~~~~~~~~~~~~~開始執(zhí)行腳本~~~~~~~~~~~~~~~~"


# 開始時間
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 "參數(shù)無效...."
    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 "參數(shù)無效...."
        exit 1
        fi
    else
        UPLOADPGYER=false
    fi
fi


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

echo "~~~~~~~~~~~~~~~~開始構(gòu)建~~~~~~~~~~~~~~~~~~~"
#開始構(gòu)建
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 "~~~~~~~~~~~~~~~~檢查是否構(gòu)建成功~~~~~~~~~~~~~~~~~~~"
# xcarchive 實際是一個文件夾不是一個文件所以使用 -d 判斷
if [ -d "$ARCHIVEPATH" ]
then
echo "構(gòu)建成功......"
else
echo "構(gòu)建失敗......"
rm -rf $BUILDPATH
exit 1
fi
endTime=`date +%s`
ArchiveTime="構(gòu)建時間$[ 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失敗......"
# 結(jié)束時間
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 "file=@$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 "開始執(zhí)行腳本時間: ${DATE}"
echo "編譯模式: ${CONFIGURATION_TARGET}"
echo "導出ipa配置: ${ExportOptionsPlist}"
echo "打包文件路徑: ${ARCHIVEPATH}"
echo "導出ipa路徑: ${IPAPATH}"

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

github

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子辕漂,更是在濱河造成了極大的恐慌,老刑警劉巖钉嘹,帶你破解...
    沈念sama閱讀 211,194評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異缨睡,居然都是意外死亡陈辱,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,058評論 2 385
  • 文/潘曉璐 我一進店門陋守,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人水评,你說我怎么就攤上這事媚送。” “怎么了塘偎?”我有些...
    開封第一講書人閱讀 156,780評論 0 346
  • 文/不壞的土叔 我叫張陵,是天一觀的道長博敬。 經(jīng)常有香客問我峰尝,道長收恢,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,388評論 1 283
  • 正文 為了忘掉前任伦意,我火速辦了婚禮,結(jié)果婚禮上熏矿,老公的妹妹穿的比我還像新娘。我一直安慰自己票编,他們只是感情好,可當我...
    茶點故事閱讀 65,430評論 5 384
  • 文/花漫 我一把揭開白布鲤竹。 她就那樣靜靜地躺著昔榴,像睡著了一般辛藻。 火紅的嫁衣襯著肌膚如雪吱肌。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,764評論 1 290
  • 那天岩榆,我揣著相機與錄音,去河邊找鬼勇边。 笑死折联,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的诚镰。 我是一名探鬼主播,決...
    沈念sama閱讀 38,907評論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼月杉,長吁一口氣:“原來是場噩夢啊……” “哼抠艾!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起检号,我...
    開封第一講書人閱讀 37,679評論 0 266
  • 序言:老撾萬榮一對情侶失蹤齐苛,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后凹蜂,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體阁危,經(jīng)...
    沈念sama閱讀 44,122評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡汰瘫,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,459評論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了菱父。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,605評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡浙宜,死狀恐怖粟瞬,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情萤捆,我是刑警寧澤裙品,帶...
    沈念sama閱讀 34,270評論 4 329
  • 正文 年R本政府宣布,位于F島的核電站俗或,受9級特大地震影響市怎,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜辛慰,卻給世界環(huán)境...
    茶點故事閱讀 39,867評論 3 312
  • 文/蒙蒙 一区匠、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧帅腌,春花似錦驰弄、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,734評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至溺职,卻和暖如春岔擂,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背辅愿。 一陣腳步聲響...
    開封第一講書人閱讀 31,961評論 1 265
  • 我被黑心中介騙來泰國打工智亮, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人点待。 一個月前我還...
    沈念sama閱讀 46,297評論 2 360
  • 正文 我出身青樓,卻偏偏與公主長得像弃舒,于是被迫代替她去往敵國和親癞埠。 傳聞我的和親對象是個殘疾皇子状原,可洞房花燭夜當晚...
    茶點故事閱讀 43,472評論 2 348

推薦閱讀更多精彩內(nèi)容