【发布时间】:2021-01-30 18:50:47
【问题描述】:
我的目标是执行类似于 How to get access to iOS Developer Certificate from code 的操作:验证我的库未在重新打包的 IPA 中使用。那里的答案建议解析embedded.mobileprovision 文件以查看有关证书和配置文件的信息。
在embedded.mobileprovision文件中,我可以找到一个很长的嵌入plist,我在里面看到的XML有两个相关字段:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>AppIDName</key>
…
<key>application-identifier</key>
<string>ABCDEFGHIJ.com.example.ObjCExample</string>
…
<key>UUID</key>
<string>00000000-0000-0000-0000-000000000000</string>
…
<key>Version</key>
<integer>1</integer>
</dict>
</plist>
(出于显而易见的原因,我将真正的 DEVELOPMENT_TEAM ID 替换为 ABCDEFGHIJ 并将 UUID 替换为零)。
在 DeveloperCertificates 键下还有一个长 <data> 条目的 list 数组,但我不知道如何使用这些数据。例如,我不知道我是否可以始终如一地选择这些证书之一。但我没有在这个文件中看到签名证书 ID,而且我没有可靠的程序来解析 embedded.mobileprovision 文件。
不过,这对于我的目的来说可能已经足够了,但我还有另一种更强大的方法。我可以解析我的二进制文件的mach_header,在Dave DeLong 之后的example 和Cédric Luthi 的基础上基于earlier answer。 LC_CODE_SIGNATURE 的格式似乎比 embedded.mobileprovision 文件的格式更好。
具体来说,EMBEDDED_ENTITLEMENTS blob (magic 0xfade7171) 包含一个简短的纯文本 plist:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>application-identifier</key>
<string>ABCDEFGHIJ.com.example.ObjCExample</string>
<key>com.apple.developer.team-identifier</key>
<string>ABCDEFGHIJ</string>
<key>get-task-allow</key>
<true/>
<key>keychain-access-groups</key>
<array>
<string>ABCDEFGHIJ.com.example.ObjCExample</string>
</array>
</dict>
</plist>
到目前为止一切都很好,但我不确定相同的 XML 将如何查找来自 AppStore 的应用程序。例如,有一个新的EMBEDDED_ENTITLEMENTS_DER blob (0xfade7172),它似乎在同一个 plist 上打洞,但采用二进制格式(是否有示例说明如何解析?)。
另外,我在REQUIREMENTS blob(魔术0xfade0c01)中看到签名证书 ID Apple Development: alexcohn@mycompany.com (KLMNOPQRST),并且通过遵循go package 的流程,我可以通过编程方式在我的可执行文件中找到此 ID。
哪个证书 ID 对我来说更可靠?
要求很简单:
- 此 ID 应在应用退出时更改,即使它没有为 App Store 退出。
- 此 ID 应存在于调试版本和发布版本中(它们可能是不同的 ID)。
- 此 ID 应稳定,即当开发人员重新构建应用程序、切换构建机器或将新设备添加到 adHoc 配置文件时,它不应更改。
- 这个 ID 应该很容易找到(就像签名证书在钥匙串应用中可见一样)。
【问题讨论】:
标签: ios provisioning-profile code-signing-certificate code-signing-entitlements