【Fastlane】记录[IOS应用迁移]的经历

125 阅读4分钟

背景

  • 将1个应用从[A个人账号]迁移到[B公司企业账号]

发生的问题

  • 线上应用接收不到推送;
  • 新版本所涉及到的开发证书需要重建;

推送篇

  • 问题的原因是:推送服务所配置的key没有重新新建过,重新在新账号下新建推送所需要的key,然后重新配置一下就能解决;

证书篇

  • 这个应用之前涉及到了AppGroups的概念,这个经过大量阅读其他文档资料以及亲自操作验证,可以在旧账号上把原来所涉及到AppGroups的appid给先删掉,然后在新账号里面重新创建,能够解决问题并且不会影响到线上已经下载过的用户;
  • 开发证书要重新创建,这个主要看下面的Fastlane篇,但实际没解决问题,最后实际操作是按这段记录去重新生成解决问题的; 4751ca47da3a5571eeda10b16f33fda.png
  • 另外其他有个暗坑是:我在旧打包机上使用了新的账号证书,但还是一直编译报错无法通过,提示找不到库之类的报错,查了很久资料不知道为什么,后来插上真机运行就好了,可能是没插真机的时候是用模拟器,模拟器的话有些依赖会找不到吧。

Fastlane篇

Fastlane篇-概述

  • 官方文档: docs.fastlane.tools/
  • 简介: Fastlane是用Ruby语言编写的一套自动化工具集和框架, 每一个工具实际都对应一个Ruby脚本, 用来执行某一个特定的任务, 而Fastlane核心框架则允许使用者通过类似配置文件的形式, 将不同的工具有机而灵活地结合在一起, 从而形成一个个完整的自动化流程。
  • 原理: Fastlane命令执行的底层并不是自己实现的, 而是调用其他的插件或者工具执行的;
    1. 核心一. 打包命令, fastlane中的gym工具只是xcodebuild工具的一个封装. 因此安装fastlane的步骤里有安装IDE的指令集;
    2. 核心二. iTC(即iTunesConnect苹果的账号证书应用管理平台)命令. 苹果除了提供图形化可操作的网页之外, 还提供相对应的一整套底层API给开发者使用, fastlane的底层操作是封装的这套API。

Fastlane篇-match

  • 官方文档: docs.fastlane.tools/actions/mat…
  • 功能特性:
    1. 创建/更新/托管 Xcode所需的各种证书和打包所需的profiles。
    2. 证书具有密码加密保护(openssl)
    3. ...
  • [Matchfile]的字段说明:
git_url("git@git.demo.com:demo/client/ios/certificates.git") # 证书存储的仓库地址
git_branch("feature/demo") # 仓库分支(不写默认是master)
storage_mode("git") # 存储方式
type("development") # 默认的profile的类型(可以为:appstore,adhoc,enterprise,development)
app_identifier(["com.xxxx.a","com.xxxx.a.share"]) #bundleid(只有1个的话,是"com.xxxx.a")
clone_branch_directly true # 仅克隆指定分支
force_for_new_devices true # 更新描述文件(当设备数发生变化时进行同步更新)
  • [手动上传证书和配置文件]的步骤说明:
  1. 创建目录结构
certificates
    certs
        development
            {certid}.cer
            {certid}.p12
        distribution
            {certid}.cer
            {certid}.p12
    profiles
        adhoc
            AdHoc_{bundleid}.mobileprovision
        appstore
            AppStore_{bundleid}.mobileprovision
        development
            Development_{bundleid}.mobileprovision
    match_version.txt
  1. 找到现有证书的certid
# 将下述代码保存为[{任意文件名}.rb]文件, 打开终端执行[ruby {任意文件名}.rb] (备注:若是首次执行的话, 需要验证已绑定的设备验证码, 苹果会把6位验证码推到对应已绑定的设备上)
require 'spaceship'
 
Spaceship.login('xxxxxx@xxx.com') #输入对应的苹果账号
Spaceship.select_team
 
Spaceship.certificate.all.each do |cert| 
  cert_type = Spaceship::Portal::Certificate::CERTIFICATE_TYPE_IDS[cert.type_display_id].to_s.split("::")[-1]
  puts "Cert id: #{cert.id}, name: #{cert.name}, expires: #{cert.expires.strftime("%Y-%m-%d")}, type: #{cert_type}"
end	
  1. 加密证书和配置文件
a.需要将[证书和配置文件]加密后, 才能符合match的验证要求;
b.加密证书
    执行 [openssl pkcs12 -nocerts -nodes -out key.pem -in {证书}.p12] 生成.pem文件
    执行 [openssl aes-256-cbc -k {密码} -in key.pem -out {certid}.p12 -a] 生成加密后的p12
    执行 [openssl aes-256-cbc -k {密码} -in {证书}.cer -out {certid}.cer -a] 生成加密后的cer
c.加密配置文件
    配置文件起名需要符合规则 {Development/AdHoc/AppStore/InHouse}_{bundleid}.mobileprovision
    执行 [openssl aes-256-cbc -k {密码} -in xxxx.mobileprovision -out Development_xxxx.mobileprovision -a]
  1. 上传加密后的证书和配置文件
将加密后的文件放到对应的文件目录内,push到远端仓库内。
  1. 验证证书的有效性
执行 [fastlane match development --verbose] 如果成功,说明创建的证书没问题

Fastlane篇-参考资料