脚本化生成 ipa 并上传至第三方托管
- 目录
- 简介
- 环境
- 关键点分析
- 源码
- 效果图
- 遇到的问题
- 致谢
简介
项目进行一定阶段的时候,需要给团队中的QA
同学(但不局限于QA
)安装app
有时候修复了几个bug
后,瞬间七八个手机飞到面前,感觉像是医生给病人打针一样,biu~
下一个~
biu~
下一个~
biu~
下一个~
biu~
下一个~
biu~
下一个~
...
一般可以把测试版的app
放到第三方托管网站上(比如笔者使用的蒲公英),打包后可以把ipa
上传,然后需要安装的同学可以直接扫码或者safari
打开链接安装即可
然后就变成了,打包 --> 上传
偶尔几次倒还可以接受,但机械重复的动作总是让人烦躁
于是乎,只能抽时间研究研究自动化脚本(一个命令执行打包成ipa
,并上传到蒲公英)
环境
笔者环境
关键点分析,一些相关命令说明,时间紧的同学可以直接拖到源码部分
可以 $ man xcodebuild
- 在
Xcode
中如果执行command b
或者command r
时候,其实相当于先执行xcodebuild
,然后xcrun
(实际操作中,会出现问题,见下文问题总结)或者xcodebuild -exportArchive
-
xcodebuild
命令
首先cd
到项目根目录
-
xcodebuild -version
查看Xcode
的版本号和build
版本
ff:ff fengfeng$ xcodebuild -version
Xcode 9.3
Build version 9E145
ff:ff fengfeng$
-
xcodebuild -list
查看项目全部的
ff:ff fengfeng$ xcodebuild -list
Information about project "***":
Targets:
ff
Build Configurations:
Debug
Release
discribution
If no build configuration is specified and -scheme is not passed then "Release" is used.
Schemes:
ff
ff:ff fengfeng$
-
xcodebuild -showsdks
查看可以使用的sdk
ff:ff fengfeng$ xcodebuild -showsdks
iOS SDKs:
iOS 11.3 -sdk iphoneos11.3
iOS Simulator SDKs:
Simulator - iOS 11.3 -sdk iphonesimulator11.3
macOS SDKs:
macOS 10.13 -sdk macosx10.13
tvOS SDKs:
tvOS 11.3 -sdk appletvos11.3
tvOS Simulator SDKs:
Simulator - tvOS 11.3 -sdk appletvsimulator11.3
watchOS SDKs:
watchOS 4.3 -sdk watchos4.3
watchOS Simulator SDKs:
Simulator - watchOS 4.3 -sdk watchsimulator4.3
ff:ff fengfeng$
-
xcodebuild build [-optionName ...]
适用于workspace
编译
xcodebuild build -workspace ***.xcworkspace \
-scheme *** \
-configuration Debug \
-sdk iphoneos11.3
参数 | 说明 |
---|---|
-workspace ***.xcworkspace |
工作空间文件 |
-scheme *** |
构建工程名称 |
-configuration [Debug/Release] |
构建Debug 或者Release
|
-sdk iphoneos11.3 |
指定编译时使用的SDK |
-
xcodebuild archive [-optionName ...]
编译生成. xcarchive
包
xcodebuild archive -archivePath /***/*** \
-workspace ***.xcworkspace \
-scheme *** \
-configuration Debug \
-sdk iphoneos11.3
参数 | 说明 |
---|---|
-archivePath /***/*** |
保存生成.xcarchive 包的路径 |
-workspace ***.xcworkspace |
工作空间文件 |
-scheme *** |
构建工程名称 |
-configuration [Debug/Release] |
构建Debug 或者Release
|
-sdk iphoneos11.3 |
指定编译时使用的SDK |
-
xcodebuild -exportArchive [-optionName ...]
.archive
包导出ipa
文件
xcodebuild -exportArchive \
-archivePath /xx/xx/xx.xcarchive \
-exportPath /xx/xx/xx \
-exportOptionsPlist /xx/xx/xx.plist
参数 | 说明 |
---|---|
-archivePath |
xcodebuild archive [-optionName ...] 编译生成. xcarchive 包 |
-exportPath |
导出的ipa保存的目录 |
-exportOptionsPlist |
导出时 需要的 配置文件的 路径 |
- 详细的
exportOptionsPlist
看👇,如果不知道怎么写的话,可以先手动打包需要的版本,打包成功的文件夹中会有exportOptionsPlist
,可以复制一份到某个地方,给上面的命令使用即可
1 <?xml version="1.0" encoding="UTF-8"?>
2 <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
3 <plist version="1.0">
4 <dict>
5 <key>compileBitcode</key>
6 <false/>
7 <key>method</key>
8 <string>development</string>
9 <key>provisioningProfiles</key>
10 <dict>
11 <key>com.***</key>
12 <string>***</string>
13 </dict>
14 <key>signingCertificate</key>
15 <string>iPhone Developer</string>
16 <key>signingStyle</key>
17 <string>manual</string>
18 <key>stripSwiftSymbols</key>
19 <true/>
20 <key>teamID</key>
21 <string>***</string>
22 <key>thinning</key>
23 <string><none></string>
24 </dict>
25 </plist>
-
xcodebuild clean [-optionName ...]
清除编译过程生成文件
xcodebuild clean -workspace ***.xcworkspace \
-scheme *** \
-configuration Debug \
-sdk iphoneos11.3
参数 | 说明 |
---|---|
-workspace ***.xcworkspace |
工作空间文件 |
-scheme *** |
构建工程名称 |
-configuration [Debug/Release] |
构建Debug 或者Release
|
-sdk iphoneos11.3 |
指定编译时使用的SDK |
-
编译和提取
ipa
的主要命令就是👆介绍的,现在说明下如何将打包好的ipa
上传到蒲公英
a. 准备API Key
User Key
password
如何查看API Key
User Key
:登录蒲公英 - 右上角 - 账户设置 - API 信息b. 使用如下命令,注意
file=
后面的@
curl -F "file=@/***/***/***.ipa" \ -F "uKey=user_key" \ -F "_api_key=api_key" \ -F "password=pwd" \ https://qiniu-storage.pgyer.com/apiv1/app/upload
c. 如果上传后,会返回一串
json
,错误说明,或者成功信息
上传成功后返回的数据,格式化后如下{ "code":0, "message":"", "data":{ "appKey":"***", "userKey":"***", "appType":"1", "appIsLastest":"1", "appFileSize":"***", "appName":"***", "appVersion":"1.3", "appVersionNo":"1", "appBuildVersion":"6", "appIdentifier":"***", "appIcon":"***", "appDescription":"***", "appShortcutUrl":"***", "appCreated":"2018-06-17 22:03:56", "appUpdated":"2018-06-17 22:03:56", "appQRCodeURL":"***" } }
源码
使用复制下面源码,将各种路径和配置依据实际情况配置正确,然后终端执行即可
默认生成的是Develop
版本,因为笔者公司提交app store
要求专人打包
使用前 需要提前 切换好分支或者 git pull
哈哈,从此,一键上传,然后把生成的链接或者二维码给相关同学即可,再也不用,一个手机一个手机的打针了 ~
#!/bin/bash
scheme_name=***
branch_name=develop
configuration=Develop
date=`date +%Y%m%d_%H%M%S`
# 项目根路径
source_path="/***/***/"
# 打包生成的文件 所在的文件夹
ipa_root_path="/***/***"
# .xcarchive 文件所在的文件夹
ipa_build_path=$ipa_root_path"/build/"
# 生成的 .xcarchive文件 (不带后缀 .xcarchive)
ipa_build_result_path=$ipa_build_path$date
# 打包成功后生成的文件夹名,由分支、时间组成
ipa_name=$branch_name"_"$date
# -exportOptionsPlist 需要的 plist 文件的路径
plist_path="/***/***/***.plist"
# 如果有 .xcarchive 文件,移动至垃圾桶 或者 删除之
if ! [ "`ls $ipa_build_path`" = "" ]; then
# mv $ipa_build_path/* ~/.Trash
rm -rf $ipa_build_path/*
if [ $? -ne 0 ]; then
echo "~~~~~~~~ delete files failed ~~~~~~~~"
exit 1
fi
fi
# build ***.xcworkspace
# 已废弃
# xcodebuild \
# -workspace $source_path"/"$scheme_name".xcworkspace" \
# -scheme $scheme_name \
# -configuration Debug \
# clean \
# build \
# -derivedDataPath $ipa_build_result_path
xcodebuild \
archive -archivePath $ipa_build_result_path \
-workspace $source_path$scheme_name".xcworkspace" \
-scheme $scheme_name \
-configuration $configuration
if [ -e $ipa_build_result_path".xcarchive" ]; then
echo "~~~~~~~~ xcodebuild successful ~~~~~~~~"
else
echo "~~~~~~~~ xcodebuild failed ~~~~~~~~"
exit 1
fi
# xcrun ***.ipa
# 已废弃
# xcrun -sdk iphoneos PackageApplication \
# -v $ipa_build_result_path/Build/Products/Debug-iphoneos/$scheme_name.app \
# -o $ipa_path/$ipa_name
xcodebuild -exportArchive \
-archivePath $ipa_build_result_path.xcarchive \
-exportPath $ipa_root_path/$ipa_name \
-exportOptionsPlist $plist_path
if [ -e $ipa_root_path/$ipa_name ]; then
echo -e "creat ipa successful\n"
open $ipa_root_path/$ipa_name
else
echo "creat ipa failed"
exit 1
fi
# 上传至蒲公英
# ipa路径
pgy_ipa_path=$ipa_root_path/$ipa_name/$scheme_name".ipa"
pgy_api_key="***"
pgy_user_key="***"
pgy_pwd="***"
echo "-------->>>>>> 上传ipa到蒲公英 <<<<<<--------"
curl -F "file=@${pgy_ipa_path}" \
-F "uKey=${pgy_user_key}" \
-F "_api_key=${pgy_api_key}" \
-F "password=${pgy_pwd}" \
https://qiniu-storage.pgyer.com/apiv1/app/upload
if [ $? = 0 ]; then
echo -e "\n"
echo "-------->>>>>> 上传蒲公英成功 <<<<<<--------"
else
echo -e "\n"
echo "-------->>>>>> 上传蒲公英失败 <<<<<<--------"
fi
效果图
遇到的问题
-
xcrun: error: unable to find utility "PackageApplication", not a developer tool or in PATH creat ipa failed
Xcode 8.3
移除了PackageApplication
,使用archive
或者 参考:https://stackoverflow.com/questions/43068608/xcrun-error-unable-to-find-utility-packageapplication-not-a-developer-tool/43185342
2.requires a provisioning profile
exportOptionsPlist
文件格式错误,缺少provisioningProfiles
可以正常手动打包,并且导出为对应的ipa
,然后在生成的ipa
所在的文件中有ExportOptions.plist
文件,可以使用这个即可
error: exportArchive: "***.app" requires a provisioning profile with the Associated Domains and Push Notifications features.
Error Domain=IDEProvisioningErrorDomain Code=9 ""***.app" requires a provisioning profile with the Associated Domains and Push Notifications features." UserInfo={NSLocalizedDescription="***.app" requires a provisioning profile with the Associated Domains and Push Notifications features., NSLocalizedRecoverySuggestion=Add a profile to the "provisioningProfiles" dictionary in your Export Options property list.}
** EXPORT FAILED **
不定期更新 不合适的地方 还请指点~ 感激不尽