概述

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

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. 洛谷 P2756 飞行员配对方案问题 (二分图匹配)

    题目链接:P2756 飞行员配对方案问题 题意 给定 \(m\) 个外籍飞行员和 \(n - m\) 个英国飞行员,每一架飞机需要一名英国飞行员和一名外籍飞行员,求最多能派出几架飞机. 思路 最大流 ...

  2. 常用内置模块(四)——subprocess、re

    常用模块(四) 一.subprocess模块 1.subprocess为子流程模块,用于执行系统命令,该模块在Python全栈开发中不常用 2.常用方法 run 返回一个表示执行结果的对象 call ...

  3. Linux 一些常识命令

    linux的性能优化: .CPU,MEM .DISK--RAID .网络相关的外设,网卡 linux系统性能分析: top:linux系统的负载,CPU,MEM,SWAP,占用CPU和内存比较的进程, ...

  4. Java中的注解是如何工作的?

    自Java5.0版本引入注解之后,它就成为了Java平台中非常重要的一部分.开发过程中,我们也时常在应用代码中会看到诸如@Override,@Deprecated这样的注解.这篇文章中,我将向大家讲述 ...

  5. CSS3:FlexBox的详解

    Flexbox是Flexible box 的简称(灵活的盒子容器),是CSS3引入的新的布局模式.它决定了元素如何在页面上排列,使它们能在不同的屏幕尺寸和设备下可预测地展现出来. 它之所以被称为 Fl ...

  6. 【Codeforces】450 B(div2)

    题目链接:http://codeforces.com/problemset/problem/450/B 题意: 求这个的第n项. 题解:$f_{i+1} = f_i - f_{i-1} $ \begi ...

  7. python_django_views视图模块

    视图(views.py):接收web请求,并响应web请求 在视图响应web请求的过程中,响应文件可能是网页,也可能是json数据 若响应的是网页,我们可分为: 地址重定向的网页请求(子类HttpRe ...

  8. Linux下安装.NETCore3.0

    今天把.NETCore从2.2升到3.0记录一下 Download .NET Core 3.0  :https://dotnet.microsoft.com/download/dotnet-core/ ...

  9. python代码{v: k for k, v in myArray.items()}是什么意思?

    最近在扒vnpy的源码总能看到{v: k for k, v in ORDERTYPE_VT2HUOBI.items()}这样的源码,就是不知道什么意思 然后万能的google找到了Quora的一个类似 ...

  10. leetcood学习笔记-104-二叉树的最大深度

    题目描述: 第一次提交: class Solution(object): def maxDepth(self, root): """ :type root: TreeNo ...