iOS开发中的应用打包方式及重签名的一些总结

本文主要是对iOS应用打包以及重签方面的一些实践总结。iOS打包方式有很多,像我工作中接触到比较多的就是Jenkins的持续集成(CI)方式打包,然后就是使用Xcode工具进行打包(主要是为了上架),还有在Mac终端使用命令行(xcrun/xcodebuild)打包。由于公司有很多项目,都是企业级应用,使用企业内部分发的方式进行管理,所以苹果证书每年都要进重签更新证书,这里就涉及到了一个重签名方面的一个总结。

使用Jenkins持续集成

Jenkins是一个持续集成(CI)系统,它可以帮助我们快速构建和发布应用,节省我们构建打包时间,以便我们能将更多的时间用在业务功能开发上,同时帮助我们更好的进行应用版本的管理。它可以构建Java的war包、iOS的ipa包以及安卓的apk包等(当然应该不止这些,我们主要的就是这三种)。

Jenkins的官方网站:https://jenkins.io,可以直接下载其Jenkins.war,然后直接通过java命令:

$ java -jar jenkins.war

进行启动,启动成功后会在本机的根目录生成一个.jenkins目录,里面的jobs就是存放你新建的构建项目。当然也可以直接把这个war包放到Tomcat的webapps目录中去,通过启动Tomcat来启动它。

启动后通过:http://127.0.0.1:8080/访问。可以在插件管理中选择下载安装使用Jenkins的xcode打包插件打包,也可以自行配置shell打包命令(以下说到的命令行)进行打包。

关于Jenkins的安装以及使用这里就不多说的,网上也有一些教程,比如如何创建一个项目、如何参数化构建、如何使用脚本辅助打包等等。这里主要备忘下使用Jenkins过程中的一些使用技巧。

>>技巧1:修改构建版本号

有时候构建的项目不需要从头开始计算版本号,这是就需要手动修改下次构建的版本号,有如下方式可以修改:

  1. Jenkins-->系统管理-->脚本命令行输入下面的命令行:
Jenkins.instance.getItemByFullName("YourJobName").updateNextBuildNumber(45)
  1. 使用Jenkins插件:Next+Build+Number+Plugin (没验证过)

注意,如果修改jobs中的nextNumber文件中的版本号,那每一次的构建都是固定这个版本号了,不会自动进行递增的。

使用Xcode打包

使用Xcode(Archive)来进行打包,具体可以参考:App Store上架iOS App的详细流程中的第四章节:Xcode配置及打包。大概流程就是配置好Xcode,如设置好签名,Release等,然后使用编译,Archive,最后使用Application Loader工具上传到开发者中心。

命令行打包

在终端使用命令进行打包,一般有以下两种命令方式:

1、使用xcrun(过时?)

首先设置Xcode,比如设置icons图标,配置plist文件等,然后选择真机模式build,编译成功后,再使用xcrun命令打包;
使用如下命令:

$ xcrun -sdk iphoneos PackageApplication -v .app文件路径 -o /Users/...ipa路径

PackageApplication是以打包脚本,在GitHub可以搜索得到,clone并复制到目路/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/usr/bin中,添加777权限。

2、使用xcodebuild

  1. 清理项目
xcodebuild clean -project .xcodeproj路径 -scheme scheme名称  -configuration 配置,如“Release”
  1. 编译归档
xcodebuild -project .xcodeproj路径 -scheme scheme名称  -configuration 配置,如“Release” -archivePath .xcarchive文件路径 clean archive build CODE_SIGN_IDENTITY=“签名” PROVISIONING_PROFILE=“UUID” PRODUCT_BUNDLE_IDENTIFIER = “bundle id”
  1. 打包
xcodebuild -exportArchive -archivePath .xcarchive文件路径  -exportOptionsPlist enterpriseExportOptionsPlist路径 -exportPath 导出的路径

在Jenkins中也可以配置使用该命令行来打包。构建中遇到如下错误:
xcrunjenkins: error: SDK "iphoneos" cannot be located
原因:Xcode路径判断错误。可能是系统装了两个Xcode。

# 查看选择的xcode路径
$ xcode-select --print-path
# 查看可以使用的sdks
$ xcodebuild -showsdks

解决方法:给Xcode命令行工具指定路径

$ sudo xcode-select --switch /Applications/Xcode.app/Contents/Developer/

脚本自动化打包

GitHub上有些大神封装好了一些shell或Python打包脚本,可以一键自动打包并上传到诸如蒲公英之类的托管平台。
比如在这里这个脚本。也可以自己写个Python脚本,其实就是对以上命令行打包的一个封装。

ipa包重签

对于企业应用来说,有效期为1年,过期前需对ipa包进行重签。这个重签就是在苹果开发者中心上重新生成对应bundle id的Provision Profile文件,然后对ipa进行解压替换其mobileprovision文件、授权文件等,最后进行重新签名和打包。

1、使用命令一步步重签

1,解压ipa包

$ unzip yourApp.ipa

2,修改Payload/yourName.app中的icon图标、Info.plist文件的信息等(如有需要),比如版本号,应用名称等。
3,删除之前的签名 ->_CodeSignature

$ rm -rf /Users/idev/Desktop/Payload/yourAppName.app/_CodeSignature

4,替换描述文件:

$ cp /Users/idev/Desktop/embedded.mobileprovision /Users/idev/Desktop/Payload/yourAppName.app/embedded.mobileprovision

把新的描述文件复制替换到解压后的目录中。
5,加密Frameworks中的文件,如果是.a的就不需要
TODO
(这一步不太清楚,因为当时没操作这个,待有空研究)
6,重新签名:
先重签名framework和dylib

$ codesign --force --sign "iPhone Distribution:xxxxx" --entitlements entitlements.plist /Payload/XX.app/Frameworks/xxx.framework

再签名.app:

$ codesign -f -s "iPhone Distribution:xxxxx" /Users/idev/Desktop/Payload/yourAppName.app

(有人说这个顺序一定要正确,否则即使签名成功也会安装不了)

成功后提示:

/Users/idev/Payload/yourAppName.app: replacing existing signature.

如果需要修改授权文件:
先用命令查看授权文件内容:

$ security cms -D -i "xxx.mobileprovision"

然后新建一个xml后复制里面的内容。(其实可以直接使用里面拿出来的授权文件吧)

$ codesign --entitlements Entitlements.plist -f -s "iPhone Distribution:xxxxx" /Users/idev/Desktop/Payload/yourAppName.app

这一步需要读取你钥匙串中的开发者证书,可以用以下命令查看下有哪些证书:

$ security find-identity -p codesigning -v

7,压缩Payload:
这样就完成了重签.
验证:查看签名信息并在真机上进行安装

$ codesign -vv -d Payload/XX.app

可以自己一步步使用上面的步骤进行重签,但会觉得比较繁琐。可以有以下几种方式进行封装,使其变得比较通用。

封装成shell脚本或Python脚本

(TODO)网上也有很多人写成了Python脚本了。

2、可以使用GitHub上的Resign工具在Mac上运行进行重签。

运行这个工具如下所示:


Resign-master重签工具

也可以使用iReSign这个工具,在强大的GitHub上都有。

3、可以自己写个重签系统(如何使用Java)

由于重签经常需要,所以可以考虑做成一个web的重签名系统,这样重签就可以在网页上进行上传ipa包、签名证书、描述文件,设置相关信息等,然后就可以一键进行签名,重签成功后下载新包即可,方便也节省了很多时间。

推荐阅读更多精彩内容