iOS开发系列-自动化分发测试打包
概述
项目在测试阶段需要频繁打包给测试人员,对于这些固定化的操作我们可以使用自动化的手段去解决,将时间放在有意义的事情上。
xcodebuild 是苹果发布自动构建的工具。

Shell脚本打包
xcrun PackageApplication方式在Xcode升级到8.3已就过期了,苹果建议我们使用xcodebuild -exportArchive的方式。
我们平时通过Xcode执行Run命令,生成iPa的中间主要分为两个大的步骤:
xcodebuild archive生成ProjectName..xcarchive文件xcodebuild -exportArchive将1步骤中的.xcarchive生成ipa安装包
打包脚本编写
创建一个xcodebuild.sh用来编写脚本如下:
#!/bin/bash
ZWProjectName="TestProj"
ZWScheme="TestProj"
ZWConfiguration="Release"
ZWDate=`date +%Y%m%d_%H%M`
ZWWorkspace=`pwd`
echo "workspace=$ZWWorkspace-----------------------"
ZWBuildDir="$ZWWorkspace/build" #build路径
ZWBuildTempDir="$ZWBuildDir/temp/$ZWDate" #构建过程中的文件
HCIpaDir="$ZWBuildDir/ipa" #生成ipa文件路径
#-------PackageApplication已经不推荐使用了 warning: PackageApplication is deprecated, use `xcodebuild -exportArchive` instead.-----
xcodebuild archive \
-workspace "$ZWWorkspace/$ZWProjectName.xcodeproj/project.xcworkspace" \
-scheme "$ZWScheme" \
-configuration "$ZWConfiguration" \
-archivePath "$ZWBuildTempDir/$ZWProjectName.xcarchive"
#CODE_SIGN_IDENTITY="" #证书
#PROVISIONING_PROFILE="" #描述文件UUID
xcodebuild \
-exportArchive \
-archivePath "$ZWBuildTempDir/$ZWProjectName.xcarchive" \
-exportPath "$HCIpaDir/$ZWDate/" \
-exportOptionsPlist "./exportOptionsPlist.plist" \
#CODE_SIGN_IDENTITY="" #证书
#PROVISIONING_PROFILE="" #描述文件UUID
对于证书文件与描述文件我们可以添加,如果这里没有填写,那么会默认按着xcode的当前配置。如果你想在这里配置,可通过下面的方式来获取CODE_SIGN_IDENTITY与PROVISIONING_PROFILE对应的内容。
CODE_SIGN_IDENTITY的获取
在钥匙串找到我们的证书,右键显示简介,可查看对应证书的CODE_SIGN_IDENTITY

PROVISIONING_PROFILE的获取
描述文件UUID的获取,安装的的描述文件在电脑的安装路径/Users/haifeng/Library/MobileDevice/Provisioning Profiles。点击对应的证书预览中就可以看到UUID。

exportOptionsPlist.plist
对于通过xcodebuild -exportArchive方式生成ipa需要一个exportOptionsPlist.plist文件。主要描述了打包的一些信息。这个可能随着xcode版本会变化,我们可以通过第一次使用Xcode手动打包一次生成不止ipa还有一个ExportOptions.plist的文件。我们只需要将这个文件名修改exportOptionsPlist.plist就可以了。

执行脚本自动化打包
Xcode配置
在执行脚本之前确保一下配置
- 当前编译配置release

- 由于我这里没有开发者账号密码 我手动配置

配置完后编译项目不存在报错就可以了,可以继续下面的流程。
将我们编写的xcodebuild.sh与exportOptionsPlist.plist放在Project.xcodeproj的同目录下,终端执行脚本。

这里我在生成ipa的工程中报错,发现不会主动创建ipad文件夹原因导致,这里我展示通过手动在build目录下创建ipa文件夹解决的。
分发
我这里通过蒲公英进行发布。这是在上面的脚本添加了蒲公英官方文档中的分发脚本。
#通过蒲公英提供的上传应用 API,调用系统的 curl 命令来上传应用。
FilePath="$HCIpaDir/$ZWDate/${ZWScheme}.ipa"
UKey="User key" #开发者的用户 Key,在应用管理-API中查看
ApiKey="API key" #是开发者的 API Key,在应用管理-API中查看 注意不是APPKey
chmod -R 777 "${FilePath}"
curl \
-F "file=@${FilePath}" \
-F "uKey=${UKey}" \
-F "_api_key=${ApiKey}" \
https://www.pgyer.com/apiv2/app/upload
关于蒲公英uKey与_api_key的获取在应用管理-API中查看 注意不是应用的APPKey

再次执行脚本,终端最终输出如下,就代表上传应用成功。

iOS开发系列-自动化分发测试打包的更多相关文章
- iOS开发系列--Swift语言
概述 Swift是苹果2014年推出的全新的编程语言,它继承了C语言.ObjC的特性,且克服了C语言的兼容性问题.Swift发展过程中不仅保留了ObjC很多语法特性,它也借鉴了多种现代化语言的特点,在 ...
- iOS开发系列--App扩展开发
概述 从iOS 8 开始Apple引入了扩展(Extension)用于增强系统应用服务和应用之间的交互.它的出现让自定义键盘.系统分享集成等这些依靠系统服务的开发变成了可能.WWDC 2016上众多更 ...
- iOS开发系列--通知与消息机制
概述 在多数移动应用中任何时候都只能有一个应用程序处于活跃状态,如果其他应用此刻发生了一些用户感兴趣的那么通过通知机制就可以告诉用户此时发生的事情.iOS中通知机制又叫消息机制,其包括两类:一类是本地 ...
- iOS开发系列--网络开发
概览 大部分应用程序都或多或少会牵扯到网络开发,例如说新浪微博.微信等,这些应用本身可能采用iOS开发,但是所有的数据支撑都是基于后台网络服务器的.如今,网络编程越来越普遍,孤立的应用通常是没有生命力 ...
- iOS开发系列
因为最近面试了一些人,校招.初中级.高级.架构师,各种级别的,发现大家水平差异很大,有的高级的工程师很多问题都回答不上来,所以想梳理下iOS的知识点,写成一个系列,如果时间允许的话,会录制成视频放到网 ...
- iOS开发系列--通知与消息机制--转
来自:http://www.cocoachina.com/ios/20150318/11364.html 概述 在多数移动应用中任何时候都只能有一个应用程序处于活跃状态,如果其他应用此刻发生了一些用户 ...
- iOS开发系列文章(持续更新……)
iOS开发系列的文章,内容循序渐进,包含C语言.ObjC.iOS开发以及日后要写的游戏开发和Swift编程几部分内容.文章会持续更新,希望大家多多关注,如果文章对你有帮助请点赞支持,多谢! 为了方便大 ...
- iOS开发系列--Swift进阶
概述 上一篇文章<iOS开发系列--Swift语言>中对Swift的语法特点以及它和C.ObjC等其他语言的用法区别进行了介绍.当然,这只是Swift的入门基础,但是仅仅了解这些对于使用S ...
- iOS开发系列--数据存取
概览 在iOS开发中数据存储的方式可以归纳为两类:一类是存储为文件,另一类是存储到数据库.例如前面IOS开发系列-Objective-C之Foundation框架的文章中提到归档.plist文件存储, ...
随机推荐
- spring中的web上下文,spring上下文,springmvc上下文区别(超详细)
web上下文(Servlet context),spring上下文(WebApplication Context),springmvc上下文(mlWebApplicationCont)之间区别. 上下 ...
- Linux内核代码布局
上文参考:http://www.cnblogs.com/long123king/p/3545991.html 先分析一下linker script的语法. #ifdef CONFIG_X86_32#d ...
- 剑指offer——67左旋转字符串
题目描述 汇编语言中有一种移位指令叫做循环左移(ROL),现在有个简单的任务,就是用字符串模拟这个指令的运算结果.对于一个给定的字符序列S,请你把其循环左移K位后的序列输出.例如,字符序列S=”abc ...
- <python练习题>python练习题(常练勿忘)
学了python,去面试经常出现,某个或某些库不熟悉导则想不起来怎么写,知道思路而写不出来,多半还是不够熟悉,这里就作为熟悉python的地方,多做做题,多思考. 题目1:店铺ID为00000000- ...
- Linux下的Ngnix服务器部署静态页
一.安装FTP vsftpd 的名字代表”very secure FTP daemon”, 安全是它的开发者 Chris Evans 考虑的首要问题之一.在这个 FTP 服务器设计开发的最开始的时候, ...
- 修改Tomcat的端口号方法
(1).查找conf路径下的server.xml文件,路径如: I: \tomcat6\apache-tomcat-6.0.32\conf\server.xml (2).打开server.xml文 ...
- redis数据库操作
一.String(字符串)操作 String在redis中的存储是按照key-value的形式存储 1.SET key value [EX seconds] [PX milliseconds] [NX ...
- 41. wait notify 方法
wait() 等待,如果一个线程执行了wait方法,那么该线程就会进去一个以锁对象为标识符的线程池中等待 notity() 唤醒,如果一个线程执行了notity方法,那么就会唤醒以锁对象为标识符的线 ...
- Linux统计根分区使用率
#!/bin/bash # 统计根分区使用率 # 作者: shaohsiung # 时间: // rate=$(df -h | grep "dev/sda3" | awk '{pr ...
- 使用node搭建简单的服务
//创建依赖模块var http = require('http');var url = require('url');var fs = require('fs');var server = http ...