前言:
iOS程序包分为“.app格式的二进制文件包”和“.ipa格式的渠道包”两种。xcodebuild 是一款用来打包 Xcode projects 或者 workspaces 的命令行工具。用xcodebuild把工程打成 app格式后,再用xcrun来签名和打成ipa格式的包。本篇文章简单讲解一下自己使用的app打包命令。
正文:
一、通过xcodebuild命令和xcrun命令打包
xcodebuild命令和xcrun两个命令必需在xxx.xcodeproj或者xxx.xcworkspace所在的目录执行。
(1) xcodebuild
shell编译工具,用xcodebuild把工程打成 app 格式,比如我们有个叫做hello的项目,xcodebuild命令如下:
xcodebuild -workspace hello.xcworkspace -scheme hello -derivedDataPath "./" -sdk iphoneos -configuration Release clean build
参数解释:
-workspace workspacename :指定 workspace 的名称。
-scheme schemename:指定 scheme 的名称,编译 workspace 时是必须的。
-derivedDataPath path:覆盖编译 workspace 的 scheme 时的结果数据存放的路径。
-sdk [<sdkfullpath> | <sdkname>]:指定编译时所用的 SDK。参数可以是 SDK 的绝对路径,也可以是 SDK 的名称。
可以使用如下命令查看所支持的SDK : xcodebuild -showsdks .
-configuration configurationname:当编译每个 target 时使用 configurationname 指定的配置。默认是Release的。
CODE_SIGN_IDENTITY:选择签名的证书。
可以用系统自带的工具“钥匙访问串”来查看名字,如果不带侧参数,那么在工程配置中一定要配置好证书以及授权文件!
clean built:每次生成app之前都会清除掉旧的记录。
编译过程:
比如有个ios工程叫hello,它由两个project组成,一个是业务代码hello,一个是引入的第三方库Pods。project hello里
project hello, 对应target hello
project Pods, 对应 target XX1、XX2、XX3...
那么,上面的xcodebuild命令会做如下的事情:
(1)先clean掉project Pods对应的各个target XX1、XX2、XX3...
(2)然后build project Pods对应的各个target XX1、XX2、XX3..., 生成xxx.a文件。
(3)接下来build project Pods对应的target Pods-hello,生成libPods-hello.a文件。
(4)最后build project hello对应的target hello(此时会检查钥匙串中对应的证书)
即
=== CLEAN TARGET XXX OF PROJECT Pods WITH CONFIGURATION Distribution ===
=== BUILD TARGET XXX OF PROJECT Pods WITH CONFIGURATION Distribution ===
=== BUILD TARGET Pods-hello OF PROJECT Pods WITH CONFIGURATION Distribution ===
=== BUILD TARGET hello OF PROJECT hello WITH CONFIGURATION Distribution ===
xcodebuild会根据你的Xcode中的证书配置去钥匙串里,找你的工程里配置的签名证书。所以,一定要把证书安装在mac的钥匙串里(打包服务器一样),并且,Xcode的build setting中指定的Code Sign Identity与安装的证书一致。否则会报错:“No certificate matching ‘iPhone Distribution: XXXX‘: Select a different signing certificate for CODE_SIGN_IDENTITY, a team that matches your selected certificate, or switch to automatic provisioning.”。
xcodebuild 执行成功之后,会在工程的根目录下产生一个build文件夹,在build/Distribution-iphoneos目录下就能找到生成的app文件。
(2) xcrun
xcrun是ipa打包工具,用xcrun来对.app格式的包签名和打成ipa格式的包。下面用xcrun把第一步xcodebuild产生的.app文件生成.ipa文件:
xcrun -sdk iphoneos PackageApplication -v Build/Products/Distribution-iphoneos/hello.app -o `pwd`/Build/Products/hello.ipa
参数解释:
-v 对应的是app文件的绝对相对路径
–o 对应ipa文件的路径跟文件名,`pwd` 是当前路径的意思
二、对ipa包重签名
要先准备好配置文件EIMMyApp.mobileprovison,以及签名的plist格式的Entitilements文件。另外,要把对应的证书安装到钥匙串中。然后按照下面的5步运行就可以对.ipa包进行重签名了:
(1).ipa包解压成.app包:
unzip eimqq.ipa ,生成Payload/myAppName.app
(2)移除老的 code signatures:
rm -r Payload/myAppName.app/_CodeSignature
(3)拷贝EIMMyApp.mobileprovison来覆盖原来的embedded.mobileprovision :
cp EIMMyApp.mobileprovision Payload/myAppName.app/embedded.mobileprovision
(4)重签名:
codesign -f -v -s "iPhone Distribution: XXXX" --entitlements entitlements.plist Payload/myAppName.app
(我们知道现在的签名都是根据plist格式的Entitlements文件来指定的)
(5)将.app包打包成.ipa包:
zip -yr eimQQ.resigned.ipa Payload