概述

在公司开发到了测试阶段需要频繁打包交付给测试,看似简单的工作,重复的流程总是感觉不是那么好,我们可以借助苹果提供的编译指令编译项目。

自动化脚本编译打包IPA

常见的iOS项目就是基于xcodeproj。目前大部分公司项目都是用CocoaPod 管理第三方库,也就是项目基于xcworkspace 。这两种项目在编译时候命令有一些区别,下面分别写两种脚本供参考。

普通项目编译

PackageApplication方式生成ipa的方式苹果已经不建议使用了,取而代之的是xcodebuild -exportArchive

#!/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文件路径 :<<!
#编译 链接 签名 生成app
#如果要构建workspace,你必须指定-workspace和-scheme参数。
xcodebuild \
-workspace "$ZWWorkspace/$ZWProjectName.xcodeproj/project.xcworkspace" \
-scheme "$ZWScheme" \
-configuration "$ZWConfiguration" \
clean \
build \
-derivedDataPath "$ZWBuildTempDir"
#CODE_SIGN_IDENTITY=证书
#PROVISIONING_PROFILE=描述文件UUID #生成ipa 本质主要是对生成app进行压缩成ipa
xcrun -sdk iphoneos \
-v PackageApplication "$ZWBuildTempDir/Build/Products/$ZWConfiguration-iphoneos/$ZWProjectName.app" \
-o "$HCIpaDir/$ZWDate.ipa" #这里反复报错 如果输出的目录不存在就报错 Unable to create '....." 解决办法 手动穿件输出测文件夹层级结构 #清除构建的文件
rm -rf $ZWBuildDir/temp open $HCIpaDir
! #-------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 #这里不需要设置证书
#编译流程
#1.首先看ZWConfiguration是Release还是Debug
#2.如果是Release那么就去General->Signing(Release)的Provisioning Profile编译
#3.如果是Debug那么就去General->Signing(Debug)的Provisioning Profile编译 #如果是发布store的包 只需将配置设置General->Signing(Release)的Provisioning Profile选择Store 描述文件 :<<!
编写过程遇到的报错:
1.exportOptionsPlist.plist文件的编写
xcode直接先Archive 拿到ExportOptions.plist
2.下面这个报错纠结了我好久, # Error Domain=NSCocoaErrorDomain Code=384
# 详细报错
#2018-03-06 17:18:43.013 xcodebuild[2836:4964380] [MT] IDEDistribution: -[IDEDistributionLogging _createLoggingBundleAtPath:]: Created bundle at path '/var/folders/rj/k7nnqyqd5xz7_lh9s2dc9z4m0000gn/T/TestProj_2018-03-06_17-18-43.012.xcdistributionlogs'.
#2018-03-06 17:18:43.476 xcodebuild[2836:4964380] [MT] IDEDistribution: Step failed: <IDEDistributionPackagingStep: 0x7f8ca5d414e0>: Error Domain=NSCocoaErrorDomain Code=3840 "No value." UserInfo={NSDebugDescription=No value., NSFilePath=/var/folders/rj/k7nnqyqd5xz7_lh9s2dc9z4m0000gn/T/ipatool-json-filepath-U38ZKM}
#error: exportArchive: The data couldn’t be read because it isn’t in the correct format. #Error Domain=NSCocoaErrorDomain Code=3840 "No value." UserInfo={NSDebugDescription=No value., NSFilePath=/var/folders/rj/k7nnqyqd5xz7_lh9s2dc9z4m0000gn/T/ipatool-json-filepath-U38ZKM} #** EXPORT FAILED ** # 最终发现了问题关闭compileBitcode 设置为NO
! #通过蒲公英提供的上传应用 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

基于CocoaPod的工程脚本编译

对于使用工作空间管理工程,唯一不同的是在xcodebuild archive需要加参数-workspacescheme

#!/bin/bash

ZWProjectName="lifeCristal"
ZWScheme="lifeCristal"
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文件路径 xcodebuild archive \
-workspace "$ZWWorkspace/$ZWProjectName.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 FilePath="$HCIpaDir/$ZWDate/${ZWScheme}.ipa"
UKey="013cca42bc5347715f895cfc8061f75f"
ApiKey="4861c59806712e3473c867520884236f" chmod -R 777 "${FilePath}"
curl \
-F "file=@${FilePath}" \
-F "uKey=${UKey}" \
-F "_api_key=${ApiKey}" \
https://www.pgyer.com/apiv2/app/upload

证书跟描述文件UUID获取

  • 获取本机可用的开发证书
security find-identity -v -p codesigning

  • 获取描述文件的UUDI

    我们Mac电脑所有描述文件目录 个人资源库/MobileDevice/Provisioning Profiles/

    执行命令
/usr/bin/security cms -D -i 描述文件路径

通常描述文件的名称就是描述文件的UUID。

exportOptionsPlist.plist文件获取

这个文件中的内容会随着Xode的版本而发生改变。我这边做法是自己手动打包第一次,将生成的ExportOptions.plist改名为exportOptionsPlist.plist。后续每次打包都是用这个plist就可以了。

创建的编译报错

在实际使用避免不了各种错误,下面对一些常见的错误解决。

Bitcode引发的错误

解决办法:在exportOptionsPlist.plist关闭BitcodeNO

iOS开发系列-Shell脚本生成IPA的更多相关文章

  1. iOS开发系列-Shell脚本编译SDK

    Library静态库Shell脚本 #!/bin/bash #要build的target名 target_Name="IFlyMSC" #编译模式 Release.Debug bu ...

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

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

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

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

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

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

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

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

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

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

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

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

  8. iOS开发系列--C语言之基础知识

    概览 当前移动开发的趋势已经势不可挡,这个系列希望浅谈一下个人对IOS开发的一些见解,这个IOS系列计划从几个角度去说IOS开发: C语言 OC基础 IOS开发(iphone/ipad) Swift ...

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

    原文: http://www.cnblogs.com/kenshincui/p/4077833.html#SQLite 概览 在iOS开发中数据存储的方式可以归纳为两类:一类是存储为文件,另一类是存储 ...

随机推荐

  1. 用Nginx搭建CDN服务器方法-开启Nginx缓存与镜像,自建图片服务器

    利用Nginx的proxy_cache搭建缓存服务器一:编译ngx_cache_purge1.Nginx的Proxy_cache是根据Key值md5哈希存储缓存,支持任意的Key,例如你可以根据”域名 ...

  2. 编码(RZ NRZ NRZI)

    Frm: https://jingyan.baidu.com/album/39810a23addccbb637fda66a.html?picindex=1 RZ 编码(Return-to-zero C ...

  3. MFC VC 双缓冲绘图基本原理与实现,详细解释

    转自:http://blog.csdn.net/foreverhuylee/article/details/21548107 当然你可以直接搜索到能用的代码,并且基本能满足要求.不过这样总不是学习的态 ...

  4. NIO 源码分析(02-1) BIO 源码分析

    目录 一.BIO 最简使用姿势 二.ServerSocket 源码分析 2.1 相关类图 2.2 主要属性 2.3 构造函数 2.4 bind 方法 2.5 accept 方法 2.6 总结 NIO ...

  5. chrony实现局域网时间同步

    chrony基于cs架构实现,配置一台服务主机与其他客户主机即可 服务端 #yum install chrony --RHEL7默认已安装chrony,而没有安装ntpd. #systemctl st ...

  6. <人工智能>人工智能基础

    问题1:扔下圆球的位置(feature特征变量)变化,最终掉落奖项(label结果标签)的变化 feature ----输入 f(x) ----模型,算法 label ----输出 大量已知的数据,训 ...

  7. POJ 2135 /// 最小费用流最大流 非负花费 BellmanFord模板

    题目大意: 给定一个n个点m条边的无向图 求从点1去点n再从点n回点1的不重叠(同一条边不能走两次)的最短路 挑战P239 求去和回的两条最短路很难保证不重叠 直接当做是由1去n的两条不重叠的最短路 ...

  8. Android SDK中无法安装HAXM installer

    一.原因: 刚搭建好环境,当我想打开Android Studio 自带的模拟器时,出现如下:       /dev/kvm is not found 二.解决步骤: 1.点击File -- Setti ...

  9. 【模板篇】Link Cut Tree模板(指针)

    网上一片一片的LCT都是数组写的 orz 用指针写splay的人想用指针写LCT找板子都不好找QAQ 所以能A题了之后自然要来回报社会, 把自己的板子丢上来(然而根本没有人会看) LCT讲解就省省吧, ...

  10. 2019牛客暑期多校训练营(第六场)Palindrome Mouse 回文树+dfs

    题目传送门 题意:给出一个字符串,将字符串中所有的回文子串全部放入一个集合里,去重后.问这个集合里有几对<a,b>,使得a是b的子串. 思路:一开始想偏了,以为只要求每个回文串的回文后缀的 ...