不再支持代码签名版本

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 分发进行了测试。

  1. 使用 XCode.

    照常构建、归档、导出 ipa
  2. 现在您有了 IPA 文件,然后将其重命名为 zip 扩展名。 (如有需要请备份)

  3. 提取它。应该有一个 Payload 文件夹。

  4. 打开终端,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 文件名。

  5. 出现了这个警告,我忽略了。

    Warning: default usage of --preserve-metadata implies "resource-rules" (deprecated in Mac OS X >= 10.10)!

  6. 然后运行 压缩命令:

    zip -ru myapp_resigned.ipa Payload

  7. 完成。您可以重新分发新的 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 会自动添加新的签名。

  1. 转到 YourTarget> 框架、库和嵌入式内容。
  2. 删除所有 Embed & Sign 的框架,CocoaPods 除外。
  3. 再次添加删除的框架并设置为Embed & Sign
  4. 检查 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