不再支持代码签名版本
The code signature version is no longer supported
使用较旧 macOS(如 Catalina (10.15))上提供的协同签名版本签名的应用不会 运行 iOS 15,因为您可以安装的最新版本是 Xcode 12.4.
Xcode 12.5 似乎改变了代码签名的行为。安装时收到错误消息:
The code signature version is no longer supported
有解决办法吗?
codesign --generate-entitlement-der
Apple 更改了代码签名,除了 plist 编码的权利外,还包括 DER 编码的权利。这个额外的 DER 编码权利部分在 iOS 15 中是必需的,并且在最新的 Xcode 中成为协同设计的默认行为。要在具有旧版本 Xcode 的旧机器上使用代码设计,请将 --generate-entitlement-der
标志添加到对代码设计的调用中。
如果通过 Xcode 签名,您可以将此标志添加到“构建设置”选项卡中的 OTHER_CODE_SIGN_FLAGS
设置。
如果在命令行进行代码签名:
CODESIGN_ALLOCATE=$( xcrun --find codesign_allocate ); export CODESIGN_ALLOCATE
xcrun codesign --generate-entitlement-der ...
此信息的来源是 Apple Forum thread 和 Matt Eaton 在 Apple DTS 中的回答。
在Xcode 12.5 Release Notes there is also a reference to the new signature format。不过,好像信息不完全正确。
我想分享我的解决方案。这对我使用 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 -ru myapp_resigned.ipa Payload
完成。您可以重新分发新的 IPA。
您需要将 --generate-entitlement-der
添加到构建设置下的 OTHER_CODE_SIGN_FLAGS
。
我的问题是我使用的是自定义框架,当我将它嵌入我的应用程序时。它向我显示错误
不再支持代码签名版本
我花了一整天的时间与之抗争。最后通过添加用户定义的设置解决了它。在支持 arm 64 的新 Xcode 13
Project target->Build Settings-> + sign to add user define setting 并添加一个设置。然后添加 VALID_ARCHS 作为在此添加值 $(ARCHS_STANDARD) 下的字段。它会自动将其转换为 arm64 arm 7。
请参阅随附的 图片以获取更多参考。
只是我的两分钱。
正如其他回复中所指出的,现在要在 Big Sur 之前在 MacOS 上使用 codesign
命令签署 ios 应用程序(与 ios 和 ipados 15 兼容)添加 --generate-entitlement-der
标志。我可以使用此 python 2.7(在 MacOS Mojave 10.14 和 MacOS Catalina 10.15 上都试过)代码段代码: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",
作为有关此问题的其他参考资料,您还可以阅读此 Apple documentation page and this Apple forum post。
- Xcode > 目标 > 一般
- “嵌入式框架、库和嵌入式内容”部分
- 将
Embedded
字段中的所有框架设置为“不嵌入”
测试所有解决方案后,只有一个对我有用。因为XCode添加Framework时会自动添加sign签名,任何需要Embed & Sign
的Framework都应该删除,然后重新添加。 Xcode 会自动添加新的签名。
- 转到 YourTarget> 框架、库和嵌入式内容。
- 删除所有
Embed & Sign
的框架,CocoaPods 除外。
- 再次添加删除的框架并设置为
Embed & Sign
。
- 检查
pods
框架设置 Do Not Embed
现在在您的设备上清理并运行您的应用程序。
以下是前往 的一些视觉指示。
我从
@WayneHenderson 在已接受答案下方的评论。
按照红色箭头步骤1 - 11(没有8,我弄错了,从7直接到9)。
最重要的是第4步,一定要selectAll
否则你就赢了'找不到 Other Code Signing Flags
选项。
对于第 5 步,只需在搜索容器中输入 Other Code Signing Flags
。
第 9 - 11 步是您输入 --generate-entitlement-der
的地方
有时,就像我的情况一样,只需清理构建文件夹即可解决:
要么去 Product -> Clean Build Folder
或使用 ⌘ + ⇧ + K
我花了 2 天时间才找到这个问题,最后我从 Lance Samaria 那里得到了解决方案。我愿意分享。
目标->构建设置->其他代码签名标志
将此代码 --generate-entitlement-der 添加到 Debug 和 Release
之后转到目标-> 常规-> 框架、库和嵌入式内容-> 更改为“不嵌入”
我还更新了配置文件和 IOS 分发证书。
现在清理构建文件夹和运行您的项目。
非常感谢 Lance Samaria
使用较旧 macOS(如 Catalina (10.15))上提供的协同签名版本签名的应用不会 运行 iOS 15,因为您可以安装的最新版本是 Xcode 12.4.
Xcode 12.5 似乎改变了代码签名的行为。安装时收到错误消息:
The code signature version is no longer supported
有解决办法吗?
codesign --generate-entitlement-der
Apple 更改了代码签名,除了 plist 编码的权利外,还包括 DER 编码的权利。这个额外的 DER 编码权利部分在 iOS 15 中是必需的,并且在最新的 Xcode 中成为协同设计的默认行为。要在具有旧版本 Xcode 的旧机器上使用代码设计,请将 --generate-entitlement-der
标志添加到对代码设计的调用中。
如果通过 Xcode 签名,您可以将此标志添加到“构建设置”选项卡中的 OTHER_CODE_SIGN_FLAGS
设置。
如果在命令行进行代码签名:
CODESIGN_ALLOCATE=$( xcrun --find codesign_allocate ); export CODESIGN_ALLOCATE
xcrun codesign --generate-entitlement-der ...
此信息的来源是 Apple Forum thread 和 Matt Eaton 在 Apple DTS 中的回答。
在Xcode 12.5 Release Notes there is also a reference to the new signature format。不过,好像信息不完全正确。
我想分享我的解决方案。这对我使用 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 -ru myapp_resigned.ipa Payload
完成。您可以重新分发新的 IPA。
您需要将 --generate-entitlement-der
添加到构建设置下的 OTHER_CODE_SIGN_FLAGS
。
我的问题是我使用的是自定义框架,当我将它嵌入我的应用程序时。它向我显示错误
不再支持代码签名版本
我花了一整天的时间与之抗争。最后通过添加用户定义的设置解决了它。在支持 arm 64 的新 Xcode 13
Project target->Build Settings-> + sign to add user define setting 并添加一个设置。然后添加 VALID_ARCHS 作为在此添加值 $(ARCHS_STANDARD) 下的字段。它会自动将其转换为 arm64 arm 7。
请参阅随附的
只是我的两分钱。
正如其他回复中所指出的,现在要在 Big Sur 之前在 MacOS 上使用 codesign
命令签署 ios 应用程序(与 ios 和 ipados 15 兼容)添加 --generate-entitlement-der
标志。我可以使用此 python 2.7(在 MacOS Mojave 10.14 和 MacOS Catalina 10.15 上都试过)代码段代码: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 存档后,您可以使用 Gemipa_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",
作为有关此问题的其他参考资料,您还可以阅读此 Apple documentation page and this Apple forum post。
- Xcode > 目标 > 一般
- “嵌入式框架、库和嵌入式内容”部分
- 将
Embedded
字段中的所有框架设置为“不嵌入”
测试所有解决方案后,只有一个对我有用。因为XCode添加Framework时会自动添加sign签名,任何需要Embed & Sign
的Framework都应该删除,然后重新添加。 Xcode 会自动添加新的签名。
- 转到 YourTarget> 框架、库和嵌入式内容。
- 删除所有
Embed & Sign
的框架,CocoaPods 除外。 - 再次添加删除的框架并设置为
Embed & Sign
。 - 检查
pods
框架设置Do Not Embed
现在在您的设备上清理并运行您的应用程序。
以下是前往
我从 @WayneHenderson 在已接受答案下方的评论。
按照红色箭头步骤1 - 11(没有8,我弄错了,从7直接到9)。
最重要的是第4步,一定要selectAll
否则你就赢了'找不到 Other Code Signing Flags
选项。
对于第 5 步,只需在搜索容器中输入 Other Code Signing Flags
。
第 9 - 11 步是您输入 --generate-entitlement-der
有时,就像我的情况一样,只需清理构建文件夹即可解决:
要么去 Product -> Clean Build Folder
或使用 ⌘ + ⇧ + K
我花了 2 天时间才找到这个问题,最后我从 Lance Samaria 那里得到了解决方案。我愿意分享。
目标->构建设置->其他代码签名标志 将此代码 --generate-entitlement-der 添加到 Debug 和 Release
之后转到目标-> 常规-> 框架、库和嵌入式内容-> 更改为“不嵌入”
我还更新了配置文件和 IOS 分发证书。
现在清理构建文件夹和运行您的项目。
非常感谢 Lance Samaria