【flutter记录】使用fastlane自动打包ios上传TestFlight
前言:在公司使用flutter进行开放时,每次打包测试或上线都要在本地手动打包,容易出错,效率低。所以需要配置自动化打包功能,经过网上查询后,发现了比较好用的打包工具fastlane,配置好后记录一下。
已经到使用自动化打包的地步,说明正常手动打包所需要的账号,签名配置等已经配置好了。
一. 开发环境和版本
- flutter版本v1.22.6
- fastlane版本2.181.0
- xcode版本12.4
二. fastlane简介
fastlane官网地址https://docs.fastlane.tools,官网的介绍是
fastlane是自动化iOS和Android应用程序Beta部署和发布的最简单方法。🚀它可以处理所有繁琐的任务,例如生成屏幕截图,处理代码签名以及发布应用程序。
除了简介所说的生成截图和发布应用之外还要很多功能,具体可以看官网,本文只记录自动打包发布。
三. 安装fastlane
1. 安装xcode命令行工具,命令行输入
xcode-select --install
如果没有安装,会弹出对话框,按照对话框提示进行安装即可。如果提示xcode-select: error: command line tools are already installed, use "Software Update" to install updates则表示xcode命令行工具已安装已经安装。
2.安装fastlane
官网安装教程地址https://docs.fastlane.tools/getting-started/ios/setup。
官网提供了3种安装方式,此处使用的是通过gem来安装
sudo gem install fastlane
安装成功后输入fastlane -v,若没用报错,则检查是否安装成功。
fastlane -v
四. 在项目中配置fastlane
1.进入项目ios工程目录
进入到自己flutter项目下面打开终端,输入cd ios进入ios工程页面
cd ios
2.初始化fastlane
在ios目录下的命令行输入初始化fastlane命令
fastlane init
<img src="http://p29.toutiaoimg.com/origin/pgc-image/22ae43b8d0cc4dc68e887263bdaef78a" alt="copy.png" style="zoom:67%;" />
会出现4个选项
- 自动生成屏幕截图功能
- 自动打包发布到testFlight上面
- 自动打包发布到App store上面
- 手动设置
这个选择是初始化生成的功能,我们也可以后续手动配置其他的
这里选择的是第2个,自动打包发布到testFlight上面。
选择后点击回车,接下来会让输入appid,和appid密码,按照提示输入即可。
登录成功后会提示你是否需要下载你的App应用的metadata信息,选择Y。
初始化完成后在ios目录会多出一个文件和一个文件夹
ios/Gemfile:定义对fastlane的依赖,这将清楚地定义所使用的fastlane版本及其依赖关系,还将加快使用fastlane的速度。
ios/fastlane/Appfile:根据项目xcode配置信息自动生存App应用账号和应用的
app_identifier("com.xx") # The bundle identifier of your app
apple_id("123@qq.com") # Your Apple email address
itc_team_id("123") # App Store Connect Team ID
team_id("H3123") # Developer Portal Team ID
ios/fastlane/Appfile:主要的功能配置文件,由于选择的是2,发布到testFlight上面,这里自动生成的就是发布到testFlight里面的配置代码,各行代码作用已做注释。
default_platform(:ios)
platform :ios do # 打包发布的平台为ios
desc "Push a new beta build to TestFlight" # 该打包脚本命令的描述
lane :beta do # beta是打包的脚本命令 打包上传时执行 fastlane beta
increment_build_number(xcodeproj: "Runner.xcodeproj") # 打包Runner.app-每次打包自动吧打包build_number加1
build_app(workspace: "Runner.xcworkspace", scheme: "Runner") # 开始构建归档
upload_to_testflight #构建归档完成后-上传到testflight
end
end
五. 配置打包上传构建所需要的环境变量
1.mac os系统配置环境变量步骤
打开命令行输入
sudo vi ~/.bash_profile
然后点击i键把环境变量复制到文件里面,复制完成后英文键盘状态下点击esc+冒号,输入wq+回车保存并退出编辑
使环境变量生效
source ~/.bash_profile
2.配置语言环保变量
官网:语言环境未设置为UTF-8语言环境会导致生成和上载生成问题,所以需要配置一下。
配置代码,按步骤1把以下环境变量添加到~/.bash_profile
export LC_ALL=en_US.UTF-8
export LANG=en_US.UTF-8
3.配置appid账号密码环境变量
配置代码,按步骤1把以下环境变量添加到~/.bash_profile
export FASTLANE_USER=appid@qq.com
export FASTLANE_PASSWORD=appid密码
4.配置支持IOS双重认证(不中途打断上传appstore流程)
4.1 1.登录appleid网站获取app专用密码appleid.apple.com/account/manage,登录成功后按下图所示,点击app专用密码下面的生成密码。输入自己的密码标签,点击创建,就会得到xxxx-xxxx-xxxx-xxxx格式的应用程序专用密码。
把这个应用专用密码配置环境变量,配置代码,按步骤1把以下环境变量添加到~/.bash_profile
export FASTLANE_APPLE_APPLICATION_SPECIFIC_PASSWORD=xxxx-xxxx-xxxx-xxxx
5.获取session配置环境变量 (避免每次输入6位数字验证码)
【注意:每个月session可能会变要重新获取】终端输入 (邮箱是你的appleId)
fastlane spaceauth -u xxx@qq.com
等待一会儿出现下图,生成session后,会出现一个是否复制的选项,选择Y即可,会自动帮我们复制要配置的环境变量。
配置代码,按步骤1把以下环境变量添加到~/.bash_profile
export FASTLANE_SESSION='---\n- !ruby/object:HTTP::Cookie\n name: myacinfo\n value: DAWTKNV2c41f4288f0e103b6fdea185b9d49ab4e658cc1e96acfc245fc89e8758e4c491bfe4caac146df00fc6e02544f406392b637dd8b69a5f42a6df93242593ceb403c6330c6650bb01f7de7e46269f6da0eed9f2f6f3448916d9e66564910ea2f025fc12155d0348669cdf1227538660b13324e1e2ea8aa6f445f450ead242e3a40d168df243e5301e210869a7343f26046187aa7228c97f13dc75c2a98396b352ce8296eb5a5cdedaf8f3bfbaff1db4ff99b9e5c8c5bcdfb368705ef6bc229312273be2e1e2d48e38ec644e436a3eb77f5ddb73547301373d6e178529100254f4b20231d56549784eba6dcf2ceefc6fd166f930b279686dae2ebe3bafd6b8b3977418dc32843622d35f5e67da2dbd2085e6631633931326633626362636636363064356161303234633236643933386431663234343236373662MVRYV2\n domain: apple.com\n for_domain: true\n path: "/"\n secure: true\n httponly: true\n expires:\n max_age:\n created_at: 2021-04-29 21:43:37.125330000 +08:00\n accessed_at: 2021-04-29 21:46:37.450439000 +08:00\n- !ruby/object:HTTP::Cookie\n name: DES5b20808048b404db61d5763fa00a5fdb6\n value: HSARMTKNSRVXWFla9ATyYXlJURgnXhKH93CZqKg5rl0bK41pXW7ha5GdyThO+iw2QQVoRkUNJhkMQy5IND4GguSexvV10l3Xq3zsxekdmwQrJDq/YwMxv1hXHGRYEC/ssF54n+/gSRVX\n domain: idmsa.apple.com\n for_domain: true\n path: "/"\n secure: true\n httponly: true\n expires:\n max_age: 2592000\n created_at: 2021-04-29 11:14:19.188147000 +08:00\n accessed_at: 2021-04-29 21:43:33.579849000 +08:00\n- !ruby/object:HTTP::Cookie\n name: dqsid\n value: eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpYXQiOjE2MTk3MDM4MTcsImp0aSI6ImRNcGZrSENjMnZPZk93cmQweWJEZHcifQ.KBtHSVPEoWalNGdpCbeadO3X1Dgxwpka9zO8sK4daDw\n domain: appstoreconnect.apple.com\n for_domain: false\n path: "/"\n secure: true\n httponly: true\n expires:\n max_age: 1800\n created_at: &1 2021-04-29 21:46:39.630665000 +08:00\n accessed_at: *1\n'
之后就可以像以前一样 上传(fastlane beta),中间不会有暂停然你输入验证码和专用密码流程。
6.全部所需配置的环境变量
export LC_ALL=en_US.UTF-8
export LANG=en_US.UTF-8
export FASTLANE_APPLE_APPLICATION_SPECIFIC_PASSWORD=xxxx-xxxx-xxxx-xxxx
export FASTLANE_USER=123@qq.com
export FASTLANE_PASSWORD=123
export FASTLANE_SESSION='---\n- !ruby/object:HTTP::Cookie\n name: myacinfo\n value: DAWTKNV2c41f4288f0e103b6fdea185b9d49ab4e658cc1e96acfc245fc89e8758e4c491bfe4caac146df00fc6e02544f406392b637dd8b69a5f42a6df93242593ceb403c6330c6650bb01f7de7e46269f6da0eed9f2f6f3448916d9e66564910ea2f025fc12155d0348669cdf1227538660b13324e1e2ea8aa6f445f450ead242e3a40d168df243e5301e210869a7343f26046187aa7228c97f13dc75c2a98396b352ce8296eb5a5cdedaf8f3bfbaff1db4ff99b9e5c8c5bcdfb368705ef6bc229312273be2e1e2d48e38ec644e436a3eb77f5ddb73547301373d6e178529100254f4b20231d56549784eba6dcf2ceefc6fd166f930b279686dae2ebe3bafd6b8b3977418dc32843622d35f5e67da2dbd2085e6631633931326633626362636636363064356161303234633236643933386431663234343236373662MVRYV2\n domain: apple.com\n for_domain: true\n path: "/"\n secure: true\n httponly: true\n expires:\n max_age:\n created_at: 2021-04-29 21:43:37.125330000 +08:00\n accessed_at: 2021-04-29 21:46:37.450439000 +08:00\n- !ruby/object:HTTP::Cookie\n name: DES5b20808048b404db61d5763fa00a5fdb6\n value: HSARMTKNSRVXWFla9ATyYXlJURgnXhKH93CZqKg5rl0bK41pXW7ha5GdyThO+iw2QQVoRkUNJhkMQy5IND4GguSexvV10l3Xq3zsxekdmwQrJDq/YwMxv1hXHGRYEC/ssF54n+/gSRVX\n domain: idmsa.apple.com\n for_domain: true\n path: "/"\n secure: true\n httponly: true\n expires:\n max_age: 2592000\n created_at: 2021-04-29 11:14:19.188147000 +08:00\n accessed_at: 2021-04-29 21:43:33.579849000 +08:00\n- !ruby/object:HTTP::Cookie\n name: dqsid\n value: eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpYXQiOjE2MTk3MDM4MTcsImp0aSI6ImRNcGZrSENjMnZPZk93cmQweWJEZHcifQ.KBtHSVPEoWalNGdpCbeadO3X1Dgxwpka9zO8sK4daDw\n domain: appstoreconnect.apple.com\n for_domain: false\n path: "/"\n secure: true\n httponly: true\n expires:\n max_age: 1800\n created_at: &1 2021-04-29 21:46:39.630665000 +08:00\n accessed_at: *1\n'
六.开始打包和版本号及build_number配置
目前ios/fastlane/Appfile下的配置文件,先采用默认的配置。
default_platform(:ios)
platform :ios do # 打包发布的平台为ios
desc "Push a new beta build to TestFlight" # 该打包脚本命令的描述
lane :beta do # beta是打包的脚本命令 打包上传时执行 fastlane beta
increment_build_number(xcodeproj: "Runner.xcodeproj") # 打包Runner.app-每次打包自动吧打包build_number加1
build_app(workspace: "Runner.xcworkspace", scheme: "Runner") # 开始打包-打包时使用的配置文件
upload_to_testflight #打包完成后-上传到testflight
end
end
在ios目录下的命令行,直接运行fastlane beta进行打包发版
fastlane beta
在经过确认平台,增加build_number,打包应用,上传应用后就已经构建上传成功了,如下图。在testFlight里面也可以看到。
但此时有一个问题,它的打包build_number是自增的不是使用的在flutter目录下pubspec.yaml文件中配置的version: 1.2.0+1200013版本号和build_number,如果想使用pubspec.yaml文件中配置的version来作为版本号和build_number,需要调整:
第一步:ios/fastlane/Appfile配置文件,去掉 increment_build_number(xcodeproj: "Runner.xcodeproj")自增版本号方法。
改动后ios/fastlane/Appfile文件配置如下
default_platform(:ios)
platform :ios do # 打包发布的平台为ios
desc "Push a new beta build to TestFlight" # 该打包脚本命令的描述
lane :beta do # beta是打包的脚本命令 打包上传时执行 fastlane beta
build_app(workspace: "Runner.xcworkspace", scheme: "Runner") # 开始构建归档
upload_to_testflight #构建归档完成后-上传到testflight
end
end
第二步:配置ios/Runner/info.plist文件中CFBundleVersion字段value为$(FLUTTER_BUILD_NUMBER)
<key>CFBundleVersion</key>
<string>$(FLUTTER_BUILD_NUMBER)</string>
注意:ios/Runner/info.plist文件中CFBundleVersion字段本来就是$(FLUTTER_BUILD_NUMBER),但由于原先fastlane beta里面配置了自增build_number,所以此时该字段变成了固定的数字,需要手动改回来一下。
第三步:由于取消了打包Runner.app命令,需要手动执行flutter打包ios命令,在项目根目录执行命令
flutter build ios
cd ios
fastlane beta
此时打包构建自动上传就完成了,可以配合jenkins之类的持续部署工具进行一键打包上传。
七.总结
这只是记录了一下fastlane最常用的发布上传,它还提供别的很多功能,比如
快车道 | |
---|---|
🚀 | 每次将新版本发布到商店或Beta测试服务时,都可以节省数小时 |
✨ | 与您现有的所有工具和服务集成(超过400个集成) |
📖 | 在MIT许可下100%开放源代码 |
🎩 | 简易的设置助手,可在几分钟内上手 |
⚒ | 在您的机器上运行,这是您的应用程序和数据 |
👻 | 与所有主要的CI系统集成 |
🖥 | 支持iOS,Mac和Android应用 |
🔧 | 扩展和自定义快速通道以满足您的需求,您不依赖任何人 |
💭 | 不再记住任何命令,只有fastlane |
🚢 | 从任何计算机(包括CI服务器)进行部署 |
详细的可以看官网https://docs.fastlane.tools。