這篇教程將手把手帶領(lǐng)大家實現(xiàn)使用xcodebuild命令進行iOS的打包實現(xiàn)赊瞬,并動態(tài)地為archieve文件添加資源文件,實現(xiàn)icon贼涩,和lauchScreen在打包時進行替換的工作巧涧。并編寫sh腳本,運行腳本將自動進行打包磁携。
讓我們解放使用xcode打包的雙手把褒侧!
一、
1)首先谊迄,我們需要了解一下xcodebuild命令闷供,不了解的同學(xué)可以先去看看官方文檔,或者打開終端统诺,輸入man xcodebuild -h命令來看看這個東西到底是用來干嘛的
Usage: xcodebuild [-project <projectname>] [[-target <targetname>]...|-alltargets] [-configuration <configurationname>] [-arch <architecture>]... [-sdk [<sdkname>|<sdkpath>]] [-showBuildSettings] [<buildsetting>=<value>]... [<buildaction>]...
xcodebuild [-project <projectname>] -scheme <schemeName> [-destination <destinationspecifier>]... [-configuration <configurationname>] [-arch <architecture>]... [-sdk [<sdkname>|<sdkpath>]] [-showBuildSettings] [<buildsetting>=<value>]... [<buildaction>]...
xcodebuild -workspace <workspacename> -scheme <schemeName> [-destination <destinationspecifier>]... [-configuration <configurationname>] [-arch <architecture>]... [-sdk [<sdkname>|<sdkpath>]] [-showBuildSettings] [<buildsetting>=<value>]... [<buildaction>]...
xcodebuild -version [-sdk [<sdkfullpath>|<sdkname>] [<infoitem>] ]
xcodebuild -list [[-project <projectname>]|[-workspace <workspacename>]] [-json]
xcodebuild -showsdks
xcodebuild -exportArchive -archivePath <xcarchivepath> -exportPath <destinationpath> -exportOptionsPlist <plistpath>
xcodebuild -exportLocalizations -localizationPath <path> -project <projectname> [-exportLanguage <targetlanguage>...]
xcodebuild -importLocalizations -localizationPath <path> -project <projectname>
這里我只截取了一部分
- 接下來歪脏,我著重說明xcodebuild -project 和xcodebuild -workspace命令
2.1 xcodebuild -project
xcodebuild [-project <projectname>] -scheme <schemeName> [-destination <destinationspecifier>]... [-configuration <configurationname>] [-arch <architecture>]... [-sdk [<sdkname>|<sdkpath>]] [-showBuildSettings] [<buildsetting>=<value>]... [<buildaction>]...
根據(jù)api,我們編寫的命令應(yīng)該如下:
$xcodebuild -project 你工程的名字.xcodeproj -target 打出的.pp包名 -configuration Release clean -sdk iphoneos build CODE_SIGN_IDENTITY=你打包證書的名字
PROVISIONING_PROFILE=用于打包的描述文件的UUID SYMROOT="${projectDir}/build"
這條命令是以.xcodeproj的工程進行打包的粮呢,那么如果我們使用了cocoapods婿失,那么就應(yīng)該使用下面這條命令進行打包了
2.2 xcodebuild -workspace
xcodebuild -workspace <workspacename> -scheme <schemeName> [-destination <destinationspecifier>]... [-configuration <configurationname>] [-arch <architecture>]... [-sdk [<sdkname>|<sdkpath>]] [-showBuildSettings] [<buildsetting>=<value>]... [<buildaction>]...
根據(jù)api,我們的命令應(yīng)該如下:
$xcodebuild -workspace 你的項目名字.xcworkspace -scheme 你的項目名字 -sdk iphoneos build CODE_SIGN_IDENTITY=你打包證書的名字
PROVISIONING_PROFILE=用于打包的描述文件的UUID -configuration Release -derivedDataPath 打出的.app包的路徑
注意:1.你打包證書的名字在鑰匙串中查看啄寡,比如我使用的證書名字:
iPhone Distribution: Chengdu Bestwise Technology Co. Ltd (N******A)
2.獲取描述文件的UUID:
輸入下面的命令吧profile轉(zhuǎn)換成plist查看uuid豪硅,注意保存這個plist,后面替換了資源文件后挺物,進行重簽名還會用到
用mac自帶的命令security懒浮,cd到mobileprovision所在的文件夾,執(zhí)行
security cms -D -i XXX.mobileprovision > entitlements.plist
打開該plist文件识藤,便可看到UUID
2)執(zhí)行導(dǎo)出ipa包的命令
xcrun -sdk iphoneos -v PackageApplication 你在上次命令生成的.app文件的路徑 -o 導(dǎo)出的.ipa包的路徑
在執(zhí)行這行命令時砚著,需要下載PackageApplication 這是安裝教程
二、
2.1)下面痴昧,我們新建兩個工程稽穆,一個用cocoapods導(dǎo)入隨便一個三方,一個不用cocoapods赶撰,進行測試舌镶。
如圖:
這里柱彻,我們創(chuàng)建了兩個工程,我們這里只演示cocopads導(dǎo)入的工程乎折,xcodeproj工程只是打包命令的不同绒疗,其他的不邊則不再演示侵歇。
下面骂澄,我們給這個工程隨便加入一個cocopads導(dǎo)入的三方,如"MBProgress.h"
2.2)執(zhí)行命令惕虑,進行打包,工程的sign不用選坟冲,因為我們在打包命令里面已經(jīng)指定了證書和描述文件,注意設(shè)置bundleID
如下圖:cd 到工程根目錄
xcodebuild -workspace ArchievePods.xcworkspace -scheme ArchievePods -sdk iphoneos build CODE_SIGN_IDENTITY="iPhone Distribution: Chengdu Bestwise Technology Co. Ltd (N******A)" PROVISIONING_PROFILE="35405510-1f6c-4465-ac05-3fd840f17ff1" -configuration Release -derivedDataPath /Users/Harvey/Desktop/ArchievePods/build
編譯成功后,我們在工程根目錄下可以看到多了一個build文件夾
逐層打開可以發(fā)現(xiàn)我們打出的.app包
2.3)執(zhí)行命令溃蔫,導(dǎo)出ipa包
xcrun -sdk iphoneos -v PackageApplication /Users/Harvey/Desktop/ArchievePods/build/Build/Products/Release-iphoneos/ArchievePods.app -o /Users/Harvey/Desktop/ArchievePods/包名.ipa
執(zhí)行之后健提,我們可以看到已經(jīng)生成了ipa文件,
至此伟叛,說明xcodebuild進行打包是可行的私痹。
三、下面统刮,我們編寫sh腳本進行xcodebuild的打包工作紊遵,
首先,在工程根目錄下創(chuàng)建autoBuild.sh腳本文件侥蒙,代碼如下
#!/bin/sh
#項目路徑暗膜,根據(jù)你的配置進行修改
projectDir="/Users/Harvey/Desktop/ArchievePods"
# 打包生成路徑 需修改
ipaPath="/Users/Harvey/Desktop/ArchievePods"
# Provisioning Profile 需修改 查看本地配置文件
PROVISIONING_PROFILE="35405510-1f6c-4465-ac05-3fd840f17ff1"
# Project Name
projectName="ArchievePods"
# 版本號
bundleVersion="1.0.0"
schemeName="ArchievePods"
# Code Sign ID
CODE_SIGN_IDENTITY="iPhone Distribution: Chengdu Bestwise Technology Co. Ltd (N******A)"
# xcodebuild -workspace 后生成 APP 路徑
buildDir="build/Build/Products/Release-iphoneos"
# 創(chuàng)建打包目錄
mkdir ${ipaPath}/AllPack
# 本地存放全部 IPA 的路徑
allIPAPackPath="${ipaPath}/allPack"
# 清除緩存
rm -rf ${projectDir}/$buildDir
#build 生成app
xcodebuild -workspace ${projectDir}/${schemeName}.xcworkspace -scheme ${projectName} -sdk iphoneos build CODE_SIGN_IDENTITY="${CODE_SIGN_IDENTITY}" PROVISIONING_PROFILE="${PROVISIONING_PROFILE}" -configuration Release -derivedDataPath ${projectDir}/build
if [[ $? = 0 ]]; then
echo "\033[31m 編譯成功\n \033[0m"
else
echo "\033[31m 編譯失敗\n \033[0m"
fi
# 先創(chuàng)建 payload 文件夾
mkdir ${ipaPath}/Payload
# 移動編譯生成的 app 到的 Payload 文件夾下
cp -Rf ${projectDir}/${buildDir}/${schemeName}.app ${ipaPath}/Payload
if [[ $? = 0 ]]; then
echo "\033[31m app移動成功\n \033[0m"
else
echo "\033[31m app移動失敗\n \033[0m"
fi
# App Bundle Name (CFBundleName)
appName="應(yīng)用"
# App DisPlay Name
appDisplayName="自動打包"
# App Icon Name
appIconName="byy"
# App Download Name
appDownloadName="IPA名字"
# App Bundle id
appBundleId="com.bestwise.test.archeive"
# 創(chuàng)建不同 app ipa 目錄
mkdir $allIPAPackPath/$appName
rm -rf $allIPAPackPath/$appName/*
# 生成 ipa
xcrun -sdk iphoneos -v PackageApplication ${ipaPath}/Payload/${schemeName}.app -o ${ipaPath}/$appDownloadName.ipa
#xcodebuild -exportArchive -archivePath ${ipaPath}/Payload/${schemeName}.app -exportPath ${ipaPath}/$appDownloadName.ipa -exportOptionsPlist '/Users/Harvey/Downloads/entitlements.plist'
if [[ $? = 0 ]]; then
echo "\033[31m \n 生成 IPA 成功 \n\n\n\n\n\033[0m"
else
echo "\033[31m \n 生成 IPA 失敗 \n\n\n\n\n\033[0m"
fi
# 移動
mv ${ipaPath}/$appDownloadName.ipa ${allIPAPackPath}/$appName
然后我們需要給.autoBuild.sh文件賦予權(quán)限才能運行這個打包腳本
cd 到該目錄下, 輸入
chmod -R 777 ./autoBuild.sh
然后運行該腳本(在運行這個腳本前鞭衩,我們可以把生成的/build文件夾学搜,.ipa文件先刪除,以檢驗效果)
./autobuild.sh
我們會看到我們的腳本執(zhí)行了论衍,并且生成了ipa文件瑞佩,build目錄
四、關(guān)于icon坯台, launchscreen炬丸,資源文件的替換。
要實現(xiàn)這個功能捂人,我們的思路是
①在info.plist里面設(shè)置好lauchScreen和icon加載的圖片(當(dāng)然你也可以在腳本中對工程的info.plist進行修改)
②替換AutoBuild.app 包內(nèi)的資源文件御雕,然后再對這個包進行重簽名,最后導(dǎo)出ipa包
4.1) 4.1.1首先滥搭,我們在工程根目錄下新增資源文件夾[bundleResources]這個文件夾下放置的是我們app的啟動圖酸纲,icon,json等資源文件瑟匆,如圖
4.1.2 第二步闽坡,修改info.plist,我們在info.plist中設(shè)置的launchscreen圖片的名字與這個文件夾中的圖片名字保持一致。如圖:
當(dāng)然,我們還需要在工程的general中設(shè)置一下
info.plist SourceCode
<key>UILaunchImages</key>
<array>
<dict>
<key>UILaunchImageMinimumOSVersion</key>
<string>7.0</string>
<key>UILaunchImageName</key>
<string>LaunchImage-750-1334</string>
<key>UILaunchImageOrientation</key>
<string>Portrait</string>
<key>UILaunchImageSize</key>
<string>{375, 667}</string>
</dict>
<dict>
<key>UILaunchImageMinimumOSVersion</key>
<string>7.0</string>
<key>UILaunchImageName</key>
<string>LaunchImage-640-960h</string>
<key>UILaunchImageOrientation</key>
<string>Portrait</string>
<key>UILaunchImageSize</key>
<string>{320, 480}</string>
</dict>
<dict>
<key>UILaunchImageMinimumOSVersion</key>
<string>7.0</string>
<key>UILaunchImageName</key>
<string>LaunchImage-640-1136h</string>
<key>UILaunchImageOrientation</key>
<string>Portrait</string>
<key>UILaunchImageSize</key>
<string>{320, 568}</string>
</dict>
<dict>
<key>UILaunchImageMinimumOSVersion</key>
<string>7.0</string>
<key>UILaunchImageName</key>
<string>LaunchImage-1242-2208h</string>
<key>UILaunchImageOrientation</key>
<string>Portrait</string>
<key>UILaunchImageSize</key>
<string>{621, 1104}</string>
</dict>
<dict>
<key>UILaunchImageMinimumOSVersion</key>
<string>7.0</string>
<key>UILaunchImageName</key>
<string>LaunchImage-320-480h</string>
<key>UILaunchImageOrientation</key>
<string>Portrait</string>
<key>UILaunchImageSize</key>
<string>{621, 1104}</string>
</dict>
</array>
<key>CFBundleIcons</key>
<dict>
<key>CFBundlePrimaryIcon</key>
<dict>
<key>CFBundleIconFiles</key>
<array>
<string>Icon-60</string>
</array>
</dict>
</dict>
注:test.json文件里面是隨意一段json代碼疾嗅,我們在打出的包里進行測試外厂,讀取bundle資源,也可以不用 suit yourself代承!
4.2)在替換這些資源文件之后汁蝶,我們必須對archieve.app文件進行重新簽名,生成的app才能使用论悴,可以google一下codeResign掖棉,有很多相關(guān)的資料。
在重簽名時膀估,我們需要entitlements.plist文件
這個文件的來源就是我們之前用security 命令獲得的entitlements.plist的一部分幔亥。下面,我們把這一部分截取出來察纯,依然放入工程的根目錄帕棉。
4.3)下面我們將實現(xiàn)替換資源這一段代碼的編寫,完整的腳本代碼如下
#!/bin/sh
#項目路徑,根據(jù)你的配置進行修改
projectDir="/Users/Harvey/Desktop/ArchievePods"
# 打包生成路徑 需修改
ipaPath="/Users/Harvey/Desktop/ArchievePods"
# Provisioning Profile 需修改 查看本地配置文件
PROVISIONING_PROFILE="35405510-1f6c-4465-ac05-3fd840f17ff1"
# Project Name
projectName="ArchievePods"
# 版本號
bundleVersion="1.0.0"
############# 重簽名需要文件
# 以下文件需放在 ipaPath 路徑下
Entitlements=$ipaPath/entitlements.plist
schemeName="ArchievePods"
#資源文件夾
bundleSourcesPath="/Users/Harvey/Desktop/ArchievePods/bundleResource"
# Code Sign ID
CODE_SIGN_IDENTITY="iPhone Distribution: Chengdu Bestwise Technology Co. Ltd (N*******A)"
# xcodebuild -workspace 后生成 APP 路徑
buildDir="build/Build/Products/Release-iphoneos"
# 創(chuàng)建打包目錄
mkdir ${ipaPath}/AllPack
# 本地存放全部 IPA 的路徑
allIPAPackPath="${ipaPath}/allPack"
# 清除緩存
rm -rf ${projectDir}/$buildDir
#build 生成app
xcodebuild -workspace ${projectDir}/${schemeName}.xcworkspace -scheme ${projectName} -sdk iphoneos build CODE_SIGN_IDENTITY="${CODE_SIGN_IDENTITY}" PROVISIONING_PROFILE="${PROVISIONING_PROFILE}" -configuration Release -derivedDataPath ${projectDir}/build
if [[ $? = 0 ]]; then
echo "\033[31m 編譯成功\n \033[0m"
else
echo "\033[31m 編譯失敗\n \033[0m"
fi
# 先創(chuàng)建 payload 文件夾
mkdir ${ipaPath}/Payload
# 移動編譯生成的 app 到的 Payload 文件夾下
cp -Rf ${projectDir}/${buildDir}/${schemeName}.app ${ipaPath}/Payload
if [[ $? = 0 ]]; then
echo "\033[31m app移動成功\n \033[0m"
else
echo "\033[31m app移動失敗\n \033[0m"
fi
# App Bundle Name (CFBundleName)
appName="應(yīng)用"
# App DisPlay Name
appDisplayName="自動打包"
# App Icon Name
appIconName="byy"
# App Download Name
appDownloadName="IPA名字"
# App Bundle id
appBundleId="com.bestwise.test.archeive"
# 創(chuàng)建不同 app ipa 目錄
mkdir $allIPAPackPath/$appName
rm -rf $allIPAPackPath/$appName/*
# 修改 Plist
defaults write ${ipaPath}/Payload/${schemeName}.app/info.plist "CFBundleName" $appName
defaults write ${ipaPath}/Payload/${schemeName}.app/info.plist "CFBundleDisplayName" $appDisplayName
defaults write ${ipaPath}/Payload/${schemeName}.app/info.plist "CFBundleIdentifier" $appBundleId
defaults write ${ipaPath}/Payload/${schemeName}.app/info.plist "Channel" $appDownloadName
if [[ $? = 0 ]]; then
echo "\033[31m 修改 Plist 成功\033[0m"
else
echo "\033[31m 修改 Plist 失敗\033[0m"
fi
# 將對應(yīng)的 資源文件(icon饼记,lauchscreen香伴,等資源文件) 復(fù)制到需要修改的 app 的目錄下
cp -Rf $bundleSourcesPath/* $ipaPath/Payload/${schemeName}.app
if [[ $? = 0 ]]; then
echo "\033[31m 修改 icon 成功\033[0m"
else
echo "\033[31m 修改 icon 失敗\033[0m"
fi
# 重簽名
codesign -f -s "iPhone Distribution: Chengdu Bestwise Technology Co. Ltd (N*******A)" --entitlements $Entitlements ${ipaPath}/Payload/${schemeName}.app
if [[ $? = 0 ]]; then
echo "\033[31m 簽名成功\n \033[0m"
else
echo "\033[31m 簽名失敗\n \033[0m"
fi
# 生成 ipa
xcrun -sdk iphoneos -v PackageApplication ${ipaPath}/Payload/${schemeName}.app -o ${ipaPath}/$appDownloadName.ipa
#xcodebuild -exportArchive -archivePath ${ipaPath}/Payload/${schemeName}.app -exportPath ${ipaPath}/$appDownloadName.ipa -exportOptionsPlist '/Users/Harvey/Downloads/entitlements.plist'
if [[ $? = 0 ]]; then
echo "\033[31m \n 生成 IPA 成功 \n\n\n\n\n\033[0m"
else
echo "\033[31m \n 生成 IPA 失敗 \n\n\n\n\n\033[0m"
fi
# 移動
mv ${ipaPath}/$appDownloadName.ipa ${allIPAPackPath}/$appName
運行上面的一段腳本,將生成的ipa包安裝到手機握恳,看看icon和launchscreen是不是已經(jīng)改變了呢瞒窒!
當(dāng)然,我們的test.json文件也在bundle目錄下乡洼,是可以讀取的崇裁,這里不再演示。
五束昵、批量打包APP
其實拔稳,在sh腳本中寫一個循環(huán)進行打包就可以了,在重簽名的時候注意一下每個包的配置就可以了
更新:
當(dāng)重簽名報錯:segmentation fault:11
1.打開終端锹雏,輸入 security find-identity
我們用前面的一串?dāng)?shù)字進行重簽名操作
codesign -f -s "iPhone Distribution: Chengdu Bestwise Technology Co. Ltd (N*******A)" --entitlements $Entitlements ${ipaPath}/Payload/${schemeName}.app
改為: codesign -f -s 99D45A71C1E0B2B0E03767C6F0981C7EEF65ACB6 --entitlements $Entitlements ${ipaPath}/Payload/${schemeName}.app