在shell上使用xcodebuild打包

最近学习了一下shell脚本,对unix很多命令更熟悉了,也学到了很多新命令
简单使用xcodebuild来写了一个打包的脚本,流程是打包,导出ipa,上传到蒲公英 / bugly之类的测试网站,通知 slack

archive

打包,和导出ipa都是使用这个命令,可以使用man xcodebuild来查看详细用法
其中打包使用的是archive这个命令,一般archive 完导出一个.xcarchive 类型的文件,这需要我们指定路径
你打包的项目是project还是workspace也要指定,使用-project <projectName>或者-workspace <workspaceName>
还有一个就是要指定scheme,使用-scheme ,这个scheme有个地方要注意的是,如果scheme name有空格则要用转义,即-scheme test\ dev这里要小吐槽一下,不建议scheme取有空格名字,可能会有各种转义问题
所以打包命令就是这样,其他选项默认即可

1
xcodebuild archive -archivePath ~/Desktop/tmp.xcarchive -workspace test.xcworkspace -scheme test\ dev

export

打完包则要导出ipa文件,也是使用xcodebuild,使用的命令是-exportArchive
要指定打包的路径,即刚才打包出来的 *.xcarchive 文件,使用-archivePath ~/Desktop/tmp.xcarchive

然后就是导出ipa文件的路径

1
-exportPath ~/Desktop/

最后就是要指定一些选项,

<.plist path>
1
2
3
4
5
6
```
需要指定一个plist文件的路径
例如使用xcode导出的时候会让你选择以什么方法打包

不指定的话一般默认`development`,还有`ad-hoc,app-store,package,enterprise,developer-id`等选项
还有 teamID是要指定的你的开发者账号的team id,

xcodebuild -showBuildSettings -workspace test.xcworkspace -scheme testScheme |grep DEVELOPMENT_TEAM

1
2
3
4
5
6
7
8
9
10
11
12
13
14
使用这个命令可以查看到,也可以上开发者官网上查看
指定的plist文件就是这样

```xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">
<plist version="1.0">
<dict>
<key>teamID</key>
<string>${teamID}</string>
<key>method</key>
<string>${method}</string>
</dict>
</plist>

上传

这里我上传的是蒲公英,使用bugly也是差不多的
使用的是curl命令ipaPath即指定你的ipa的路径,然后添加你的user key和api key就行了

1
curl -F "file=@$ipaPath" -F "uKey=<your user key>" -F "_api_key=<your api key>" https://qiniu-storage.pgyer.com/apiv1/app/upload

通知slack

我使用的也是curl命令,最近经常用这个命令,感觉很好用

1
curl -X POST --data-urlencode 'payload={"channel": "@ascen", "username": "iOS", "text": "archive '${scheme}' <https://www.pgyer.com/****|你想写的链接文字>.", "icon_emoji": ":ghost:"}' https://hooks.slack.com/services/T2A8E9XSP/B50F24ZRS/**你的url**

所以选择shell script是这样的

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
#!/bin/sh
#!/bin/bash

currentPath=$(pwd)

#########configuration############
scheme="testScheme"
teamID="your team id"
method="development"
# project path
cd ~/Desktop/your project path

##################################

xcodebuild clean

xcws=$(echo *.xcworkspace)
xcodebuild archive -archivePath ~/Desktop/tmp.xcarchive -workspace $xcws -scheme $scheme

exportOptions="<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">
<plist version="1.0">
<dict>
<key>teamID</key>
<string>${teamID}</string>
<key>method</key>
<string>${method}</string>
</dict>
</plist>"

echo $exportOptions > ~/Desktop/exportOptions.plist

xcodebuild -exportArchive -archivePath ~/Desktop/tmp.xcarchive -exportPath ~/Desktop/ -exportOptionsPlist ~/Desktop/exportOptions.plist

# delete tmp file
rm -rf ~/Desktop/tmp.xcarchive
rm ~/Desktop/exportOptions.plist

ipaPath="/Users/Ascen/Desktop/${scheme}.ipa"
echo $ipaPath

curl -F "file=@$ipaPath" -F "uKey=<your user key>" -F "_api_key=<your api key>" https://qiniu-storage.pgyer.com/apiv1/app/upload

curl -X POST --data-urlencode 'payload={"channel": "@ascen", "username": "iOS", "text": "archive '${scheme}' <https://www.pgyer.com/shundaochuxing|乘客端>.", "icon_emoji": ":ghost:"}' https://your slack url

rm $ipaPath

cd $currentPath