命令行工具打包

时间:2022-07-17 17:38:38

前言:

  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 myAppName.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