摘要
主动推送指通过主动的形式将挪动端利用推送至相应的公布平台供客户下载应用。目前研发核心曾经实现了开放平台、主机平台以及挪动平台等支流开发语言的集中构建,随着挪动端利用逐步成为人们生存中应用最频繁的程序,研发核心挪动端利用也呈井喷式的增长,iOS平台作为挪动端重要的组成部分之一,因为其自身产品零碎的独特性以及挪动利用迭代频繁的特点,在实现了集中构建当前,推送至苹果商店这一环节始终处于手工上传的形式。
为了适应我的项目投产须要与核心构建公布整体倒退思路保持一致,在进行了大量我的项目实际的根底上本文提出了可借鉴的主动构建推送办法,旨在帮忙我的项目实现齐全自动化的构建推送,将指标码间接推送至苹果商店,无效治理我的项目证书和代码的同时,缩小不必要的交互,进步投产效率并为后续的测试和自动化部署积攒丰盛的教训。
关键词:主动推送、TFS、指标码、继续集成
一、钻研背景
苹果操作系统次要包含OSX和iOS,其次要的开发语言为Objective-C、Swift以及Javascript,应用LLVM编译器框架零碎,前端应用Clang编译器。目前研发核心投产运行的苹果利用次要应用Objective-C和Javascript语言开发,苹果公司为每一个利用都设置了证书以保障信息在互联网中平安传输,分为公司版证书程序和企业版证书程序,这两类证书对程序的公布路径起着至关重要的作用:
- 公司版证书:属于“组织”类别,性能用处与个人版证书统一,容许多个开发者合作开发,只能用于将利用公布至苹果App Store。
- 企业版证书:属于“组织”类别,容许多个开发者合作开发,只能用于将利用公布至企业外部应用。
因为iOS利用具备上述特点,证书对于iOS利用的投产和上线起到了至关重要的作用并且与研发核心现有投产体系存在较大差别,目前大多采纳手动公布的模式。面对挪动端利用投产上线的理论状况,在实现集中构建工作当前,将利用公布至苹果App Store这一环节的自动化形式成为亟待解决的问题。
二、技术术语
2.1 编译
一般来说编译过程次要分为以下四局部:
- 预处理(Pre-process),把宏替换,删除正文信息,将头文件进行开展,产生.i文件。
- 编译(Compliling),把.i文件转换成汇编语言产生.s文件。
- 汇编(Asembly),将.s文件转换成机器编码文件,产生.o文件。
- 链接(Link),对.o文件中的所提到的的库文件进行援用(包含多个.o文件进行link),生成最初的可执行文件。
2.2 开发语言
iOS开发语言次要包含:C语言根底、Objective-C、Swift以及Javascript编程语言。
- Objective-C:是裁减C的面向对象编程语言,它是一个用C写成很小的运行库,令应用程序尺寸减少很小,齐全兼容C语言,能够应用GCC和Clang运行的零碎上进行编译,目前研发核心次要应用该语言进行开发。
- Swift:于2014年WWDC公布的新开发语言,可与Objective-C独特运行于Mac OS和iOS平台,为了使Swift语言易用性和功能性更加杰出,苹果公司也在一直的对编译器进行优化和改良。以目前最新版本Xcode7版本为例,应用LLVM7.1(Xcode7.3)编译器,该编译器是自Xcode5将GCC编译器勾销后始终应用的,LLVM编译器的前端是Clang,反对C、C++、Objective-C和Objective-C++等编程语言。
- JavaScript:该脚本语言是苹果公司在iOS7之后推出的基于JavaScriptCore.framework框架的开发方式,实现Objective-C与Javascript互相调用并传参的办法,应用此框架能够在iOS利用中运行JavaScript脚本,也就是HybirdApp混合模式挪动利用,即其中蕴含原生的构造有内嵌有web组件,这种App不仅性能和用户体验能够达到和原生所差无几的水平,更大的劣势在于bug修复快,版本迭代无需从新编译公布,目前研发核心越来越多的我的项目开始采纳此种开发模式。
2.3 iOS构建公布因素
iOS利用从构建到公布利用个别会经验三个阶段:在Xcode(苹果程序开发工具)上运行调试、在设施上运行调试和编译公布。 苹果为了避免非法设施和非开发人员调试和公布利用,须要应用配置概要文件(Provisioning Profiles)管制利用在设施上运行调试和编译公布。配置概要文件由证书(certificates)、我的项目标识(Identifiers)以及设施(Devices)组成,具体的编译公布流程如下:
图1
- 证书(Certificates):苹果官网颁布的证书,分为开发证书和公布证书两种,苹果是发布者,而后装置,这个证书的Mac就是拥有者。苹果就会给电脑授予这个证书所对应的权力,简略来说,证书是iOS利用开发的根底,也是构建的必要组成部分。
- 我的项目标识(Identifiers):Identifiers即“标识符”,约等于是我的项目的身份证,用于区别苹果利用,每个利用都有各自惟一的标识符,我的项目标识包含:App ID其实就是一个App的身份证,一个App的地位标识。在Project中称为Bundle ID。在Member Center、Project、ITunes Connect都是须要此ID去标识APP的唯一性。Bundle ID在不同环境下的体现关系,如下图所示:
图2
在创立App ID过程中能够配置该利用的权限,比方是否用到了PassBook,GameCenter,以及更常见的push服务,如果选中了push服务,那么就能够创立生成具备推送服务的App ID,所以,在所有和推送相干的配置中,首先要做的就是先开明反对推送服务的App ID。
- 设施(Devices):Devices作用为创立测试设施,只有在此列表中的设施能力装置真机调试阶段的苹果利用,未在该列表中的设施则不能装置,个别状况下该列表中设施总数不能超过100个。
- 配置概要文件(Provisioning Profiles):配置概要文件是很有苹果特点的设置,该文件将证书(Certificates) 、我的项目标识(Identifiers)、设施(Devices)联合起来,造成一个形容证书、标识符的形容文件。通过Xcode编译的过程将配置概要文件与程序关联起来从而造成待发布苹果App。
三、问题形容
推送是将构建并测试通过的苹果利用公布到利用市场期待审核的过程,对于苹果利用而言,个别分为两局部:
- 第一局部是将待投产的程序包上传至苹果服务器进行程序及配置文件的主动扫描,次要在代码层面进行查看。
- 第二局部是在机器扫描通过后进行利用市场公布的最初检测,次要针对程序的性能和性能进行人为测试。
通过后期集中构建状况剖析和经验总结,在实现了全行苹果利用集中构建的根底上,如何代替人工上传形式,将待投产程序主动推送至苹果服务器进行审核,成为了影响苹果继续集成效率的关键点,经后期手动推送利用的状况剖析和经验总结,对我的项目症结有了大抵的分类和判断,总体来说iOS主动推送次要问题集中在如下几点:
1)推送形式多样
iOS分为两种形式推送形式:
- 一种是通过开发工具Xcode在手动实现构建后间接通过界面上传至苹果商店。
- 第二种是通过Xcode中自带的上传工具Application Loader进行上传,尽管界面不同,但其最终上传界面和代码没有本质区别。
2)推送环境非凡
iOS我的项目开发需在苹果操作系统macOS中进行,开发工具个别采纳Xcode,目前研发核心苹果集中构建在内网环境中解决,尽管构建环境对立,但因为两网隔离的制约,推送至苹果商店及相干公布平台形式不尽相同。
3)推送管理工具多样
iOS我的项目开发大多在苹果笔记本上进行,配置库采纳GIT版本控制系统较多,公布后果除了苹果平台以外,没有对立的管理机制,在代码品质、版本稳定性以及版本追溯等方面对我的项目投产上线产生极大的影响。
4)公布操作简单人工成本高
苹果公司对每一个公布的iOS利用都采纳证书受权机制,通过编译将证书进行注入,起到认证和治理的目标,但因为证书的唯一性,在日常开发过程中是无奈应用苹果受权证书进行打包并生成iOS利用的,尤其这对须要进行大规模测试的我的项目来说影响较大,我的项目上线则须要将代码拷贝至组织级构建管理员处进行编译后公布。
为了更好的解决iOS我的项目推送问题,应从推送形式动手,梳理iOS利用推送特点的同时,总结出实用于不同我的项目状况的推送办法,解决因为公布形式和公布路径不同对苹果利用投产产生的影响,晋升整体集成效率,升高投产危险。
四、解决方案
4.1 构建推送日志剖析
通过大量的手工编译和推送并对日志进行剖析总结得出目前研发核心iOS利用推送一共分为两种状况:
- 一种是公布至苹果商店对客进行下载,这种我的项目须要公布至苹果商店供苹果设施客户进行下载。
- 第二种是企业外部需要间接在企业外部发放应用的利用。
通过查看Build日志能够进一步的理解苹果程序编译推送过程的工作原理晋升开发及治理工作效率,在少数状况下Build编译日志暗藏了大量的信息,其中常常会有一些通用的编译命令,以这些命令为根底能够更好的对编译日志进行模块化的解读和钻研。
CompileC...:次要用来编译.m和.c文件,在每一个target中被宽泛应用,生成两头文件.o,个别呈现在Compile步骤的行首地位。
图3
Libtool...:次要是从指标文件中构建library,即生成.a文件,个别呈现在创立.a文件的过程中。
图4
CreateUniversalBinary...:将上阶段生成.a文件合并为一个通用的二进制文件。
图5
Ld:与Libtool性能类似是一个linker的工具,被用来构建可执行文件,即生成最终的.ipa文件,该命令个别较长呈现在构建指标码阶段。
根据上述命令剖析就能够很清晰的理解苹果程序的编译过程,以我的项目中某一target为例,如下图所示,该target作用是生成可执行文件须要的.a文件,即libDZNEmptyDataSet.a,其中应用了CompileC、Libtool以及CreateUniversalBinary等命令对源码进行解决。
图6
在编译实现后Xcode自带的Application Loader提供了一整套命令行工具 altool,帮忙我的项目解决我的项目指标码文件的验证和上传工作。
altool --validate-app -f file -u username [-p password] [--output-format xml]
altool --upload-app -f file -u username [-p password] [--output-format xml]
4.2 主动推送办法钻研
通过对上述日志进行逐字逐句剖析能够看出iOS我的项目尽管编译过程比较复杂,编译命令数量繁多,编译办法丰盛多样,但总体来说都会遵循肯定的规定进行,每一个target之间存在互相的主次关系,通过调用主target就能够实现整个我的项目构建并生成指标码(.IPA)文件。主动推送当中最为要害的是ExportOptions.plist文件,文件中记录了两个配置概要文件对应规定,在主动推送的过程中,程序间接调用该plist文件就可正确进行匹配,缩小手工干涉过程,最终实现利用的主动推送。
我的项目的配置和规定信息都贮存于工程文件(.xcodeproj)当中,通过主动构建能够实现生成指标码,但外围问题是,在随后的推送利用过程当中,须要手动对上传指标码进行匹配,上传过程和命令根本不可见,须要对推送过程中应用的命令进行整顿和剖析能力最终造成主动推送命令行办法。通过对手工过程中所遇到状况进行总结,联合Xcode命令参数,目前造成了两种能够笼罩研发核心现有我的项目模式的主动推送计划。
1)调用plist文件实现主动推送
这类推送模式绝对比较简单,只须要对推送过程中的操作命令进行排列组合并找到我的项目所对应的plist文件即可实现主动推送过程,目前研发核心次要应用该种形式进行利用的主动推送,经测试和理论应用经验总结,比拟罕用的命令如下所示:
表1 推送参数解析
为了更好对iOS推送过程进行解析,将上述命令行带入我的项目运行能够看出实际效果如下:
project_path=/Users/abc/ipaproject_name=AutoDeployTestscheme_name=ABCDeploydevelopment_mode=Releasebuild_path=${project_path}/buildexportOptionsPlistPath=${project_path}/ExportOptions.plistexportIpaPath=${project_path}/ABCDir/${development_mode}altoolPath="/Applications/Xcode.app/Contents/Applications/Application Loader.app/Contents/Frameworks/ITunesSoftwareService.framework/Versions/A/Support/altool""$altoolPath" --validate-app -f ${exportIpaPath}/${scheme_name}.ipa -u 123 -p 123 ios --output-format xml"$altoolPath" --upload-app -f ${exportIpaPath}/${scheme_name}.ipa -u 123 -p 123 ios --output-format xml
在理论调用的plist文件中曾经将证书、配置文件、公布形式等参数进行了匹配记录,间接调用即可,缩小了很多不必要的交互,实现最简洁的iOS利用的主动公布。
图7
最初通过参数将上传过程中的信息进行保留并生成xml文件解析其中的key值来判断上传步骤是否胜利。key值为success-message即上传胜利,key值为product-errors则为上传失败,可持续在xml文件中查看报错信息。
图8
图9
2)应用Fastlane实现主动推送
这类主动推送绝对简单,Fastlane是一套应用Ruby编写的自动化工具集,旨在简化Android和iOS的部署过程,自动化工作流,对于Fastlane的装置配置,这里就不过多赘述了,它一套工具的汇合,每一个工具叫做action,包含代码签名、构建、打包、推送等性能,因为构建打包性能曾经在TFS中实现,这里只会用到Fastlane推送性能。
图10
图11
这里咱们会应用到deliver这个action当中的上传性能实现自动化将利用上传至App Store当中,因为Fastlane中每一个action都提供了非常弱小的命令行性能,这里就不做开展,仅简要进行介绍。
表2 罕用action解析
装置实现后,在进行上传利用前,须要对本次上传的利用信息进行保护,以便在上传过程中对利用的信息进行更新,并保障上传过程不会因为信息谬误而导致失败,具体保护形式次要是对装置目录下的Deliverfile文件中的信息进行填写,目标是利用该文件提前保护好ITunes Store须要填写的利用相干信息,保障上传过程的自动化。
# The Deliverfile allows you to store various iTunes Connect metadata# For more information, check out the docs# https://docs.fastlane.tools/actions/deliver/# 依据iTunes Store 信息设置username "123" # Apple ID email addressapp_identifier("com.abc.test") # bundle identifier#ipa("/Users/abc/ipa/ABCDeploy.ipa") # 没有这个选项,只有metadata会被上传copyright("版权信息") #版权信息#submit_for_review(false) #是否提交审核,true示意立马提交审核screenshots_path("./fastlane/screenshots") # 截屏图片展现price_tier 0 #app 发售价格trade_representative_contact_information( #iTunes store 信息 first_name: "yinhang", #名 last_name: "nongye", #姓 address_line1: "123", #地址 address_line2: "", address_line3: "", city_name: "BeiJing", # 城市 state: "BeiJing", # 省 country: "China", #国家 postal_code: "100000", # 邮编 phone_number: "+86 13700000000", # 手机 email_address: "abc.abchina.com", #邮箱)app_review_information( # app审核信息 first_name: "yinhang", # 名 last_name: "nongye", #姓 phone_number: "+86 13700000000", #分割信息电话号码 email_address: "abc.abchina.com", #分割信息邮箱 demo_user: "123", #审核测试账号 demo_password: "123", # 审核测试明码 notes: "备注信息" # iTunes Store 审核信息备注)#提交审核信息:加密, idfa 等submission_information(export_compliance_encryption_updated: false, export_compliance_uses_encryption: false, content_rights_contains_third_party_content: false, add_id_info_uses_idfa: false)name({'zh-Hans' => "nongyeyinhang" # app名称})description({ #iTunes Store 中形容信息 'zh-Hans' => "APP的形容信息,用于APP性能的形容和介绍不能少于10个字符"})release_notes({ 'zh-Hans' => "第一个版本测试"})keywords( # 膨胀关键词 "zh-Hans" => "农业, 银行")promotional_text( "zh-Hans" => "宣传文本信息介绍",)support_url({ # 技术支持网址(URL) 'zh-Hans' => "http://www.95599.cn"})marketing_url({ #营销网址 'zh-Hans' => "http://www.95599.cn"})privacy_url({ 'zh-Hans' => "http://www.95599.cn"})app_icon('./fastlane/metadata/AppIcon.png') #利用图标primary_category("Utilities") # primary_first_sub_category "Card"# primary_second_sub_category "Casino"# 要设置的主要类别 无# secondary_category # 设置的主要第一个子类别 无# secondary_first_sub_category # 设置的主要第二个子类别 无# secondary_second_sub_categoryautomatic_release true #审核过之后主动公布
Deliverfile文件维护实现后,须要对fastlane/metadate/下创立名为itunes_rating_config.json文件,依照ITunes Store要求对利用进行评级供给审核时应用。
{ "CARTOON_FANTASY_VIOLENCE": 0,#卡通或空想暴力 "REALISTIC_VIOLENCE": 0,#事实暴力 "PROLONGED_GRAPHIC_SADISTIC_REALISTIC_VIOLENCE": 0,#大量露骨或残忍的事实暴力 "PROFANITY_CRUDE_HUMOR": 0,#低俗笑话 "MATURE_SUGGESTIVE": 0,#成人/性暗示题材 "HORROR": 0,#恐怖/惊悚题材 "MEDICAL_TREATMENT_INFO": 0,#医学/医疗信息 "ALCOHOL_TOBACCO_DRUGS": 0,#应用或提及烟、酒或毒品 "GAMBLING": 2,#模仿赌博 "SEXUAL_CONTENT_NUDITY": 0,#色情或袒露内容 "GRAPHIC_SEXUAL_CONTENT_NUDITY": 0,#色情及裸体画面 "UNRESTRICTED_WEB_ACCESS": 0,#无限度的网站拜访 "GAMBLING_CONTESTS": 0#赌博和比赛}
上述工作全副实现后,就能够通过Fastlane中的action进行利用的主动上传,实现利用主动构建公布的全流程自动化。
default_platform(:ios)platform :ios dodesc "上传至 App Store" lane :release doscheme_name="ABCDeploy" output_directory="/Users/abc/ipa"scheme_version="1.0.0"output_name="#{scheme_name}_#{scheme_version}.ipa" gym(export_method: "app-store",export_xcargs: "-allowProvisioningUpdates", scheme: scheme_name,clean: true,output_directory: output_directory,output_name: output_name,) deliver( Ipa:"output_name" submit_for_review: true, ignore_language_directory_validation:true, force:true skip_screenshots:true ) end
五、总结
主动推送能够说是在iOS集中构建实现后急需解决的一个流程贯通环节,以往手动上传须要人工干预较多,效率绝对较低,iOS利用实现了标准化构建模式后急需一个主动推送模式进行连接。
本次钻研制订“调用plist文件实现主动推送”以及“应用Fastlane实现主动推送”的推送办法,相比拟这两种办法:
- “调用plist文件实现主动推送”中所应用到的ExportOptions.plist文件是通过集中构建主动生成的,不须要人工干预和保护,对于曾经公布过的iOS利用来说非常的便当快捷,目前研发核心我的项目大多应用该种形式进行利用的主动推送。
- “应用Fastlane实现主动推送”因为提供了一整套action的工具集,实现的性能比拟弱小,但所需保护的苹果商店信息比较复杂,首次应用很容易呈现信息谬误的状况适宜屡次投产的“新手”应用,并且能够对主动推送进行定制化开发,灵活性较高。
这两种办法次要目标是帮忙我的项目解决iOS利用测试和公布环节效率低下的问题,晋升了公布效率,升高了交互时长,晋升了工作品质并建设标准化的主动推送流程,是向继续集成,继续部署,继续交付等开发实际又迈出松软的一步,置信在后续工作发展当中仍能判若两人的乘风破浪一直深入扩大集中构建成绩,积极探索后续开发实际过程,为研发核心DevOps以及继续集成和继续部署等工作提供技术力量反对。
本文作者:零碎反对部 霍晓楠