乐趣区

关于ios:DevOps进行时iOS应用自动推送的方法研究与实践-IDCF

摘要

主动推送指通过主动的形式将挪动端利用推送至相应的公布平台供客户下载应用。目前研发核心曾经实现了开放平台、主机平台以及挪动平台等支流开发语言的集中构建,随着挪动端利用逐步成为人们生存中应用最频繁的程序,研发核心挪动端利用也呈井喷式的增长,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/ipa
project_name=AutoDeployTest
scheme_name=ABCDeploy
development_mode=Release
build_path=${project_path}/build
exportOptionsPlistPath=${project_path}/ExportOptions.plist
exportIpaPath=${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 address
app_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_category
automatic_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 do
desc "上传至 App Store"
   lane :release do
scheme_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 以及继续集成和继续部署等工作提供技术力量反对。

本文作者:零碎反对部 霍晓楠

退出移动版