0%

github action编译flutter ios应用实践

由于实验室的项目需要将flutter开发的应用做一个ios的版本,虽然flutter本身是跨平台的,但是需要编译成Ios的应用还是long way to go,

而且由于我使用的电脑是win,而开发ios应用必须要用到mac的环境,每次借电脑也不是那么方便,则在网上看到了一种可以使用github action来编译flutter ios应用的文章(github action牛逼,免费还提供mac环境)。

原文章的链接如下:https://medium.com/@pratheeshrussell/building-a-flutter-ios-app-with-codemagic-and-github-actions-9cd61321119b

作者还提供了另外一个编译ios应用的办法, 使用codemagic,这是一个移动应用CI网站,可以提供一些移动应用的在线编译环境,另外一种就是使用github action,两种方式我都进行了实践,都可以成功将flutter应用打包成ipa文件。

前言

要编译成ipa文件的flutter项目原来就在mac真机上成功编译过,也就是说已经解决了一些小问题,另外,此过程还是需要一个付费的开发者账号才能够完成,另外该流程假设您有一定的开发ios的基础,知道开发ios需要的各种中间步骤,比如申请各种苹果的证书等。

关于苹果的各种证书可以参考这篇文章 https://ask.dcloud.net.cn/article/152

准备证书

最后需要的有两个证书文件,一个后缀为.p12另外一个是.mobileprovision

生成p12文件

使用参考的文章中作者编写的工具,来生成一个证书,下载该工具,然后点击新建项目

github-action编译flutter-ios应用实践_0

随便输入一个项目名,然后选择创建的项目,然后email处可以换成自己的苹果开发者账号对应的邮箱(不知道是否需要这么做),点击Generate Sign Requests按钮,可以选择将生成的证书放到桌面,名字如下图所示:

github-action编译flutter-ios应用实践_1

然后需要登录apple的开发者账号,https://developer.apple.com/membercenter

然后选择Certificates, Identifiers & Profiles

github-action编译flutter-ios应用实践_2

然后点击如图所示的加号

github-action编译flutter-ios应用实践_3

选择Apple Development 然后continue,然后会有一步让你上传一个文件,这时就把我们之前得到的证书文件上传

github-action编译flutter-ios应用实践_4

最后完成后点击Download,下载到桌面,没有意外的话应该是这个样子的一个文件

github-action编译flutter-ios应用实践_5

然后将我们之前使用的软件关闭,再打开,如果不关闭再重新打开的话 其他的tab无法检测到我们新建的项目,重新打开后,打开第二个tab,并选中我们之前创建的项目,注意:这里必须要创建一个密码,否则后面会有问题,可以创建一个简单的密码。

github-action编译flutter-ios应用实践_6

然后点击Locate选择我们刚刚的development.cer,然后点击generate p12,生成完成后,点击copy p12将p12文件拷贝到桌面,最后得到的文件如下:

github-action编译flutter-ios应用实践_7

至此,得到了一个p12文件

生成mobileprovision文件

这一步首先需要申请一个App ID (App的唯一标识),详情可以参考这篇文章

然后回到开发者账号的Certificates, Identifiers & Profiles处,点击如下图所示的地方,生成一个Profiles

github-action编译flutter-ios应用实践_8

然后选中ios app development

github-action编译flutter-ios应用实践_9

然后选择我们刚刚创建的App ID

github-action编译flutter-ios应用实践_10

然后选择我们刚刚在生成.p12文件时生成的对应的development.cer一定要对应!

github-action编译flutter-ios应用实践_11

然后device这里可以全选

github-action编译flutter-ios应用实践_12

最后一步,給这个profile起一个名字

github-action编译flutter-ios应用实践_13

最后点击下载即可

github-action编译flutter-ios应用实践_14

最后就能得到一个下图的文件

github-action编译flutter-ios应用实践_15

准备github action 编译

准备环境

首先需要将项目上传到github上面,然后在repository的Settings中找到Secrets,增加对应的Secrets,这里增加的变量可以在github action中通过{{ secrets.name }}引用到,从而防止将密码明文的写在github action文件中。

github-action编译flutter-ios应用实践_16

CERT_PASSWORD是我们之前设置的密码

github-action编译flutter-ios应用实践_17

MOBILEPROVISION_BASE64是我们的.mobileprovision文件的base64编码,可以使用这个网站来将其编码成base64格式,此举是为了解决Secrets不能上传文件的问题,找到https://www.base64encode.org/网站的Encode files to Base64 format部分,上传文件,然后点击ENCODE,然后点击CLICK OR TAP HERE 复制其编码,并添加到repository的Secrets中,

github-action编译flutter-ios应用实践_18

P12_BASE64的过程可以参照MOBILEPROVISION_BASE64的过程,只不过需要base64编码的文件是.p12文件。

准备action文件

在项目的.github/workflows文件夹下新建一个build.yml文件,其中的内容如下所示,这里直接使用的是文章的action文件的内容,做了一点点更改,更改了代码的分支以及使用的action插件的版本

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
# Set the name of your workflow
name: IOSBuilder

# Controls when the action will run.
# [workflow_dispatch] --> allows to run the workflow manually
# you may use the following to build on each push
# on:
# push:
# branches: [ master ]
on: [workflow_dispatch]

# A workflow run is made up of one or more jobs that can run sequentially or in parallel
jobs:
# In this workflow we use a single job called "build"
build:
# The type of runner ie, the OS that the job will run on. apart from mac windows and ubuntu are also available
runs-on: macos-latest

# Steps represent a sequence of tasks that will be executed as part of the job
steps:
# Checks-out your repository under $GITHUB_WORKSPACE, so our job can access it
- uses: actions/checkout@v2
with:
ref: ios

- name: Create Folder for certificates and profiles
run: |
mkdir -p ~/Library/MobileDevice/Provisioning\ Profiles
mkdir -p ~/Library/MobileDevice/Certificates/

# decode and save the p12 and provisioning files stored as secrets
- name: Get Certificate
id: certFileDecode
uses: timheuer/base64-to-file@v1.0.3
with:
fileName: 'certificate.p12'
encodedString: ${{ secrets.P12_BASE64 }}
- name: Copy Certificate
run: mv ${{ steps.certFileDecode.outputs.filePath }} ~/Library/MobileDevice/Certificates/certificate.p12

- name: Get Profile
id: profFileDecode
uses: timheuer/base64-to-file@v1.0.3
with:
fileName: 'decoded.mobileprovision'
encodedString: ${{ secrets.MOBILEPROVISION_BASE64 }}
- name: Copy Profiles
run: mv ${{ steps.profFileDecode.outputs.filePath }} ~/Library/MobileDevice/Provisioning\ Profiles/decoded.mobileprovision

#install the necessary dependencies
- name: Install python and codemagic tools
uses: actions/setup-python@v2
with:
python-version: 3.7
- name: Install python dependencies
run: python -m pip install codemagic-cli-tools
- name: Initialize Keychain with certificate
run: |
keychain initialize
keychain add-certificates --certificate ~/Library/MobileDevice/Certificates/certificate.p12 --certificate-password ${{ secrets.cert_password }}

#install flutter
- name: Flutter get
uses: subosito/flutter-action@v1.4.0
with:
flutter-version: '1.12.13+hotfix.9'
- run: flutter pub get

#build and sign the ipa
- name: Building IPA
run: |
xcode-project use-profiles
flutter build ios --release --no-codesign
xcode-project build-ipa --workspace ios/Runner.xcworkspace --scheme Runner --config Release
#collect the files
- name: collect ipa artifacts
uses: actions/upload-artifact@v2
with:
name: adhoc-ipa
# Path to the release files
path: build/ios/ipa/*.ipa

将commit推到github上,在项目的action tab中,就可以看到对应的action,

github-action编译flutter-ios应用实践_19

点击run workflow即可,全部完成后既可找到对应的ipa文件

github-action编译flutter-ios应用实践_20

可以在下图的页面中找到对应的ipa文件,并可以点击下载。

github-action编译flutter-ios应用实践_21

至此,全部的打包工作就已经完成,可以使用github action提供的mac环境来编译flutter的ios版本。