如何确定 iOS 应用程序是使用开发证书还是分发证书签名的?

Posted

技术标签:

【中文标题】如何确定 iOS 应用程序是使用开发证书还是分发证书签名的?【英文标题】:How to find out whether iOS app was signed with a development or a distribution certificate? 【发布时间】:2017-09-14 12:10:12 【问题描述】:

我想知道 ios 应用是否可以查明它是使用开发证书还是分发证书签名的。

我发现 iOS 应用可以通过访问 bundle 的信息字典来获取一些关于自身的元信息。例如,可以通过从字典中读取 CFBundleVersion 键来检索版本。是否存在类似的获取签名证书信息的方法?

我之所以问,是因为 APNS。当我的应用程序向我的云服务器注册 APNS 设备令牌时,云服务器需要知道是否需要通过调用 Apple 的生产 APNS 服务器(“api.push.apple.com”)或开发 APNS 服务器来创建该令牌的推送消息“api.development.push.apple.com”。

【问题讨论】:

APNS 设置存储在权利中,而不是签名证书中。您查看过codesign 工具的源代码吗? 我没有查看协同设计工具的源代码。你关于权利的评论很有趣。我看到我的项目包含一个扩展名为“.entitlements”的文件。该文件指定键“APS Environment”的值为“development”。因此,从应用程序访问该信息也可以解决我的问题。我(尚)不知道如何从我的 Swift 代码中以编程方式获取该信息,但感谢您的提示! 在代码签名构建阶段,该值设置为developmentproduction。这取决于代码签名证书和配置文件。 以下是在运行时读取应用权利的分步说明:davedelong.com/blog/2018/01/10/reading-your-own-entitlements 【参考方案1】:

有关 APNS 服务器的信息位于二进制文件代码签名部分的权利中。基本步骤是:

    dladdr 获取二进制文件的加载地址。 循环遍历LC_CODE_SIGNATURE 的所有 Mach-O 加载命令 解析代码签名命令的方式与codesign 工具相同。它在 opensource.apple.com 上开源。 解析权利 plist-data。 提取 aps-environment 值。

这与在二进制文件上运行命令codesign -d --entitlements :- 基本相同。

【讨论】:

以上是关于如何确定 iOS 应用程序是使用开发证书还是分发证书签名的?的主要内容,如果未能解决你的问题,请参考以下文章

如何保护 iOS p12 分发证书?

如何下载私钥证书分发 iOS?

如何分发具有开发临时性的 ios 应用程序

如何使用 Firebase 分发 iOS 应用程序?

无法创建 IOS 分发证书 iTunes 连接

iOS 推送通知分发证书