【问题标题】:The code signature version is no longer supported不再支持代码签名版本
【发布时间】:2021-09-28 16:47:48
【问题描述】:

使用旧 macOS 上提供的代码签名版本签名的应用(例如 Catalina (10.15))将无法在 iOS 15 上运行,因为您可以安装的最新版本是 Xcode 12.4。

Xcode 12.5 似乎改变了代码设计的行为。安装时会收到错误消息:

不再支持代码签名版本

有解决办法吗?

【问题讨论】:

    标签: ios xcode code-signing


    【解决方案1】:

    代码设计--generate-entitlement-der

    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 的引用。但是,信息似乎并不完全正确。

    【讨论】:

    • 这将我的应用程序放到了 iPhone (iOS 15) 上,但现在它说我所有的 cocoapods 都有无效的签名。有人有解决办法吗? .app/Frameworks/Alamofire.framework/Alamofire'(代码签名无效(errno=1)
    • 注释掉#use_frameworks!在工作的 podfile 中,然后将 pod 编译并签名,但这导致了我的工作区中的其他问题......似乎是时候购买支持最新 OSX 和 XCode 的新 Macbook......
    • @Bassebus 您将需要从下到上强制退出所有“signables”,如框架。由于这种废话,我尽可能避免登录Xcode并有一个直接处理签名的python脚本。
    • 漂亮!谢谢!
    • 只是添加一些细节以便更容易找到:选择您的应用程序(不是项目)目标、构建设置、全部(非基本)、签名、其他代码签名标志。将指定的标志添加到 Debug 和 Release。 Xcode 12.4 修复了我的问题!请注意,我已经将 iOS 15.1 设备支持文件夹(在此处提供 github.com/filsv/iPhoneOSDeviceSupport)添加到我的旧 Xcode 安装中。 MacOS Catalina 10.15.5
    【解决方案2】:

    您需要将--generate-entitlement-der 添加到构建设置下的OTHER_CODE_SIGN_FLAGS

    【讨论】:

    • 我的回答中已经说明了。
    • @CameronLowellPalmer 此选项不适用于嵌入式目标。带有 watchOS 的移动应用
    • 另外,知道如何传递同样的 Azure、Xcode 任务。
    • @Amit 那是因为项目设置不正确。
    【解决方案3】:
    • Xcode > 目标 > 常规
    • “嵌入式框架、库和嵌入式内容”部分
    • Embedded字段中的所有框架设置为“不嵌入”

    【讨论】:

      【解决方案4】:

      我想分享我的解决方案。这对我使用 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 命令:

        zip -ru myapp_resigned.ipa Payload

      7. 完成。您可以重新分发新的 IPA。

      【讨论】:

      • 证书名称应该类似于:iPhone Distribution: ()。不是从苹果开始?
      • 证书名称取决于您将如何分发捆绑包 (dev/adhoc/enterprise)。就我而言,它是临时的,所以我使用distribution 证书。
      • 您是否尝试重新签署调试 ipa?如果是这样,那么您可以像 Cameron 提到的那样在 xcode 中设置OTHER_CODE_SIGN_FLAGS
      • 签名通常比这更复杂。首先,作为预防措施,您需要清除所有协同设计工件,然后自下而上对“signables”进行签名。
      【解决方案5】:

      这里是@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的地方

      【讨论】:

      • +10!这是黄金!谢谢。
      【解决方案6】:

      只要我的两分钱。

      正如其他回复中所指出的,现在要在 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",
        
        
        

      【讨论】:

        【解决方案7】:

        在测试了所有解决方案后,只有一个对我有用。因为 XCode 在添加 Framework 时会自动添加签名签名,任何需要 Embed &amp; Sign 的 Framework 都应该删除,然后重新添加。 Xcode 会自动添加新的签名签名。

        1. 转到 YourTarget>框架、库和嵌入式内容。
        2. 删除所有Embed &amp; Sign 的框架,CocoaPods 除外。
        3. 再次添加已删除的框架并设置为Embed &amp; Sign
        4. 检查pods 框架设置在Do Not Embed

        现在清理并在您的设备上运行您的应用。

        【讨论】:

          【解决方案8】:

          我的问题是我使用的是自定义框架,当我将它嵌入到我的应用程序中时。它向我显示错误 不再支持代码签名版本。 我花了一整天的时间与它作斗争。最后通过添加用户定义的设置来解决它。在支持 arm 64 的新 Xcode 13 中 项目目标->构建设置->+号添加用户定义设置并添加设置。然后添加 VALID_ARCHS 作为字段,在此添加值 $(ARCHS_STANDARD)。它将自动将其转换为 arm64 arm 7。 更多参考请参见附件 图片。

          【讨论】:

            猜你喜欢
            • 2022-08-24
            • 2022-08-20
            • 2013-10-15
            • 1970-01-01
            • 2017-01-24
            • 2019-12-19
            • 1970-01-01
            • 2021-10-26
            • 1970-01-01
            相关资源
            最近更新 更多