ios 多渠道打包+自動(dòng)化

目前公司有一個(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按照這種命名方式來

腳本都很簡單都測試過打包沒問題,有問題請留言

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容