iOS开发系列-Shell脚本生成IPA
概述
在公司开发到了测试阶段需要频繁打包交付给测试,看似简单的工作,重复的流程总是感觉不是那么好,我们可以借助苹果提供的编译指令编译项目。
自动化脚本编译打包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
需要加参数-workspace
与scheme
。
#!/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
关闭Bitcode
为NO
。
iOS开发系列-Shell脚本生成IPA的更多相关文章
- iOS开发系列-Shell脚本编译SDK
Library静态库Shell脚本 #!/bin/bash #要build的target名 target_Name="IFlyMSC" #编译模式 Release.Debug bu ...
- iOS开发系列--Swift进阶
概述 上一篇文章<iOS开发系列--Swift语言>中对Swift的语法特点以及它和C.ObjC等其他语言的用法区别进行了介绍.当然,这只是Swift的入门基础,但是仅仅了解这些对于使用S ...
- iOS开发系列--Swift语言
概述 Swift是苹果2014年推出的全新的编程语言,它继承了C语言.ObjC的特性,且克服了C语言的兼容性问题.Swift发展过程中不仅保留了ObjC很多语法特性,它也借鉴了多种现代化语言的特点,在 ...
- iOS开发系列--App扩展开发
概述 从iOS 8 开始Apple引入了扩展(Extension)用于增强系统应用服务和应用之间的交互.它的出现让自定义键盘.系统分享集成等这些依靠系统服务的开发变成了可能.WWDC 2016上众多更 ...
- iOS开发系列--通知与消息机制
概述 在多数移动应用中任何时候都只能有一个应用程序处于活跃状态,如果其他应用此刻发生了一些用户感兴趣的那么通过通知机制就可以告诉用户此时发生的事情.iOS中通知机制又叫消息机制,其包括两类:一类是本地 ...
- iOS开发系列--数据存取
概览 在iOS开发中数据存储的方式可以归纳为两类:一类是存储为文件,另一类是存储到数据库.例如前面IOS开发系列-Objective-C之Foundation框架的文章中提到归档.plist文件存储, ...
- iOS开发系列--网络开发
概览 大部分应用程序都或多或少会牵扯到网络开发,例如说新浪微博.微信等,这些应用本身可能采用iOS开发,但是所有的数据支撑都是基于后台网络服务器的.如今,网络编程越来越普遍,孤立的应用通常是没有生命力 ...
- iOS开发系列--C语言之基础知识
概览 当前移动开发的趋势已经势不可挡,这个系列希望浅谈一下个人对IOS开发的一些见解,这个IOS系列计划从几个角度去说IOS开发: C语言 OC基础 IOS开发(iphone/ipad) Swift ...
- 【转】iOS开发系列--数据存取
原文: http://www.cnblogs.com/kenshincui/p/4077833.html#SQLite 概览 在iOS开发中数据存储的方式可以归纳为两类:一类是存储为文件,另一类是存储 ...
随机推荐
- linux 创建多级目录 mkdir -p
原文地址:http://www.dutor.net/index.php/2010/06/cmd-mkdir-p/ mkdir的-p选项允许你一次性创建多层次的目录,而不是一次只创建单独的目录.例如,我 ...
- 1.2 JSX 语法
官方文档 https://facebook.github.io/react/docs/jsx-in-depth.html JSX 语法听上去很讨厌,但当真正使用的时候会发现,JSX 的写法在组件的组合 ...
- chrony实现局域网时间同步
chrony基于cs架构实现,配置一台服务主机与其他客户主机即可 服务端 #yum install chrony --RHEL7默认已安装chrony,而没有安装ntpd. #systemctl st ...
- ASP.net简单分页
//控制器 //实例化实体 TestEntities1 test =new TestEntities1(); //定义页数 int pageIndex; //查看接收的页数 如果不能转 则重置为1 i ...
- python 中 random模块的用法
import random print( random.randint(1,10) ) # 产生 1 到 10 的一个整数型随机数 print( random.random() ) # 产生 0 到 ...
- yes - 不断输出一个字符串,直到杀死其为止
SYNOPSIS(总览) yes [OPTION]... [STRING]... DESCRIPTION(描述) 不断输出包括所有指定STRING(s)的一行,或者是`y'. --help 显示帮助并 ...
- 微信小程序控件
1 scrollview 窗口view的滑动 <scroll-view scroll-y class='scroll-view-y' bindscrolltoupper="uppe ...
- SSH连接时,长时间不操作就断开的解觉办法
1.第一次尝试失败 修改/etc/ssh/sshd_config文件, 找到 ClientAliveInterval 0 ClientAliveCountMax 3 并将注释符号("#&qu ...
- sqlservice对于时间的操作
最近在写一个项目时,用到了时间的比较和时间的加减,在这里简单说一下,我也是刚接触数据库不久,如有说的不当之处望大家包涵,指正 一.时间的比较 开始的时候我比较时间用的是 Time>GETDATE ...
- hadoop创建目录文件失败
mkdir: Cannot create directory /file. Name node is in safe mode. 刚刚在hadoop想创建一个目录的时候,发现报错了 具体信息如下: ...