移动客户端编译打包方式 | iOS篇

背景介绍

移动客户端的编译打包,是客户端CI的开始点。通过jenkins等持续集成平台,结合代码管理工具,搭建自动编译任务,按照约定的条件自动打包,能够节省人力,管理迭代提测版本,节省人力。

移动端编译打包,按照系统不同,可以分成Android编译和iOS编译两类,各自的编译工具和方式也各不相同,下面我们会分章节概述其主要的编译工具和方法。

iOS端编译工具有很多,系统提供了xcodebuild、xcrun工具,另外,还有一些开源工具,比如xctool、PlistBuddy等,可以辅助整个编译过程。

和Android不同,iOS的版本安装比较困难,拿到ipa后,一般是无法直接安装的(越狱系统除外),幸运的是,苹果提供了基于企业证书的OTA(over the air)分发方式,可以通过网页的形式方便的安装ipa。本章将结合OTA部署方式,详细讲解ios端的编译和分发。


环境准备

OTA的部署,必须依赖这样两个证书:企业级发布证书以及对应的密钥(.mobileprovision文件以及.cer文件);企业级开发者证书以及密钥(.p12文件以及.cer文件)。这两个证书需要安装到你的编译机上,并加入到keychain中。

编译机上需要安装合适版本的xcode,同时安装xctool工具。接下来就可以执行整个编译打包过程了。


编译及产物

编译整个过程分成两大部分,打出ipa包,以及生成plist文件和html文件,为后续的ota部署提供物料。按照重点部分,描述编译过程如下:

1、解开钥匙链,获取证书使用权限

通过securityunlock-keychain -p username $PathTologin.keychain来解锁keychain。


2、使用PlistBuddy工具获取version以及Identifier

version=`PlistBuddy-c "Print CFBundleVersion" "${PROJ_PLIST_PATH}"`

bundleIdentifier=`PlistBuddy-c "Print CFBundleIdentifier" "${PROJ_PLIST_PATH}"`


3、清理工作区间,开始打包,使用企业证书打签名

xctool -workspace $workspaceName-scheme ${SCHEME_NAME} -reporter pretty -configuration Debug clean

xctool -workspace $workspaceName-scheme ${SCHEME_NAME} -reporter pretty -configuration DebugCODE_SIGN_IDENTITY="${DEVELOPER_NAME}" archive

其中,DEVELOPER_NAME需要填写证书对应的机构名称,命令执行完之后,在xcode的工作目录下会生成对应的app文件夹,里面是各种编译产物,当然我们也可以使用-o参数,将生成app放到指定目录去。然后,我们需要使用xcrun工具对ipa打签名:

xcrun -sdk iphoneosPackageApplication -v ${APP_NAME} -o ${IPA_LOC}/${IPA_NAME} -sign $CODE_SIGN_IDENTITY-embed ${PROVISION_PROFILE}

其中,PROVISION_PROFILE变量指向对应的企业证书的mobileprovisionfile的位置。


4、保存dsym文件

3步骤之后,xcode工作目录下会生成一个dSyms文件夹,我们需要将里面的文件打包成.dSYM文件,方便日后崩溃日志解析使用:

tar cvf "${PROJ_NAME}_CI.dSYMs.tar""${PROJ_NAME}_CI.app.dSYM"


5、生成plist文件

OTA部署,需要在对应的plist文件中定义ipa下载地址,我们在编译时获取ipa名称,bundleID等信息,填充到一个模版plist文件,为后面的OTA部署做准备,plist模版如下:

<plist version='1.0'>

<dict><key>items</key><array><dict><key>assets</key><array><dict><key>kind</key>

<string>software-package</string>

<key>url</key>             <string>http://http://****/${IPA_NAME}</string></dict></array>

<key>metadata</key><dict>

<key>bundle-identifier</key>

<string>${bundleIdentifier}</string>

<key>bundle-version</key>

<string>${version}</string>

<key>kind</key>

<string>software</string>

<key>title</key>

<string>${IPA_PREFIX}</string>

</dict></dict></array></dict></plist>

需要注意的是,software-package的值,要配置成ipa对应的url。


OTA部署

通过2.2.2节中的环境部署和编译之后,我们已经构建出了ipa包,dSYM文件,以及对应的plist文件,但此时还无法编译,我们需要通过一个html,以特定的标签指定plist文件,直接通过网页进行OTA安装。

html内容如下:

<dd>

<button class="btn btn-defaultbtn-wide cell">

<a href=

' itms-services://?action=download-manifest&url=https://***/${IPA_PREFIX}.plist'>

<div>

<div><imgclass='icon_img' src='images/icon.png'/></div>

<h1style='color:black'>${IPA_PREFIX}</h1>

<p>发布日期:${ARCH_TIME_WITH_FORMAT}<span>${IPA_FILE_SIZE}<span></p>

</div>

</a>

</button>

</dd>

在html的配置中,需要注意的是,a标签中的这个值是固定的,itms-services://?action=download-manifest&url=

另外,url一定要使用https的方式访问,否则将无法访问plist文件。

最终,我们在界面上点击对应版本的item,即可直接安装ipa


如果你看的意犹未尽,如果你想随时随地充实自己,请扫描以下二维码,关注我们的公众账号,可以获取更多技术类干货,还有精彩活动与你分享~


大咖招募
欢迎App研发/测试方面的大牛来投稿,开设专栏。我们提供丰厚的稿酬,预约个人专访,帮助建立个人技术品牌!
立即投稿

我要评论

字数不能超过140字,谢谢!
提交

评论({{allComments.length}})

{{comment.create_time.substr(0,16)}}

显示所有评论
复制成功!