Flutter 解放双手-Shell自动化打包之IPA
您能在这里看到啥
温故知新
往期文章
流程图如下所示
脚本目录如下所示
打包导出的文件.如下所示
这些基础配置,就是打包的基石.给我们指明了道路.根据上面的流程图.shell自动化打包.总共分为四步
- 参数配置
- 清缓存
- 导出文件
- 打包
后续也会不断丰富解放双手系列.喜欢的可以点点关注.
好了,回归主题.--- Flutter 解放双手-Shell自动化打包之IPA
iOS打包流程
从上面的流程图中,我们发现有一个奇怪的步骤.那就是前期配置.下面我先来讲解一下这个.
前期配置
前因
我们这里选择的打包命令,是苹果官方提供的xcodebuild.简单易上手.下面先看一下pack_ipa.sh文件,我们哪里使用了xcodebuild.使用了xcodebuild什么功能.
archive
export
从 xcodebuild exportArchive的命令中,我们得知.
最后导出ipa文件的时候,有一个特殊的参数exportOpptionsPlist.
这个参数指定导出IPA包的属性.分为develop、ad-hoc、appstore三种类型.
由于我们这里xcode中签名方式是automatic,也就是登录开发者账号,让xcode自动配置证书的方式.
所以导出的exportOpptionsPlist会和手动配置证书的不一样.
如果你使用的是手动配置.不用担心.
下面我们也会讲解一下,exportOpptionsPlist怎么获取.
这里我们就简单讲一下xcodebuild的使用.
可选参数 | 参数说明 |
---|---|
xcodebuild type | [build(编译) 、 archive(归档)、 exprotArchive(导出)] |
-workspace | 编译工作空间名称 |
-scheme | 编译计划名称 |
-archivePath | 被指定任何创建的档案将被放置的目录,或应导出存档 |
-configuration | 为构建每一个目标使用build配置名称 |
-destination | 使用由目标说明(用逗号分隔的一系列的key =描述目的地使用值对)中描述的目的地 |
-exportOptionsPlist | 指定用于配置归档导出plist文件的路径 |
-exportArchive | 指定归档应导出 |
说到这里,总会算是把你引到了前期配置的主题上了.继续看看后果吧.
后果
从上面的流程图.我们来一一讲解一下,exportOpptionsPlist是怎么找到的.
-
配置iOS项目
- 自动配置证书
如上图所示,登录自己的开发者账号即可.
- 手动配置证书
如上图所示,把选择对应描述文件即可
- 自动配置证书
-
Xcode Archive
-
手动导出IPA
App Store:上传商店版本,release环境 Ad Hoc:可以通过蒲公英下载安装的release环境,也可以收到推送 Development: Debug环境.
当然,我们也可以通过修改打包环境,让Ad Hoc环境为Debug.但是,请慎用.修改Archive环境.如下所示
- Edit Scheme
- Change Build Configuration
通过修改Archive build环境,就可以到达我们的目的,但还是那句话,请慎用.
- Edit Scheme
-
获取ExportOptions.plist
这样我们就获取到ExportOptions.plist,当然如果你使用的也xcode 自动配置证书,那么你就不用重新获取ExportOptions.plist文件了,因为.我已经帮你配置好了.如下所示
从上面的文件里.我们可以看出,各个环境的ExportOptions.plist,只是有一点点的差别.
虽然我也可以通过plutil -replace命令,修改一个ExportOptions.plist文件.来达到三个ExportOptions.plist的效果.
为了更好的区分app-stroe、ad-hoc、development这三个环境,还有因为每个项目配置也不一样.各个环境可能各不相同.区分开也方便修改.
至此.前期配置完成.这样我们就可以好好的讲一下pack_ipa.sh文件了.
pack_ipa.sh
通过我们上面的流程图.我把IPA总共分为5部分.如下所示
-
配置环境
主要目的是为了配置export_options_plist、build_type、configuration,判断逻辑如下所示
# 根据上传类型,确定是上传商店版本 if [[ $upload_type == 1 ]]; then export_options_plist=$export_options_plist_store build_type="release" configuration="Release" elif [[ $project_build_type == 1 ]]; then # 如果不是上商店,那就是上传蒲公英了, # 蒲公英是要确认打包环境 # 这里面打包环境是release export_options_plist=$export_options_plist_hoc build_type="release" configuration="Release" else # 这里就是debug build_type="debug" configuration="Debug" export_options_plist=$export_options_plist_dev fi
-
编译iOS
这里我们使用的还是flutter build,这个命令.当然也是可以使用xcodebuild的.如下所示
- flutter build
if [ -e "${project_path}"/pubspec.yaml ]; then echomsg "编译FLUTTER" ### 根据👆**配置环境** ### 我们获取到了打包的环境 build_type ### 然后执行 build 指令 flutter build ios --$build_type fi
- xcodebuid build
xcodebuild \ build -workspace "${project_workspace_path}" \ -scheme "$project_scheme" \ -configuration $configuration \ -destination 'generic/platform=iOS' \ -quiet || **exit**
- flutter build
-
archive
echomsg "开始archive" xcodebuild archive \ -workspace "${project_workspace_path}" \ -scheme "$project_scheme" \ -configuration $configuration \ -archivePath "${export_xcarchive_path}${xcarchive_name}" \ -destination "$generic" -quiet || exit
-
exportArchive
为了更好的完成导出,已经判断导出文件是否成功.我们需要知道导出文件的名字.
而IPA的名字,是根据info.plist文件中的CFBundleName字段,进行命名的.其格式如下
CFBundleName.ipa
因此我们需要获取到info.plist文件,并获取到CFBundleName字段对应的名字才可以.
所以我在exportArchive的时候,分4步来完成,如下所示:
-
获取info.plist
有两个地方可以获取我们想要的info.plist
- 工程项目中的info.plist
- archive中的info.plist
这里我选择了archive中的info.plist,现在想想,好像把获取弄的麻烦了,直接使用项目中的info.plist文件即可.尴尬了.好了我们看一下代码吧
info_plist="$export_xcarchive_path$xcarchive_name/Products/Applications/Runner.app/Info.plist"
- 工程项目中的info.plist
-
获取CFBundleName
ipa_name=$(/usr/libexec/PlistBuddy -c "Print CFBundleName" "$info_plist")
-
修改export_options_plist文件中的团队ID.
获取TeamId
通过archive,我们在export_xcarchive_path中的info.plist文件中,找到我们想要的Team.获取代码如下
run_plist="$export_xcarchive_path$xcarchive_name/Info.plist" ipa_teamID=$(/usr/libexec/PlistBuddy -c "Print ApplicationProperties:Team" "$run_plist")
修改TeamId
这样我们就获取到了TeamId,然后通过plutil命令,来修改plist文件,就拿到了完整的export_options_plist文件了,修改Team代码如下.
plutil -replace teamID -string "$ipa_teamID" "$export_options_plist"
-
执行导出指令
经过前面步骤,终于到了导出了,直接上代码
# 导出上传商店的ipa xcodebuild \ -exportArchive -archivePath "$export_xcarchive_path$xcarchive_name" \ -exportPath "${export_ipa_path}" \ -exportOptionsPlist "${export_options_plist}" \ -destination "$generic" \ -allowProvisioningUpdates -quiet || exit
通过上面的步骤,如果状态是成功的.我们就能获取到IPA.到这里,我们基本上打包完成了,高不高兴,简不简单.唉,可对于我来说,也是学习了不少东西呢.下面,我们再把上传搞定就齐活了.
-
-
上传
从上面的流程图中,上传分为商店和蒲公英.下面我们来看一下吧
商店
上传商店,我们用的是苹果提供的xcrun altool命令.
上传分为两种密码验证机制,一种是密钥,一种是专属密码.
这里我们选用的专属密码方式.想要学习xcrun altool的同学,我将会在后续文章里,做详细讲解.这里我们就不再细讲.
当然,上传主要分为两个步骤
1. 验证app ``` xcrun altool \ --validate-app \ -f "$export_ipa_path/$ipa_name.ipa" \ ## 开发者账号 -u "$xcrun_u" \ ## 开发者专属密码 -p "$xcrun_p" \ ## 验证类型 -t ios ``` 3. 上传app ``` xcrun altool \ --upload-app \ -f "$export_ipa_path/$ipa_name.ipa" \ -u "$xcrun_u" \ -p "$xcrun_p" \ -t ios ``` > 通过上面的流程,你的**IPA**就上传到商店了,是不是很省事啊.
蒲公英
蒲公英相对简单一点,因为我们用的pgyer_uload.sh文件,已经封装的很好.只需要调用方法.如下所示
echomsg "开始上传ipa到蒲公英" ### 调用方法需要两个参数 ### 第一个是你蒲公英的key, ### 第二个就是IPA的全路径即可 uploadPgyer "$api_key" "$export_ipa_path/$ipa_name".ipa
至此.Flutter 解放双手-Shell自动化打包之IPA完成.后续有什么问题,我也会持续更新.喜欢的可以点点赞,关注一下.
系列文章
转载自:https://juejin.cn/post/7157891891856424990