【发布时间】:2021-09-28 16:47:48
【问题描述】:
使用旧 macOS 上提供的代码签名版本签名的应用(例如 Catalina (10.15))将无法在 iOS 15 上运行,因为您可以安装的最新版本是 Xcode 12.4。
Xcode 12.5 似乎改变了代码设计的行为。安装时会收到错误消息:
不再支持代码签名版本
有解决办法吗?
【问题讨论】:
标签: ios xcode code-signing
使用旧 macOS 上提供的代码签名版本签名的应用(例如 Catalina (10.15))将无法在 iOS 15 上运行,因为您可以安装的最新版本是 Xcode 12.4。
Xcode 12.5 似乎改变了代码设计的行为。安装时会收到错误消息:
不再支持代码签名版本
有解决办法吗?
【问题讨论】:
标签: ios xcode code-signing
Apple 已更改协同设计签名,除了 plist 编码的权利外,还包括 DER 编码的权利。这个额外的 DER 编码权利部分在 iOS 15 中是必需的,并且成为最新 Xcode 中的默认代码设计行为。要在具有旧版本 Xcode 的旧机器上使用 codesign,请将 --generate-entitlement-der 标志添加到对 codesign 的调用中。
如果通过 Xcode 签名,您可以将此标志添加到 Build Settings 选项卡中的 OTHER_CODE_SIGN_FLAGS 设置中。
如果在命令行中进行代码签名:
CODESIGN_ALLOCATE=$( xcrun --find codesign_allocate ); export CODESIGN_ALLOCATE
xcrun codesign --generate-entitlement-der ...
此信息的来源是 Apple Forum thread 以及 Apple DTS 的 Matt Eaton 的回答。
在Xcode 12.5 Release Notes 中也有对new signature format 的引用。但是,信息似乎并不完全正确。
【讨论】:
Embedded字段中的所有框架设置为“不嵌入”【讨论】:
我想分享我的解决方案。这对我使用 XCode 12.3、macOS Catalina 有效,并使用 Adhoc 分发进行了测试。
像往常一样使用 XCode 构建、存档、导出 ipa。
现在您有了 IPA 文件,然后将其重命名为 zip 扩展名。 (如果需要,请进行备份)
提取它。应该有一个Payload 文件夹。
打开终端,cd到你的IPA目录,然后运行命令:
codesign -s "CERTIFICATE_NAME" -f --preserve-metadata --generate-entitlement-der ./Payload/YOUR_APP.app
CERTIFICATE_NAME 是您在钥匙串中的证书名称。它可能看起来像这样:Apple Distribution: XCompany (XXXXXX)
YOUR_APP 是您位于Payload 文件夹中的.app 文件名。
这个警告出现了,我忽略了它。
Warning: default usage of --preserve-metadata implies "resource-rules" (deprecated in Mac OS X >= 10.10)!
然后运行 zip 命令:
zip -ru myapp_resigned.ipa Payload
完成。您可以重新分发新的 IPA。
【讨论】:
distribution 证书。
OTHER_CODE_SIGN_FLAGS。
这里是@CameronLowellPalmer's answer 的一些视觉方向。
我得到了以下步骤 @WayneHenderson 在已接受答案下方的评论。
按照红色箭头步骤1-11(没有8,我弄错了,从7直接到9)。
最重要的是步骤4,请务必选择All,否则您将找不到Other Code Signing Flags选项。
对于步骤 5,只需在搜索容器中输入 Other Code Signing Flags。
步骤 9 - 11 是您输入--generate-entitlement-der的地方
【讨论】:
只要我的两分钱。
正如其他回复中所指出的,现在要在 Big Sur 之前在 MacOS 上使用 codesign 命令签署 ios 应用程序,请添加 --generate-entitlement-der 标志。我可以使用这个 python 2.7(在 MacOS Mojave 10.14 和 MacOS Catalina 10.15 上都试过)sn-p 代码用 Xcode 10.3 签署我的应用程序:
from fabric.api import local
local('cp %s "%s"' % ("/path/to/embedded.mobileprovision", app_full_path))
local('xattr -rc %s' % app_full_path)
local("codesign -f --generate-entitlement-der -vv -s \"%s\" --entitlements \"%s/Entitlements.plist\" %s" % (
env.code_sign_identity, app_full_path, app_full_path)
)
输出示例日志:
[localhost] local: cp /path/to/embedded.mobileprovision "/path/to/Payload/appname.app"
[localhost] local: xattr -rc /path/to/Payload/appname.app
[localhost] local: codesign -f --generate-entitlement-der -vv -s "iPhone Distribution: XXX S.p.A." --entitlements "/path/to/Payload/appname.app/Entitlements.plist" /path/to/Payload/appname.app
/path/to/Payload/appname.app: replacing existing signature
/path/to/Payload/appname.app: signed app bundle with Mach-O universal (armv7 arm64) [com.name.reverse.dns]
一些额外的提示...
MacOS 钥匙串应包含用于创建移动配置文件的 Apple 证书,该证书也用于分发我们正在签名的应用程序。使用命令security find-identity -p codesigning 进行检查:
$ security find-identity -p codesigning
Policy: Code Signing
Matching identities
1) AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA "iPhone Distribution: XXX S.p.A."
...
13) CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC "iPhone Developer: Name Surname (DDDDDDDDDD)"
13 identities found
Valid identities only
1) AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA "iPhone Distribution: XXX S.p.A."
...
13) CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC "iPhone Developer: Name Surname (DDDDDDDDDD)"
13 identities found
ipa zip 存档创建后,您可以使用 Gem ipa_analyzer (https://github.com/bitrise-io/ipa_analyzer) 验证应用是否正确签名:
$ zip -9 -y -r /path/to/appname.ipa /path/to/Payload
$ gem install ipa_analyzer --user-install
$ PATHAPP="/path/to/appname.ipa"
$ ~/.gem/ruby/2.6.0/bin/ipa_analyzer -i ${PATHAPP} -p --info-plist --prov | grep -E "ExpirationDate|CFBundleIdentifier|DER-Encoded-Profile"
"DER-Encoded-Profile": "#<StringIO:0x00000f0000000008>",
"ExpirationDate": "2022-09-18T12:15:25+00:00",
"CFBundleIdentifier": "com.name.reverse.dns",
【讨论】:
在测试了所有解决方案后,只有一个对我有用。因为 XCode 在添加 Framework 时会自动添加签名签名,任何需要 Embed & Sign 的 Framework 都应该删除,然后重新添加。 Xcode 会自动添加新的签名签名。
Embed & Sign 的框架,CocoaPods 除外。Embed & Sign。pods 框架设置在Do Not Embed
现在清理并在您的设备上运行您的应用。
【讨论】: