Back

【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命令行工具已安装已经安装。

copy.png

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个选项

  1. 自动生成屏幕截图功能
  2. 自动打包发布到testFlight上面
  3. 自动打包发布到App store上面
  4. 手动设置

这个选择是初始化生成的功能,我们也可以后续手动配置其他的

这里选择的是第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格式的应用程序专用密码

copy.png

把这个应用专用密码配置环境变量,配置代码,按步骤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即可,会自动帮我们复制要配置的环境变量。

copy.png

配置代码,按步骤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里面也可以看到。

copy.png

但此时有一个问题,它的打包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。

参考文章:

1.fastlane官网

2.iOS效率神器fastlane自动打包

3.fastlane 支持IOS双重认证(不中途打断上传appstore流程)

郭炯韦个人博客 备案号: 豫ICP备17048833号-1
Top