前言

在前面「macOS App 主动化分发 App Store 探究与实践」和 「一文带你读懂何为 macOS App 公证以及怎么主动化完结」2 篇文章中,别离给咱们介绍了 macOS 分发主动化完结相关的内容。其间,咱们总是会提及 App IDs、Certificates 和 Provisioning Profile 等相关内容,而且证书和 Profiles 在不同的分发渠道(网络或 App Store)都有所区分。

虽然,直接经过 Apple Developer 的账户(Account)后台能够检查前面提及的内容。但是,因为这个的条件是要求咱们注册 Apple Developer Program(付费 688),所以,存在必定的运用之前的本钱(费用),那么或多或少就有同学对此存在必定的盲区,以及在了解后也会遇到协作和办理的问题。

那么,今天本文也将会从 App IDs、Certificates、Provisioning Profile 作为开始,带咱们一起从理论基础出发,再到怎么运用工具(fastlane match)完结主动化办理。

1 App IDs、Certificates & Provisioning Profile

在 Apple Developer 的账户(Account)后台,有专门用于检查 Certificates, Identifiers & Profiles 的页面,你能够在这儿办理你的证书 Certificates、App IDs(Identifiers)和 Provisioning Profile:

下面,咱们别离来看下这 3 者。那么,首先是 App IDs(Identifiers)。

1.1 App IDs(Identifiers)

App IDs(Identifiers),它是 Identifiers 的一种,用于使得你的 App、App Extension 或 App Clip 能够访问可用服务,以及能够在 Provisioning Profile 中标识你的 App。

也就是说,App IDs 是一个运用的仅有标识,是必须要创立的,它的命名遵循 reverse-domain 的风格,例如 com.domainname.appname。而且,咱们能够经过检查 macOS 上 App 的包内容(运用程序->右键-> info.plist),例如 macOS 上的微信的 App IDs 会是 com.tencent.xinWeChat

1.2 Certificates

然后,接着是证书 Certificates,证书分为这 2 类:

  • 软件 Software,包括用于运用(iOS、macOS 和 watchOS 等)代码签名、Apple Store 分发(Distribution)、安装包(Installer package)签名等证书
  • 服务 Services,包括苹果推送服务( Apple Push Notification service )、苹果支付处理证书(Aple Pay Payment Processing Certificate)等证书

而且,值得一提的是证书的创立运用的是一种 创立证书签名请求 的方法,这种方法遵循的非对称加密(RSA),它会在本地创立一对共用密钥和专用密钥(以下总称私钥 Private Key),其间,公钥用于加密证书,私钥是保存在创立者本地的钥匙串 KeyChain 中。

那么,假如你想将证书共享给别人运用,但是因为非对称加密的约束(证书是加密的),咱们还需求供给解密证书对应的私钥,所以,一般情况下咱们是在钥匙串中导出个人信息交流(.p12)文件,它会包括证书自身和解密它需求的私钥:

此外,关于各个证书的具体效果有爱好的同学能够自行了解。这儿,咱们来看下软件 Software 证书中 macOS 开发和分发相关的 4 个证书:

  • Mac Development,用于 macOS 运用开发版别的代码签名处理,例如,假如你有一个 FEKit.app 文件没有经过运用的签名,则能够运用 codesign 指令进行签名:
codesign -s "Development" ./FEKit.app
  • Developer ID Application,用于 macOS 运用正式版别的代码签名处理:
codesign -s "Developer ID Application: Jingchang wu(xxxxxxxxxx)" ./FEKit.app
  • Mac Installer Distribution,用于对安装包(Install Package)进行代码签名以提交到 App Store

  • Mac App Distribution,用于对运用程序进行代码签名,以及装备分发 Provisioning Profile 用于提交到 App Store

1.3 Provisioning Profile

最终,则是 Provisioning(装备)Profile,Provisioning Profile 分为这 2 类:

  • 开发 Development,用于装备能够安装开发版别运用的设备有哪些,也就是在创立 Development 下的某类 Provisioning Profile 文件的时分需求填入测验设备的硬件 UUID(关于本机->系统报告)

  • 分发 Distribution,用于装备运用分发相关,例如提交 AppStore、运用 Apple Services 等

那么,关于 macOS 而言,咱们则需求创立 **macOS App Development(装备开发版别运用的测验设备)、
Mac App Store(提交 AppStore)和 Developer ID(在网络上分发)**等 3 个 Provisioning Profile。

2 fastlane match 主动化办理

一般,咱们一个项目会有多个开发者 Developer,那怎么在多个开发者之间同享同一份 Mac Development、Developer ID Application 等证书或 Provisioning Profile 文件,就成为了一个比较琐碎的问题

所以,fastlane 供给了一个名为 sync_code_signing 的 Action 用于处理上面提及的这个问题,它的 alias 是 match,也就是咱们能够经过 fastlane match xxx 之类的指令来完结证书和 Provisioning Profile 文件的保护(创立、更新)和拉取(同步到开发者本地),而这些操作则是运用的 Apple Store Connect API 供给的接口完结的。

其间,因为 fastlane 需求指定的能够用于存储证书和 Provisioning Profile 文件的地方,你能够运用 Git Repo、Google Cloud 和 Amazon S3 其间的 1 种作为存储的挑选,这儿咱们挑选用 GitLab 的 Repo。

那么,首先是在你的项目中执行 fastlane match init 指令,它会提示你要挑选的存储方法:

这儿咱们挑选 Git,然后需求输入 Repo 的地址,最终它会在当前项目路径的 ./fastlane 文件目录中创立 Matchfile 文件:

git_url("https://gitlab.com/xxxxx/xxxxxxxxxx.git")
storage_mode("git")
type("development") # The default type, can be: appstore, adhoc, enterprise or development
# app_identifier(["tools.fastlane.app", "tools.fastlane.app2"])
# username("user@fastlane.tools") # Your Apple Developer Portal username

能够看到,默认设置了 git_url 为前面输入的 Git Repo 的地址(以下总称 Match Repo),然后 storage_mode 设置的为 git,而且默认会设置 typedevelopment,这意味着在执行 fastlane match development --readonly 指令的时分会获取所有 development 相关的证书和 Provisioning Profile 文件(假如没有则会重新创立)。

因为,许多情况下咱们运用 fastlane match <type> 相关的指令的时分,咱们或许现已创立好了各类的证书和 Provisioning Profile 文件。所以,不能直接运用 fastlane match <type> 的指令,这样会给你吊销之前已创立好的这些文件并创立一个新的

因此,咱们需求运用 fastlane match import 指令来将本地的证书(.cer)、个人信息交流(.p12)和 Provisioning Profile 文件手动导入到 Match Repo 中,例如咱们需求把 Developer ID Application 相关的证书、p12、Provisioning Profile 文件导入:

1.首先,修改下之前的 Matchfile 文件的内容:

# 注意,默以为 master 分支
git_url("https://gitlab.com/xxxxx/xxxxxxxxxx.git")
storage_mode("git")
# 指定证书、.p12、Provisioning Profile 的类型
type("developer_id")
# 指定咱们的 App IDs
app_identifier("com.xxx.xxxx")

2.接着,将本地的上面提及的文件在钥匙串中别离导出到文件系统中。

3.最终,运用 fastlane match import 指令,此时会让你输入各个文件地点的位置,然后需求输入密码用于证书的加密,也就是说其他人从 Match Repo 拉取的时分需求输入对应的密码用于解密,接着则还会让你输入 Apple Developer Program 账户来对这些文件进行验证,假如你不希望验证能够运用 --skip_certificate_matching true Option 来跳过这个过程。

在完结上述文件的导入后,在 Match Repo 中能够看到新增了 /certs/developer_id_application/ 和 /profiles/developer_id/ 等 2 个目录结构,后续咱们导入别的的证书(.cer)、个人信息交流(.p12)和 Provisioning Profile 文件则会一并添加到 /certs 或 /profiles 目录下:

certs
  |———— developer_id_application
        |__ xxxxx.cert
        |__ xxxxx.p12
profiles
  |———— developer_id
        |__ xxxxxxxxxxxxxxxxxxx.provisionprofile

然后,假如有同学在开发过程中需求运用到 Developer ID Application 相关的证书、私钥(.p12)和 Provisioning Profile 文件,则能够经过 fastlane match developer_id --readonly 指令获取这些文件到本地的钥匙串中,其间 --readonly 只拉取 Match Repo 中存在的 developer_id 相关文件,不会主动创立一个新的。

结语

经过阅览,关于之前一直没有接触过这方面知识的同学,我想现已对证书、App IDs 和 Provisioning Profile 等相关内容都或多或少有了必定的了解。而且,经过简略地了解 fastlane match 供给的能力,也能够让团队在这方面的协作功率和保护办理都得到了提高。此外,值得一提的是 fastlane match 供给了许多参数,来支撑更多个性化的操作,例如过期主动创立、吊销指定类型的证书等,所以有爱好的同学也推荐在文档中继续了解一番。

最终,假如文中存在表达不妥或错误的地方,欢迎各位同学提 Issue ~

点赞

经过阅览本篇文章,假如有收获的话,能够点个赞,这将会成为我继续共享的动力,感谢~

我是五柳,喜爱创新、捣鼓源码,专心于源码(Vue 3、Vite)、前端工程化、跨端等技能学习和共享,欢迎关注我的微信公众号 Code center 或 GitHub