ipa-build.zip#自动打包
什么是自动打包
自动打包,从名字就可以看的出来,就是利用shell脚本,完成本来需要手动操作的打包步骤。
为什么需要自动打包
有时候我们的一个项目有多个Targets,所以我们需要一个个去打包我们的ipa。(这里讲的是企业级证书的打包流程)
这样会稍显繁琐,而且每个Target打包的时候需要长时间的等待。有什么解决方法呢?
当然有,就是使用脚本自动执行打包。
初衷
介于当初我初学,我在网上搜索了很多的资料,没有找到企业级证书自动打包的东西,我找了好久没有一篇完整的教程。也可能是我没有找到,所以我自己开始尝试写一个shell脚本,并且写一篇打包教程。
并且前段时间我们公司有一个项目,然后有7个targets,然后我们是$299的证书,打包好是可以直接安装的那种,所以我每次需要手动点Archive 7次,点签名7次。
这还好 主要是等待的时间太久了,所以比较坑。
应用场景和优缺点
- 应用场景:企业证书,或者需要给越狱用户打包ipa的时候。
- 优点:方便一键式生成ipa。
- 缺点:$99证书只能生成出让越狱用户安装的ipa包。
实现方法
- 方法1:xcodebuild编译代码,使用xcrun进行签名。
- 方法2:转换成zip然后转换成ipa的方法。
我这里就选择方法一详细介绍,因为方法二的代码量看起来有点大。
什么是xcodebuild
xcodebuild[-project][-activetarget][-alltargets][-target]…[-parallelizeTargets][-activeconfiguration][-configuration][-sdk |][=]…[]…
xcodebuild[-version[-sdk |]]
xcodebuild[-showsdks]
xcodebuild[-find ][-sdk |]
xcodebuild[-list]
也可以在终端输入:xcodebuild –help 或 –h查看具体的选项
显示xcodebuildversion:xcodebuild –version
显示当前系统安装的sdk:xcodebuild –showsdks
显示当前目录下project Information:xcodebuild –list
什么是xcrun
此工具主要用于将app文件打包成ipa格式的程序包。(主要用于已越狱手机)。
补充:当证书是$99的时候签名的ipa确实是只能在越狱手机上安装 当证书$299的时候前面的证书是直接可以在未越狱的手机上安装的
具体用法如下:
xcrun -sdk iphoneos PackageApplication –v [{TARGET}.app] -o [{TARGET}.ipa] –sign [{Iphone Distribution:xxx}] –embed [{xxx.mobileprovision}]
所有的参数大家可以-h去查看
打包脚本
先上我写的打包脚本吧。第一次写的shell,见笑。
#!/bin/sh
#这个是我的项目存放目录,也就是.xcodeproj所在的目录
projectPath=”/Users/zhag/Documents/srouce/GphoneBook1/“
#产生的ipa目录,签名完之后将ipa保存到哪里
releasePath=”/Users/zhag/Documents/release/“
#执行完xcodebuild编译之后,会自动产生一个build目录,这里指定.app目录所在位置
releaseDir=”build/Release-iphoneos/“
#cd就不用我解释了吧
cd ${projectPath}
#这个数组是我所有的targets,我这里就举例两个
targetArray=([0]=”GphoneBook” 1=”GphoneBookC2”)
#签名完之后的.ipa叫什么名字
productArray=([0]=”ylcc” 1=”C2” )
#clean项目
xcodebuild clean -configuration Distribution
i=0
#循环编译
for x in ${targetArray[@]}
do
#组合.APP文件路径
appPath=”${projectPath}${releaseDir}${x}.app”
#组合.APP文件路径
ipaPath=”${releasePath}${productArray[${i}]}.ipa”
#组合.ipa文件路径
#调用xcodebuild 进行打包
#-sdk 表示调用什么版本的SDK打包 -showsdk可以看到你当前所有的已安装的
这里我说下我碰到的一个问题,我安装了xcode4.6 xcode5.0 所以sdk有时候会显示只有7.0,所以我需要选择xcode4.6
sudo xcode-select -switch /Applications/Xcode.app 用于选择不同的xocde
#-target 打包哪个target
#-configuration 用于标识你是发布还是测试 在-help里面可以看到可选值
xcodebuild -sdk iphoneos -target ${x} -configuration Distribution
#签名
#-sdk同理
#packapplication 里面也有很多参数可以用help去查看
#–sign –embed 我解释下这两个吧,我在这里碰到过个问题,大家可以看到我这里是没有这两个参数的,这个时候我们就可以在项目里配置好 (看图1)这样就不需要设置了
xcrun -sdk iphoneos6.1 PackageApplication -v ${appPath} -o ${ipaPath} #-v是.app文件的路径 ,-o 就是output路径 也就是.ipa的路径
let i++
done
图1
基本的打包教程就到这里过了
以下就是使用cocoapods的朋友们需要注意的了。
如果使用cocoapods之后,你打开项目就不是.xcodeproj这个文件了,而是.xcworkspace。
所以我们用上面的打包语句会出错,所以我们需要修改xcodebuild这句。这里我也坑了好几个小时,我也把我过程中碰到的问题给大家分享下。
先看下我补充的代码
scheme_name=$(echo $(basename ./*.xcodeproj) | awk -F. ‘{print $1}’)
xcodebuild -workspace test.xcworkspace -scheme ${scheme_name} -configuration Distribution CONFIGURATION_BUILD_DIR=~/Desktop/build
大家注意到,我多了scheme_name,-workspace,还有-scheme,以及CONFIGURATION_BUILD_DIR
这里需要解释的就是scheme_name 这句的效果,这句是获得和workspace名字相同的.xcodeproj的文件名,注意是不带扩展名的。这个scheme_name可以使用常量(我这里可以直接写GphoneBook,不需要扩展名)
还有当我们指定-workspace之后,一定要指定-scheme就是项目名称,也就是策略,你要打包哪个项目。并且需要指定输出目录CONFIGURATION_BUILD_DIR
不然会报错。
PS:我之前一直不知道-scheme是什么= =# 坑了好久的说。
这里我再分享一个坑:就是你的输出路径你的当前用户一定要有权限,或者你可以修改权限777