目前公司有一個(gè)需求,就是我們App要做多渠道,之前一個(gè)App但是現(xiàn)在客戶要求各自的渠道包要用自的服務(wù)器地址。也就是之前一個(gè)包,現(xiàn)在有可能幾十上百個(gè)包。
同一套代碼,打出多個(gè)企業(yè)包,這些企業(yè)包應(yīng)用的不同點(diǎn)如下:
- 應(yīng)用名字
- Bundle id
- icon
- launch image
- 功能上稍有不同,比如第三方sdk 的key不同。
- 服務(wù)器地址不同
如果實(shí)現(xiàn)。目前網(wǎng)上也就兩種打包方式,一種是全部打包,一種是只打一個(gè)母包然后修改plist文件,icon,launch image
看業(yè)務(wù)需求,兩種打包方式都可能會(huì)用到,下面我就介紹這兩種打包方法
全部打包,就是多Target方式,這里就敘述了,有關(guān)多Target可以自行搜索相關(guān)內(nèi)容
#!/bin/sh
echo "~~~~~~~~~~~~~~~~~~~~ 開始執(zhí)行打包腳本 ~~~~~~~~~~~~~~~~~~~~"
########################## 工程基本信息配置 ###########################
#循環(huán)數(shù)組,需要打包的渠道名稱,以空格隔開
channelArray=("Channel1" "Channel2")
#項(xiàng)目路徑
MWBuildDir="Users/Destiny/Desktop/wamingdaqi"
#工程名
projectName="MeteorologicalMonitoring"
#ExportOptions.plist 路徑
exportOptionsPlistPath="/Users/Destiny/Desktop/BuildIpa/BuildShell/ExportOptions.plist"
#Release還是Debug
buildConfiguration="Release"
#Ipa導(dǎo)出路徑
IpaExportPath="/Users/Destiny/Desktop/WamingIpa"
for ((i=0;i<${#channelArray};i++))
do
echo ${channelArray[$i]}
targetName=${channelArray[$i]}
echo $projectName
echo $targetName
#編譯
xcodebuild archive -workspace ${projectName}.xcworkspace -scheme ${targetName} -configuration ${buildConfiguration} -sdk "iphoneos" clean archive -archivePath ./ArchivePath/${targetName}.xcarchive
#生成ipa
xcodebuild -exportArchive -archivePath ./ArchivePath/${targetName}.xcarchive -exportOptionsPlist ${exportOptionsPlistPath} -exportPath ${IpaExportPath}
#xcodebuild archive -workspace MeteorologicalMonitoring.xcworkspace -scheme WamingJinshan -configuration Release -sdk "iphoneos" clean archive -archivePath ./ArchivePath/WamingJinshan.xcarchive
done
這種打包方式的缺點(diǎn)就是慢,假如有100個(gè)渠道就要打100次,優(yōu)點(diǎn)就是多Target方式各個(gè)渠道一目了然。
可能會(huì)遇到兩個(gè)問題
1.在終端執(zhí)行Shell腳本可能會(huì)報(bào)沒有權(quán)限的錯(cuò)誤
解決辦法:chmod +x /路徑/xxx.sh
2.ExportOptions.plist 是什么?
請參考:https://blog.csdn.net/lovechris00/article/details/79141752
第二種方式先打一個(gè)包,然后修改plist icon
#!/bin/sh
# Script.sh
# MPackage
#
# Created by Destiny on 2018/7/11.
# Copyright ? 2018年 Destiny. All rights reserved.
# 1.Configuration Info
# 項(xiàng)目路徑 需修改
projectDir="/Users/Destiny/Desktop/BuildIpafast"
# 打包生成路徑 需修改
ipaPath="/Users/Destiny/Desktop/WamingIpa"
# 圖標(biāo)路徑 需修改
iconPath="/Users/Destiny/Desktop/BuildIpafast/AppIcon"
# Project Name
projectName="MeteorologicalMonitoring"
# Scheme Name
schemeName="MeteorologicalMonitoring"
exportOptionsPlistPath="/Users/Destiny/Desktop/BuildIpafast/AutoBuildIpaShell/ExportOptions.plist"
#############
# 版本號(hào)
bundleVersion="2.0.0"
# 選擇打包序號(hào) 多選則以空格隔開 如("1" "2" "3")
appPackNum=("1")
# 蒲公英分發(fā)參數(shù) 不分發(fā)可忽略 默認(rèn)不分發(fā) 下面的兩個(gè)KEY是默認(rèn)測試的網(wǎng)址對應(yīng)KEY
ISUPLOAD=0
USERKEY="xxx"
APIKEY="xxx"
# ---------------------------可選 如果需要替換 app 的 icon --------------------------------- #
# 配置App信息數(shù)組 格式:"AppName(和工程中appInfo.Plist對應(yīng))" "icon"
#Schemes:
# 1.app1 app1Icon
# 2.app2 app2Icon
# 3.app3 app3Icon
# --------------------------------------------------------------------------------------- #
# 打包個(gè)數(shù)
appPackNumLength=${#appPackNum[*]}
appNameInfos=(
"Channel1Name"
"Channel2Name"
)
appIconInfos=(
"AppIcon"
"AppIconShuangliu"
)
appChannelInfos=(
"jinshan"
"shuangliu"
)
appBundleInfos=(
"com.xxxxx.xxx"
"com.xxxxx.xxx"
)
appInfosLength=${#appBundleInfos[*]}
# 生成 APP 路徑
buildDir="build/Release-iphoneos"
# 開始時(shí)間
beginTime=`date +%s`
# 創(chuàng)建打包目錄
mkdir ${ipaPath}/allChannelIpa
# 本地存放全部 IPA 的路徑
allIPAPackPath="${ipaPath}/allChannelIpa"
# 清除緩存
rm -rf ${projectDir}/$buildDir
# Build 生成 APP
xcodebuild archive -workspace ${projectName}.xcworkspace -scheme ${schemeName} -configuration Release -sdk iphoneos clean -archivePath ${projectDir}/build/${schemeName}.xcarchive
if [[ $? = 0 ]]; then
echo "\033[31m 編譯成功\n \033[0m"
else
echo "\033[31m 編譯失敗\n \033[0m"
fi
# 先創(chuàng)建 payload 文件夾
mkdir ${ipaPath}/Payload
# 移動(dòng)編譯生成的 app 到的 Payload 文件夾下
cp -Rf ${projectDir}/build/${schemeName}.xcarchive ${ipaPath}/Payload
if [[ $? = 0 ]]; then
echo "\033[31m app移動(dòng)成功\n \033[0m"
else
echo "\033[31m app移動(dòng)失敗\n \033[0m"
fi
# ----全部打包----
for (( i=0; i<appInfosLength; i++ )); do
# App Bundle Name (CFBundleName)
appName=${appNameInfos[${i}]}
# App DisPlay Name
appDisplayName=${appNameInfos[${i}]}
# App Icon Name
appIconName=${appIconInfos[${i}]}
# App Download Name
appChannelName=${appChannelInfos[${i}]}
# App Bundle id
appBundleId=${appBundleInfos[${i}]}
# 創(chuàng)建不同 app ipa 目錄
mkdir $allIPAPackPath/${appChannelName}
rm -rf $allIPAPackPath/${appChannelName}}/*
echo "\033[31m appName:$appName appIconName:$appIconName appChannelName:$appChannelName bundleID:$appBundleId \n \033[0m"
# 將對應(yīng)的 icon 復(fù)制到需要修改的 app 的目錄下
# .xcarchive 文件下對應(yīng)的Applications文件路徑
Applications_Path=$ipaPath/Payload/${schemeName}.xcarchive/Products/Applications
cp -Rf $iconPath/$appIconName/* $Applications_Path/*.app
if [[ $? = 0 ]]; then
echo "\033[31m 修改 icon 成功\033[0m"
else
echo "\033[31m 修改 icon 失敗\033[0m"
fi
# 修改 Plist
# plist路徑
infoPlist_File_Path=$Applications_Path/*.app/info.plist
/usr/libexec/PlistBuddy -c "Set :CFBundleName $appName" $infoPlist_File_Path
/usr/libexec/PlistBuddy -c "Set :CFBundleDisplayName $appDisplayName" $infoPlist_File_Path
/usr/libexec/PlistBuddy -c "Set :CFBundleIdentifier $appBundleId" $infoPlist_File_Path
/usr/libexec/PlistBuddy -c "Set :Channel $appChannelName" $infoPlist_File_Path
if [[ $? = 0 ]]; then
echo "\033[31m 修改 Plist 成功\033[0m"
else
echo "\033[31m 修改 Plist 失敗\033[0m"
fi
# 重簽名
#codesign -f -s "iPhone Distribution: Beijing Waming Environmental Technology Co., Ltd" --entitlements $exportOptionsPlistPath ${ipaPath}/Payload/${schemeName}.app
#if [[ $? = 0 ]]; then
#echo "\033[31m 簽名成功\n \033[0m"
#else
#echo "\033[31m 簽名失敗\n \033[0m"
#fi
# 生成 ipa
xcodebuild -exportArchive -archivePath ${ipaPath}/Payload/${schemeName}.xcarchive -exportOptionsPlist ${exportOptionsPlistPath} -exportPath ${allIPAPackPath}/$appChannelName
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
# 移動(dòng)
#mv ${ipaPath}/$appChannelName.ipa ${allIPAPackPath}/$appName
# 6.上傳蒲公英分發(fā)平臺(tái)
if [[ $ISUPLOAD = 1 ]]; then
echo "正在上傳蒲公英..."
curl -F "file=@$allIPAPackPath/$appName/$appChannelName.ipa" -F "uKey=$USERKEY" -F "_api_key=$APIKEY" http://www.pgyer.com/apiv1/app/upload
fi
done
# 清除無關(guān)文件
rm -rf ${ipaPath}/Payload
# 結(jié)束時(shí)間
endTime=`date +%s`
echo -e "打包時(shí)間$[ endTime - beginTime ]秒"
有個(gè)問題需要注意
xxx.xcarchive右鍵顯示包含內(nèi)容,Products->Applications->xxxx->右鍵顯示包含內(nèi)容->復(fù)制出App Icon文件,要替換的Icon按照這種命名方式來
腳本都很簡單都測試過打包沒問題,有問題請留言