ios 多渠道打包+自动化

目前公司有一个需求,就是我们App要做多渠道,之前一个App但是现在客户要求各自的渠道包要用自的服务器地址。也就是之前一个包,现在有可能几十上百个包。

同一套代码,打出多个企业包,这些企业包应用的不同点如下:

  • 应用名字
  • Bundle id
  • icon
  • launch image
  • 功能上稍有不同,比如第三方sdk 的key不同。
  • 服务器地址不同

如果实现。目前网上也就两种打包方式,一种是全部打包,一种是只打一个母包然后修改plist文件,icon,launch image

看业务需求,两种打包方式都可能会用到,下面我就介绍这两种打包方法

全部打包,就是多Target方式,这里就叙述了,有关多Target可以自行搜索相关内容

#!/bin/sh

echo "~~~~~~~~~~~~~~~~~~~~ 开始执行打包脚本 ~~~~~~~~~~~~~~~~~~~~"

########################## 工程基本信息配置 ###########################
#循环数组,需要打包的渠道名称,以空格隔开
channelArray=("Channel1" "Channel2")
#项目路径
MWBuildDir="Users/Destiny/Desktop/wamingdaqi"
#工程名
projectName="MeteorologicalMonitoring"
#ExportOptions.plist 路径
exportOptionsPlistPath="/Users/Destiny/Desktop/BuildIpa/BuildShell/ExportOptions.plist"
#Release还是Debug
buildConfiguration="Release"
#Ipa导出路径
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

这种打包方式的缺点就是慢,假如有100个渠道就要打100次,优点就是多Target方式各个渠道一目了然。

可能会遇到两个问题
1.在终端执行Shell脚本可能会报没有权限的错误
解决办法:chmod +x /路径/xxx.sh

2.ExportOptions.plist 是什么?
请参考:https://blog.csdn.net/lovechris00/article/details/79141752

第二种方式先打一个包,然后修改plist icon

#!/bin/sh

#  Script.sh
#  MPackage
#
#  Created by Destiny on 2018/7/11.
#  Copyright © 2018年 Destiny. All rights reserved.


# 1.Configuration Info

# 项目路径 需修改
projectDir="/Users/Destiny/Desktop/BuildIpafast"

# 打包生成路径 需修改
ipaPath="/Users/Destiny/Desktop/WamingIpa"

# 图标路径 需修改
iconPath="/Users/Destiny/Desktop/BuildIpafast/AppIcon"

# Project Name
projectName="MeteorologicalMonitoring"

# Scheme Name
schemeName="MeteorologicalMonitoring"

exportOptionsPlistPath="/Users/Destiny/Desktop/BuildIpafast/AutoBuildIpaShell/ExportOptions.plist"

#############

# 版本号
bundleVersion="2.0.0"

# 选择打包序号 多选则以空格隔开 如("1" "2" "3")
appPackNum=("1")

# 蒲公英分发参数 不分发可忽略 默认不分发 下面的两个KEY是默认测试的网址对应KEY
ISUPLOAD=0
USERKEY="xxx"
APIKEY="xxx"

# ---------------------------可选 如果需要替换 app 的 icon --------------------------------- #

# 配置App信息数组 格式:"AppName(和工程中appInfo.Plist对应)" "icon"
#Schemes:
#        1.app1 app1Icon
#        2.app2 app2Icon
#        3.app3 app3Icon

# --------------------------------------------------------------------------------------- #

# 打包个数
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"

# 开始时间
beginTime=`date +%s`

# 创建打包目录
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

# 先创建 payload 文件夹
mkdir ${ipaPath}/Payload
# 移动编译生成的 app 到的 Payload 文件夹下
cp -Rf ${projectDir}/build/${schemeName}.xcarchive ${ipaPath}/Payload
if [[ $? = 0 ]]; then
echo "\033[31m app移动成功\n \033[0m"
else
echo "\033[31m app移动失败\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}]}


# 创建不同 app ipa 目录
mkdir $allIPAPackPath/${appChannelName}
rm -rf $allIPAPackPath/${appChannelName}}/*

echo "\033[31m appName:$appName appIconName:$appIconName appChannelName:$appChannelName bundleID:$appBundleId \n \033[0m"

# 将对应的 icon 复制到需要修改的 app 的目录下
# .xcarchive 文件下对应的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


# 移动
#mv ${ipaPath}/$appChannelName.ipa ${allIPAPackPath}/$appName


# 6.上传蒲公英分发平台

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

# 清除无关文件
rm -rf ${ipaPath}/Payload

# 结束时间
endTime=`date +%s`
echo -e "打包时间$[ endTime - beginTime ]秒"

有个问题需要注意

xxx.xcarchive右键显示包含内容,Products->Applications->xxxx->右键显示包含内容->复制出App Icon文件,要替换的Icon按照这种命名方式来

脚本都很简单都测试过打包没问题,有问题请留言

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 195,898评论 5 462
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 82,401评论 2 373
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 143,058评论 0 325
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,539评论 1 267
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,382评论 5 358
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,319评论 1 273
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,706评论 3 386
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,370评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,664评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,715评论 2 312
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,476评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,326评论 3 313
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,730评论 3 299
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,003评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,275评论 1 251
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,683评论 2 342
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,877评论 2 335

推荐阅读更多精彩内容