概述

项目在测试阶段需要频繁打包给测试人员,对于这些固定化的操作我们可以使用自动化的手段去解决,将时间放在有意义的事情上。

xcodebuild 是苹果发布自动构建的工具。

Shell脚本打包

xcrun PackageApplication方式在Xcode升级到8.3已就过期了,苹果建议我们使用xcodebuild -exportArchive的方式。

我们平时通过Xcode执行Run命令,生成iPa的中间主要分为两个大的步骤:

  1. xcodebuild archive生成ProjectName..xcarchive文件
  2. 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开发系列-自动化分发测试打包的更多相关文章

  1. iOS开发系列--Swift语言

    概述 Swift是苹果2014年推出的全新的编程语言,它继承了C语言.ObjC的特性,且克服了C语言的兼容性问题.Swift发展过程中不仅保留了ObjC很多语法特性,它也借鉴了多种现代化语言的特点,在 ...

  2. iOS开发系列--App扩展开发

    概述 从iOS 8 开始Apple引入了扩展(Extension)用于增强系统应用服务和应用之间的交互.它的出现让自定义键盘.系统分享集成等这些依靠系统服务的开发变成了可能.WWDC 2016上众多更 ...

  3. iOS开发系列--通知与消息机制

    概述 在多数移动应用中任何时候都只能有一个应用程序处于活跃状态,如果其他应用此刻发生了一些用户感兴趣的那么通过通知机制就可以告诉用户此时发生的事情.iOS中通知机制又叫消息机制,其包括两类:一类是本地 ...

  4. iOS开发系列--网络开发

    概览 大部分应用程序都或多或少会牵扯到网络开发,例如说新浪微博.微信等,这些应用本身可能采用iOS开发,但是所有的数据支撑都是基于后台网络服务器的.如今,网络编程越来越普遍,孤立的应用通常是没有生命力 ...

  5. iOS开发系列

    因为最近面试了一些人,校招.初中级.高级.架构师,各种级别的,发现大家水平差异很大,有的高级的工程师很多问题都回答不上来,所以想梳理下iOS的知识点,写成一个系列,如果时间允许的话,会录制成视频放到网 ...

  6. iOS开发系列--通知与消息机制--转

    来自:http://www.cocoachina.com/ios/20150318/11364.html 概述 在多数移动应用中任何时候都只能有一个应用程序处于活跃状态,如果其他应用此刻发生了一些用户 ...

  7. iOS开发系列文章(持续更新……)

    iOS开发系列的文章,内容循序渐进,包含C语言.ObjC.iOS开发以及日后要写的游戏开发和Swift编程几部分内容.文章会持续更新,希望大家多多关注,如果文章对你有帮助请点赞支持,多谢! 为了方便大 ...

  8. iOS开发系列--Swift进阶

    概述 上一篇文章<iOS开发系列--Swift语言>中对Swift的语法特点以及它和C.ObjC等其他语言的用法区别进行了介绍.当然,这只是Swift的入门基础,但是仅仅了解这些对于使用S ...

  9. iOS开发系列--数据存取

    概览 在iOS开发中数据存储的方式可以归纳为两类:一类是存储为文件,另一类是存储到数据库.例如前面IOS开发系列-Objective-C之Foundation框架的文章中提到归档.plist文件存储, ...

随机推荐

  1. idea中如何查看jar包中的源码(非maven),以oracle的ojdbc为例

    文章目录 背景 解决 背景 工作需要查看oracle的部分源码(ojdbc.jar),maven并没有这个依赖,单纯的导入jar包无法查看. 解决 将ojdbc.jar 安装到本地仓库,maven从本 ...

  2. js读取json数据

    { "code": 0, "msg": null, "data": { "pageNum": 1, "page ...

  3. 使用U盘或在本地电脑作为git远程仓库进行托管

    情景描述: 当有两台电脑需要共同维护一段代码,其中一台电脑不希望(或者不能)通过网络的方式进行访问git仓库(即不使用github),那么可以使用U盘作为介质将其作为远程仓库,或者使用局域网中一台电脑 ...

  4. Haproxy 基础详解及动静分离配置

    haproxy 介绍 1 工作在ISO 七层 根据http协议(或者工作在ISO四层 根据tcp协议) 提供web服务的负载均衡调度器 负载均衡调度器分类 工作在四层: # lvs 工作在七层: # ...

  5. js 点击获取验证码后的倒数60s

    <!DOCTYPE html> <html> <head> <meta charset="UTF-8" /> <script ...

  6. spring boot Swagger2(version=2.7.0) 注解@ApiImplicitParam的属性dataType值为”自定义泛型“应用

    注解: @ApiImplicitParams @ApiImplicitParam    name="需注解的API输入参数", value="接收参数的意义描述" ...

  7. 【HDOJ】P1215 七夕节

    题目意思很简单,不解释 有两种方法, 1是暴力法,不就是 2就是下面要讲的方法 假如果说一个数n可以被b整除,那么一定可以被b的因子整除 那么我需要做的就是枚举这些因子 多余的请看代码 #includ ...

  8. js 正则替换的使用方法

    function compress(source) { const keys = {}; ⇽--- 存储目标key source.replace( /([^=&]+)=([^&]*)/ ...

  9. vim - Vi IMproved, 一个程序员的文本编辑器

    总览 (SYNOPSIS) vim [options] [file ..] vim [options] - vim [options] -t tag vim [options] -q [errorfi ...

  10. Tomcat服务器优化(内存,并发连接数,缓存)

    a) 内存优化:主要是对Tomcat启动参数进行优化,我们可以在Tomcat启动脚本中修改它的最大内存数等等.b) 线程数优化:Tomcat的并发连接参数,主要在Tomcat配置文件中server.x ...