自动化发布iOS包
2016-04-29 更新:加入 unlock-keychain
我们的 Android 包一直是使用 Jenkins 发布的。这样,不必依赖开发就能得到 APK 包,打包的工作从开发交给测试,运营同学直接从内网取包上渠道。整个发布过程,开发可以不必参与,非开发可以不接触源码。
现在 iOS 版本也需要加入到这个流程中,这就需要扩展以前的脚本工具使其可以支持 iOS 自动化打包。然后才能将其集成进入 Jenkins 中。
iOS自动打包并发布脚本 这篇文章详细介绍了使用 XCode Command Line Tools 中的 xcodebuild 和 xcrun 来进行 iOS 自动化打包的方法。按这篇教程操作很容易打包成功。我将该文中提到的一些重点记录下来便于记忆。
1. 指定要编译的项目
使用 -project
参数指定项目名称,支持绝对路径和相对路径。
2. 获取可用的参数值
想知道 -target
、 -configuration
和 -scheme
参数的可用值可以通过调用 xcodebuild -list
获得。
想知道 -sdk
参数的可用值可以使用 xcodebuild -showsdks
获得。
要使用不同的签名,可以在命令行中重新设定 CODE_SIGN_IDENTITY
和 PROVISIONING_PROFILE
的值。
若是要知道还有哪些值可以设置,使用 xcodebuild -showBuildSettings
来获得。
3. 签名和 mobileprovision UUID
上面提到,若要使用不同证书进行签名,需要设置两个参数。
CODE_SIGN_IDENTITY
为开发者证书标识,可以在 Keychain Access -> Certificates -> 选中证书右键弹出菜单 -> Get Info -> Common Name
获取。获得的值类似于:
iPhone Distribution: Company name Co. Ltd (xxxxxxxx9A)
PROVISIONING_PROFILE
参数就是 mobileprovision 文件的 UUID,类似于这样的字符串:
xxxxx-xxxx-xxx-xxxx-xxxxxxxxx
有好几种方法可以得到这个 UUID。
第一种方法,如果已经在 XCode 中自动下载了这个 mobileprovision ,该文件位于 ~/Library/MobileDevice/Provisioning Profiles
下,文件名就是 UDID 的值。
第二种方法,如果已经在 XCode 中自动下载了这个 mobileprovision ,进入 Xcode -> Preferences -> 选中申请开发者证书的 Apple ID -> 选中开发者证书 -> View Details… -> 根据 Provisioning Profiles 的名字选中打包所需的 mobileprovision 文件 -> 右键菜单 -> Show in Finder
,这样就能直接打开第一种方法中的文件夹,并定位到该文件。
第三种方法,当已经有了一个 mobileprovision 文件(假设文件名为 adhoc.mobileprovision)但不知道 UUID 的时候,可以使用这个脚本来实现:
/usr/libexec/PlistBuddy -c "Print UUID" /dev/stdin <<< $(/usr/bin/security cms -D -i ./adhoc.mobileprovision)
上面脚本的原理是,先使用 security
解密 mobileprovision 成文本(结果为一个plist格式的文本),然后使用 PlistBuddy
计算其 UUID 。
4. unlock-keychain
本段落为jxyi 提供。
接入Jenkiin之后,打包时提示信息如下:
1Signing Identity: "iPhone Developer: jiaxing yi (XXXXXXXXX)"
2Provisioning Profile: "ad-hoc for dz"
3 (xxxxxxxx-15ea-xxxx-aee9-xxxxxxxxxxxx)
4
5 /usr/bin/codesign --force --sign XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX --entitlements /Users/baina/jenkins/workspace/game-dz-iOS-release-build/game-lerna-texas/lerna_player/runtime/proj.mac_ios/build/lernaplayer.build/Debug-iphoneos/lernaproduct.build/lernaproduct.app.xcent --timestamp=none /Users/baina/jenkins/workspace/game-dz-iOS-release-build/game-lerna-texas/lerna_player/runtime/proj.mac_ios/build/Debug-iphoneos/lernaproduct.app
6/Users/baina/jenkins/workspace/game-dz-iOS-release-build/game-lerna-texas/lerna_player/runtime/proj.mac_ios/build/Debug-iphoneos/lernaproduct.app: User interaction is not allowed.
7Command /usr/bin/codesign failed with exit code 1
8
9** BUILD FAILED **
出现该问题是由于需要输入登录密码,而脚本编译时无法人工输入登录密码导致。因此需要在打包之前先解锁账号。
要解决上面的问题,需要在调用打包脚本之前,先调用如下命令:
1security unlock-keychain -p "your password" ~/Library/Keychains/login.keychain
(全文完)
- 文章ID:2486
- 原文作者:zrong
- 原文链接:https://blog.zengrong.net/post/package-ipa-by-shell/
- 版权声明:本作品采用 署名-非商业性使用-相同方式共享 4.0 国际 (CC BY-NC-SA 4.0) 进行许可,非商业转载请注明出处(原文作者,原文链接),商业转载请联系作者获得授权。