使用 Xcode build 命令打包与 fir-cli 自动发布项目

由于最近需要开发的工程有多个环境, 又是企业式发布 app 到 fir 上, 每次打一个包实在是太麻烦了, 而且需要不停的更换证书和描述文件, 所以决定把打包操作用 shell 执行。记录一下操作过程。

我目前的 app 是有三个环境的(后来又多了一个…), 一个是开发环境, 另一个是 UAT 环境, 剩下的一个就是生产环境了。由于开发环境和生产环境我们可以用 Debug 和 Release 来区分, 所以我们只要多配置一个 UAT 环境的就可以了。

首先先建立一个 configurations 我这里叫 WM_UAT

然后把证书配好

接下来去配置不同的 bundle id, bundle version 和 bundle display name 这个可以在 build setting 里面加入配置 然后在工程的 plist 文件中去取, 首先在 build setting 中增加配置

然后加入 bundle version 和 bundle display name

对于 bundle id 的配置在这里

最后在 plist 中读取相应的值, 这样就做到了不同的环境对应不同的配置

对于程序中请求 url 可以通过 bundle id 来区分, 或者用 host 区分的也可以, 这个看项目。

工程配置完毕了开始写 shell 我这里是只打了 UAT 和 生产的包, 根据包的不同要有不同的导出配置文件

这个配置文件的内容可以先用 Xcode 的 archive 打一个包, 然后 export 然后把导出文件夹中的 ExportOptions.plist 复制过来, 改一改 bundle id 和 描述文件名称就可以了, 这两项位于 ExportOptions.plist 的 provisioningProfiles 字段中

然后安装 fir-cli 这个安装命令倒是很简单, 只要执行gem install fir-cli就可以了。不过我安装这个的时候遇到了点问题, 他管我要了两个目录的权限, 其中一个是/usr/bin, 我手贱的设置了更改了/usr/bin的权限之后发现命令行用不了了!!提示是这样的

1
2
login: Could not determine audit condition
[进程已完成]

网上有说开启root账户的然后执行以下命令的

1
2
3
4
5
6
7
8
9
10
11
#第一个解决办法
chown -R root:wheel /usr/bin
chmod 4755 /usr/bin/sudo
reboot //重启电脑

#第二个解决办法(和第一个差不多)
sudo -s    //登录你的ROOT用户密码
chown -R root:wheel /usr/bin
chmod 4755 /usr/bin/sudo
chmod 4755 /usr/bin/login
reboot

反正我试过了, 都不行。 后来我试了这个方法终于把命令行登进去了

Mac Terminal Error : Could not determine audit condition When I launched my terminal today, was welcomed with this error :- login: PAM Error (line 396): System error login: Could not determine audit condition [Process completed] It is most probably because I was playing with my /usr/bin permissions the other day. The fix is easy. Just delete the “/usr/bin/login” dir. But how do I delete it, if I can’t access the “Terminal” altogether ? Come on - You can access any folder using the “Finder”.

  1. Open “Finder”
  2. Open “Go To Folder”
  3. Type “/usr/bin/login”
  4. Delete it.

开搞之前记得先备份…

最后, archive.sh的代码

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
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
#创建目录

if [ ! -d ./ipaPackage ];
then
mkdir -p ipaPackage;
fi

#工程绝对路径
project_path=XXX

#工程名
project_name=wm

#scheme名
scheme_name=wm

#build文件夹路径
build_path=${project_path}/build

#导出.ipa文件所在路径
exportIpaPath=${project_path}/ipaPackage/${development_mode}


echo "请选择打包类型 [1:生产 2:UAT 3:开发 4:总部助手] 输入数字之后按回车"

##
read number
while([[ $number != 1 ]] && [[ $number != 2 ]] && [[ $number != 4 ]] && [[ $number != 3 ]])
do
echo "请输入数字1或2或3或4"
echo "请选择打包类型 [1:生产 2:UAT 3:开发 4:总部助手] 输入数字之后按回车"
read number
done

if [ $number == 1 ];then
#打包模式 Release
development_mode=Release
#打包配置文件路径
exportOptionsPlistPath=${project_path}/ExportOptions.plist
echo '准备打包生产...'
elif [ $number == 2 ];then
#打包模式 WM_UAT
development_mode=WM_UAT
#打包配置文件路径
exportOptionsPlistPath=${project_path}/ExportOptionsUAT.plist
echo '准备打包UAT...'
elif [ $number == 3 ];then
#打包模式 Debug
development_mode=Debug
#打包配置文件路径
exportOptionsPlistPath=${project_path}/ExportOptionsDebug.plist
echo '准备打包开发...'
else
#打包模式 WM_ZB
development_mode=WM_ZB
#打包配置文件路径
exportOptionsPlistPath=${project_path}/ExportOptionsZB.plist
echo '准备打包总部助手...'
fi

echo '正在清理工程...'

xcodebuild \
clean -configuration ${development_mode} -quiet  || exit

echo '清理完成'
echo '正在编译工程:'${development_mode}

xcodebuild \
archive -workspace ${project_path}/${project_name}.xcworkspace \
-scheme ${scheme_name} \
-configuration ${development_mode} \
-archivePath ${build_path}/${project_name}.xcarchive  -quiet  || exit

echo '编译完成'
echo '开始ipa打包...'

xcodebuild -exportArchive -archivePath ${build_path}/${project_name}.xcarchive \
-configuration ${development_mode} \
-exportPath ${exportIpaPath} \
-exportOptionsPlist ${exportOptionsPlistPath} \
-allowProvisioningUpdates \
-quiet || exit

if [ -e $exportIpaPath/$scheme_name.ipa ]; then
echo 'ipa包已导出'
open $exportIpaPath
else
echo 'ipa包导出失败'
fi
echo '打包ipa完成'

if [ $number == 2 ];then
# UAT环境
# xxx登录需要Fir平台的token
fir login -T xxx
fir publish $exportIpaPath/$scheme_name.ipa
elif [ $number == 3 ];then
# 开发环境
# xxx登录需要Fir平台的token
fir login -T xxx
fir publish $exportIpaPath/$scheme_name.ipa
elif [ $number == 4 ];then
# 总部助手
# xxx登录需要Fir平台的token
fir login -T xxx
fir publish $exportIpaPath/$scheme_name.ipa
else
echo '生产环境请手动上传'
fi