如何确定 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 代码中以编程方式获取该信息,但感谢您的提示!
在代码签名构建阶段,该值设置为development
或production
。这取决于代码签名证书和配置文件。
以下是在运行时读取应用权利的分步说明: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 应用程序是使用开发证书还是分发证书签名的?的主要内容,如果未能解决你的问题,请参考以下文章