【DevOps进行时】iOS应用自动推送的方法研究与实践 | IDCF
本文作者:系统支持部 霍晓楠
摘要
一、研究背景
公司版证书:属于“组织”类别,功能用途与个人版证书一致,允许多个开发者协作开发,只能用于将应用发布至苹果App Store。 企业版证书:属于“组织”类别,允许多个开发者协作开发,只能用于将应用发布至企业内部使用。
二、技术术语
预处理(Pre-process),把宏替换,删除注释信息,将头文件进行展开,产生.i文件。 编译(Compliling),把.i文件转换成汇编语言产生.s文件。 汇编(Asembly),将.s文件转换成机器编码文件,产生.o文件。 链接(Link),对.o文件中的所提到的的库文件进行引用(包括多个.o文件进行link),生成最后的可执行文件。
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修复快,版本迭代无需重新编译发布,目前研发中心越来越多的项目开始采用此种开发模式。
证书(Certificates):苹果官方颁布的证书,分为开发证书和发布证书两种,苹果是发布者,然后安装,这个证书的Mac就是拥有者。苹果就会给电脑授予这个证书所对应的权利,简单来说,证书是iOS应用开发的基础,也是构建的必要组成部分。 项目标识(Identifiers):Identifiers即“标识符”,约等于是项目的身份证,用于区别苹果应用,每个应用都有各自唯一的标识符,项目标识包括:App ID其实就是一个App的身份证,一个App的位置标识。在Project中称为Bundle ID。在Member Center、Project、ITunes Connect都是需要此ID去标识APP的唯一性。Bundle ID在不同环境下的表现关系,如下图所示:
设备(Devices):Devices作用为创建测试设备,只有在此列表中的设备才能安装真机调试阶段的苹果应用,未在该列表中的设备则不能安装,一般情况下该列表中设备总数不能超过100个。 配置概要文件(Provisioning Profiles):配置概要文件是很有苹果特点的设置,该文件将证书(Certificates) 、项目标识(Identifiers)、设备(Devices)结合起来,形成一个描述证书、标识符的描述文件。通过Xcode编译的过程将配置概要文件与程序关联起来从而形成待发布苹果App。
三、问题描述
第一部分是将待投产的程序包上传至苹果服务器进行程序及配置文件的自动扫描,主要在代码层面进行检查。 第二部分是在机器扫描通过后进行应用市场发布的最后检测,主要针对程序的功能和性能进行人为测试。
一种是通过开发工具Xcode在手动完成构建后直接通过界面上传至苹果商店。 第二种是通过Xcode中自带的上传工具Application Loader进行上传,虽然界面不同,但其最终上传界面和代码没有本质区别。
四、解决方案
一种是发布至苹果商店对客进行下载,这种项目需要发布至苹果商店供苹果设备客户进行下载。 第二种是企业内部需求直接在企业内部发放使用的应用。
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
# 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 #审核过之后自动发布
{
"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#赌博和竞赛
}
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
五、总结
“调用plist文件实现自动推送”中所使用到的ExportOptions.plist文件是通过集中构建自动生成的,不需要人工干预和维护,对于已经发布过的iOS应用来说十分的便利快捷,目前研发中心项目大多使用该种方式进行应用的自动推送。 “使用Fastlane实现自动推送”由于提供了一整套action的工具集,实现的功能比较强大,但所需维护的苹果商店信息比较复杂,初次使用很容易出现信息错误的情况适合多次投产的“老手”使用,并且可以对自动推送进行定制化开发,灵活性较高。
评论