關(guān)于xocde自動(dòng)化打包,其實(shí)網(wǎng)上的內(nèi)容很多,自己在網(wǎng)上也找到了很多,大部分都是很正確的,這里我就只說(shuō)下workspace的打包。
步驟:
1.首先運(yùn)行到你的project目錄下。cd?/Users/admin/Desktop/project
2.clear你的項(xiàng)目。xcodebuild clean 或者usr/bin/xcodebuild clean
3.build你的項(xiàng)目。xcodebuild -workspace 或者usr/bin/xcodebuild?-workspace項(xiàng)目名稱.xcworkspace -scheme scheme名稱(大部分跟項(xiàng)目名稱是一樣的,只要你沒(méi)改的話) -sdk iphoneos -configuration Release -derivedDataPath build ? ?
這個(gè)命令會(huì)在你的項(xiàng)目列表下創(chuàng)建一個(gè)build的目錄,如果你不想創(chuàng)建在這里的話,你可以在derivedDataPath后面空格之后輸入你的想保存build文件的路徑地址。
4.打包成ipa。xcrun或者usr/bin/xcrun -sdk iphoneos PackageApplication -v 第三步build成功的(項(xiàng)目名稱.app)文件路徑 -o 保存ipa的路徑(如:/Users/admin/Desktop/xxx.ipa)
注意:
這里Xcode8.3之后沒(méi)有PackageApplication文件,需要下載之后復(fù)制在:右鍵 Xcode.app -> 顯示包內(nèi)容 -> Contents -> Developer -> platforms -> iPhoneOS.platform -> Developer -> usr -> bin,進(jìn)入這個(gè)目錄之后,將下載的PackageApplication復(fù)制到這個(gè)目錄。
之后執(zhí)行命令:cd 到這個(gè)目錄下 ?之后 chmod +x?PackageApplication賦予這個(gè)文件你執(zhí)行的權(quán)利。
先上一份打包ipa腳本代碼:
#項(xiàng)目地址
PROJECTPATH='/Users/admin/Desktop/projectName'
#app的地址
TARGET_APP_PATH="$PROJECTPATH/build/Build/Products/Release-iphoneos/projectName.app"
#保存ipa地址
IPAPATH='/Users/admin/Desktop/appipa'
? ? ? ? cd $PROJECTPATH
? ? ? ? #清除
? ? ? ? xcodebuild clean
? ? ? ? #編譯 build
? ? ? ? xcodebuild -workspace projectName.xcworkspace -scheme projectName -sdk iphoneos -configuration Release -derivedDataPath build
#xcworkspace打包
? ? ? ? xcrun -sdk iphoneos PackageApplication -v $TARGET_APP_PATH -o "$IPAPATH/xxx.ipa"
?? ? ? rm -rf ./Build
接下來(lái)就是.app企業(yè)簽名過(guò)程:
其實(shí)上面:
?#編譯 build
xcodebuild -workspace projectName.xcworkspace -scheme?projectName?-sdk iphoneos -configuration Release -derivedDataPath build
這個(gè)步驟已經(jīng)編譯出來(lái).app文件了,直接給這個(gè).app文件簽名就可以了。
簽名步驟:
注:$TARGET_APP_PATH為你.app文件的路徑。
1.首先你需要把你簽名的.mobileprovision文件改名為embedded.mobileprovision,然后復(fù)制到.app文件里面,替換其中的embedded.mobileprovision。
cp 企業(yè)簽名embedded.mobileprovision文件的路徑 ?.app的路徑
2.如果有的話,刪除extension和WatchAPP.個(gè)人證書(shū)沒(méi)法簽名Extention
rm -rf "$TARGET_APP_PATH/PlugIns"
?rm -rf"$TARGET_APP_PATH/Watch"
3.如果你想更改bundleid或者version或者displayname的話,你可以直接在.app文件下面的info.plist進(jìn)行更改。
/usr/libexec/PlistBuddy -c "Set :CFBundleIdentifier $bundleId" "$TARGET_APP_PATH/Info.plist"
4.給MachO文件上執(zhí)行權(quán)限:
# 拿到MachO文件的路徑
? ? ? ? APP_BINARY=`plutil -convert xml1 -o - $TARGET_APP_PATH/Info.plist|grep -A1 Exec|tail -n1|cut -f2 -d\>|cut -f1 -d\<`
? ? ? ? #上可執(zhí)行權(quán)限
? ? ? ? chmod +x"$TARGET_APP_PATH/$APP_BINARY"
5.需要手動(dòng)給.app里面所有的FrameWorks進(jìn)行簽名,如果沒(méi)有FrameWorks文件的話就不需要重簽了。
TARGET_APP_FRAMEWORKS_PATH="$TARGET_APP_PATH/Frameworks"
? ? ? ? if [ -d "$TARGET_APP_FRAMEWORKS_PATH" ];
? ? ? ? then
? ? ? ? for FRAMEWORK in "$TARGET_APP_FRAMEWORKS_PATH/"*
? ? ? ? ? ? do
? ? ? ? ? ? #簽名
? ? ? ? ? ? /usr/bin/codesign --force --sign "iPhone Distribution:xxx?Co.,Ltd" "$FRAMEWORK"
? ? ? ? ? ? done
? ? ? ? fi
6.對(duì)你的.app文件進(jìn)行重簽名。
codesign -fs?"iPhone Distribution:xxx?Co.,Ltd"?--no-strict --entitlements=簽名需要的plist文件路徑 $TARGET_APP_PATH
注意:其中簽名需要的plist文件路徑需要自己去創(chuàng)建,創(chuàng)建步驟如下:
獲取embedded.mobileprovision的信息的命令為:
通過(guò)下屬命令獲取里面的文件信息security cms -D -i embedded.mobileprovision/*
終端會(huì)打印出來(lái)所有信息,我們需要選擇Entitlements為key的字典,將其copy出來(lái),
*/
copy的模塊內(nèi)容如下:

可以在xcode中,選中plist文件,右鍵,openAs--SourceCode,將內(nèi)容copy進(jìn)去保存即可。
將上面的文件命名為elements.plist(任意名字都可以,為了方便理解)文件放到Payload同級(jí)目錄下(其實(shí)放哪都行,只是為了操作方便)。
接下來(lái)直接貼代碼:
#項(xiàng)目地址
PROJECTPATH='/Users/liu/Desktop/projectName'
#app的地址
TARGET_APP_PATH="$PROJECTPATH/build/Build/Products/Release-iphoneos/projectName.app"
#保存ipa地址
IPAPATH='/Users/admin/Desktop/appipa'
#企業(yè)(enterprise)證書(shū)名
CODE_SIGN_NAME="iPhone Distribution: xxx Co.,Ltd"
#mobileprovision文件
mobile_provision="/Users/admin/Desktop/IR/embedded.mobileprovision"
#簽名embedded.plist路徑
embedded_plist_path="/Users/admin/Desktop/IR/embedded.plist"
#? ? ? ? ? 打包
? ? ? ? cd $PROJECTPATH
? ? ? ? #清除
? ? ? ? xcodebuild clean
? ? ? ? #打包
? ? ? ? #編譯 build
? ? ? ? xcodebuild -workspace D9Lottery.xcworkspace -scheme D9Lottery -sdk iphoneos -configuration Release -derivedDataPath build
###########################
#? ? ? .app文件簽名
? ? ? ? #cp -r $TARGET_APP_PATH "/Users/wz/Desktop/appipa"
? ? ? ? cp $mobile_provision $TARGET_APP_PATH
? ? ? ? printMessage"復(fù)制embedded.mobileprovision"
? ? ? ? #----------------------------------------
? ? ? ? # 3. 刪除extension和WatchAPP.個(gè)人證書(shū)沒(méi)法簽名Extention
? ? ? ? rm -rf"$TARGET_APP_PATH/PlugIns"
? ? ? ? rm -rf"$TARGET_APP_PATH/Watch"
? ? ? ? #----------------------------------------
? ? ? ? # 4. 更新info.plist文件 CFBundleIdentifier
? ? ? ? #? 設(shè)置:"Set : KEY Value" "目標(biāo)文件路徑"
? ? ? ? /usr/libexec/PlistBuddy -c"Set :CFBundleIdentifier $bundleId" "$TARGET_APP_PATH/Info.plist"
? ? ? ? #----------------------------------------
? ? ? ? # 5. 給MachO文件上執(zhí)行權(quán)限
? ? ? ? # 拿到MachO文件的路徑
? ? ? ? APP_BINARY=`plutil -convert xml1 -o - $TARGET_APP_PATH/Info.plist|grep -A1 Exec|tail -n1|cut -f2 -d\>|cut -f1 -d\<`
? ? ? ? #上可執(zhí)行權(quán)限
? ? ? ? chmod +x"$TARGET_APP_PATH/$APP_BINARY"
? ? ? ? #----------------------------------------
? ? ? ? # 6. 重簽名第三方 FrameWorks
? ? ? ? TARGET_APP_FRAMEWORKS_PATH="$TARGET_APP_PATH/Frameworks"
? ? ? ? if [ -d "$TARGET_APP_FRAMEWORKS_PATH" ];
? ? ? ? then
? ? ? ? for FRAMEWORK in "$TARGET_APP_FRAMEWORKS_PATH/"*
? ? ? ? ? ? do
? ? ? ? ? ? #簽名
? ? ? ? ? ? /usr/bin/codesign --force --sign"${CODE_SIGN_NAME}""$FRAMEWORK"
? ? ? ? ? ? done
? ? ? ? fi
? ? ? ? #簽名
? ? ? ? ? ? codesign -fs"${CODE_SIGN_NAME}"--no-strict --entitlements=$embedded_plist_path $TARGET_APP_PATH
###########################
? ? ? ? #xcworkspace打包
? ? ? ? xcrun -sdk iphoneos PackageApplication -v $TARGET_APP_PATH -o"$IPAPATH/$ipaName"
?? ? ? rm -rf ./Build
最后上一條查看.app文件簽名信息命令:
codesign -vv -d Example.app
接下來(lái)就是自己創(chuàng)建一個(gè).sh文件,然后復(fù)制代碼進(jìn)去,修改成你自己的路徑。
最后cd 到你的.sh文件目錄下。
運(yùn)行.sh文件:
./xxx.sh
大體上就是這樣,我自己測(cè)試下完全是可以使用的。