【问题标题】:How to re-sign the ipa file?如何重新签署ipa文件?
【发布时间】:2011-07-06 20:40:09
【问题描述】:

在使用不同的配置文件生成如下 IPA 后,如何使用配置文件对 .ipa 文件进行签名?我想使用临时配置文件签署 IPA 以进行 beta 测试,然后使用应用商店的应用提交配置文件重新签署确切的 IPA。

/usr/bin/xcrun -sdk iphoneos PackageApplication -v "${RELEASE_BUILDDIR}/${APPLICATION_NAME}.app" -o "${BUILD_HISTORY_DIR}/${APPLICATION_NAME}.ipa" --sign "${DEVELOPER_NAME}" --embed "${PROVISONING_PROFILE}"

【问题讨论】:

标签: ios ios-provisioning ipa


【解决方案1】:

我一直在使用https://github.com/xndrs/XReSign,效果非常好。

【讨论】:

    【解决方案2】:

    从命令行很容易做到。我有一个这样做的脚本的要点。它现在已被合并到我每天使用的 https://github.com/RichardBronosky/ota-tools 中的 ipa_sign 脚本中。如果您对使用这些工具有任何疑问,请随时提出。

    它的核心是:

    CODESIGN_ALLOCATE=`xcrun --find codesign_allocate`; export CODESIGN_ALLOCATE
    IPA="/path/to/file.ipa"
    PROVISION="/path/to/file.mobileprovision"
    CERTIFICATE="Name of certificate: To sign with" # must be in keychain
    # unzip the ipa
    unzip -q "$IPA"
    # remove the signature
    rm -rf Payload/*.app/_CodeSignature
    # replace the provision
    cp "$PROVISION" Payload/*.app/embedded.mobileprovision
    # sign with the new certificate (--resource-rules has been deprecated OS X Yosemite (10.10), it can safely be removed)
    /usr/bin/codesign -f -s "$CERTIFICATE" Payload/*.app
    # zip it back up
    zip -qr resigned.ipa Payload
    

    您的新签名应用名为 resigned.ipa

    【讨论】:

    • 7 票赞成,没有一个问题。我想我的 bash 就是这么清楚。
    • @RahmathullahMPulikkal 我看到我错误地硬编码了要点中的路径。你真的应该使用github.com/RichardBronosky/ota-tools/blob/master/ipa_sign 而不是要点。这是维护的代码。
    • 您可能会收到关于 --resource-rules 参数的警告/错误,该参数已在 OS X Yosemite (10.10) 中弃用,只需删除此参数即可解决此问题。
    • 一点小提示:看起来CodeResources 现在位于_CodeSignature 文件夹的内部,因此您只需删除该文件夹即可。
    • 今天对我有用的方法:执行 security find-identity -v 以确定您的签名身份的 ID。调用 /usr/bin/codesign --force -s YOUR_IDENTITY -v Payload/*.app 来实际签署应用程序。
    【解决方案3】:
    1. 解压 .ipa 文件,将其扩展名更改为 .zip
    2. 转到有效负载。你会发现 .app 文件
    3. 右键单击 .app 文件,然后单击显示包内容
    4. 删除_CodeSigned文件夹
    5. 用新的配置文件替换 embedded.mobileprovision 文件
    6. 转到 KeyChain Access 并确保与临时配置文件关联的证书存在
    7. 执行下面提到的命令: /usr/bin/codesign -f -s "iPhone Distribution: Certificate Name" --resource-rules "Payload/Application.app/ResourceRules.plist" "Payload/Application.app"

    8. 现在再次压缩 Payload 文件夹并将 .zip 扩展名更改为 .ipa

    希望这有帮助。

    参考下面提到的链接: http://www.modelmetrics.com/tomgersic/codesign-re-signing-an-ipa-between-apple-accounts/

    【讨论】:

      【解决方案4】:

      我已经为我的 Sierra iMac 更新了 Bryan 的代码:

      # this version was tested OK vith macOs Sierra 10.12.5 (16F73) on oct 0th, 2017
      # original ipa file must be store in current working directory 
      
      IPA="ipa-filename.ipa"
      PROVISION="path-to.mobileprovision"
      CERTIFICATE="hexadecimal-certificate-identifier" # must be in keychain
      # identifier maybe retrieved by running: security find-identity -v -p codesigning
      
      # unzip the ipa
      unzip -q "$IPA"
      
      # remove the signature
      rm -rf Payload/*.app/_CodeSignature
      
      # replace the provision
      cp "$PROVISION" Payload/*.app/embedded.mobileprovision
      
      # generate entitlements for current app
      cd Payload/
      codesign -d --entitlements - *.app > entitlements.plist
      cd ..
      mv Payload/entitlements.plist entitlements.plist
      
      # sign with the new certificate and entitlements
      /usr/bin/codesign -f -s "$CERTIFICATE" '--entitlements' 'entitlements.plist'  Payload/*.app
      
      # zip it back up
      zip -qr resigned.ipa Payload
      

      【讨论】:

      • i git 出现以下错误 entitlements.plist:无法识别的 blob 类型(盲目接受)entitlements.plist:entitlement blob 中的长度无效
      • 你能分享你的授权文件内容吗?
      • 工作就像一个魅力!
      【解决方案5】:

      查看iResign 获取有关如何执行此操作的简单工具!

      [编辑] 经过一番摸索,我找到了一个解决钥匙串感知辞职的方法。你可以在https://gist.github.com/Weptun/5406993查看它

      【讨论】:

      • 是否有任何工具可以在辞职时更改显示名称以及 Bundle id?这将有助于为不同的环境使用不同的显示名称。如 App-Dev、App-QA、App-Stage 等。
      • 是的,floatsign.sh 就是这样做的。
      • 有效。简单而美丽。
      【解决方案6】:

      这里发布的答案对我来说都不太适用。他们主要跳过签署嵌入式框架(或包括权利)。

      这对我有用(假设当前目录中存在一个 ipa 文件):

      PROVISION="/path/to/file.mobileprovision"
      CERTIFICATE="Name of certificate: To sign with" # must be in the keychain
      
      unzip -q *.ipa
      rm -rf Payload/*.app/_CodeSignature/
      
      # Replace embedded provisioning profile
      cp "$PROVISION" Payload/*.app/embedded.mobileprovision
      
      # Extract entitlements from app
      codesign -d --entitlements :entitlements.plist Payload/*.app/
      
      # Re-sign embedded frameworks
      codesign -f -s "$CERTIFICATE" --entitlements entitlements.plist Payload/*.app/Frameworks/*
      
      # Re-sign the app (with entitlements)
      codesign -f -s "$CERTIFICATE" --entitlements entitlements.plist Payload/*.app/
      
      zip -qr resigned.ipa Payload
      
      # Cleanup
      rm entitlements.plist
      rm -r Payload/
      

      【讨论】:

      • 来自上述帖子的有用评论(丰富):stackoverflow.com/questions/5160863/…
      • 这是一个很好的下一步,但它缺少扩展签名。我在应用签名之前又添加了一行: codesign -f -s "$CERTIFICATE" --entitlements entitlements.plist Payload/*.app/Plugins/*
      • @Pat,如果 appexes 有不同的规定怎么办?
      • 我想您必须对每个扩展都有一个映射或关联的权利。可能是一个具有扩展名及其权利的文件夹,存储在外部,因此您可以对扩展名进行 for 循环并通过扩展名引用适当的权利。
      【解决方案7】:

      Fastlane 的 sigh 为 IPA 的辞职提供了相当强大的解决方案。

      来自他们的自述文件:

      辞职

      如果您生成了 ipa 文件,但想对 ipa 文件应用不同的代码签名,则可以使用 sigh resign

      fastlane sigh resign

      sigh 将为您找到 ipa 文件和配置文件(如果它们位于当前文件夹中)。

      您可以使用命令行传递更多信息:

      fastlane sigh resign ./path/app.ipa --signing_identity "iPhone Distribution: Felix Krause" -p "my.mobileprovision"

      它甚至可以处理 provisioning profiles for nested applications(例如,如果你有 watchkit 应用)

      【讨论】:

        【解决方案8】:

        有点老问题,但使用最新的 XCode,codesign 很简单:

        $ codesign -s my_certificate example.ipa 
        
        $ codesign -vv example.ipa
        example.ipa: valid on disk
        example.ipa: satisfies its Designated Requirement
        

        【讨论】:

        • @Pavel 这个问题在 iOS 6.x 是最新版本时得到了回答。从那时起,我们发布了两个主要版本,这显然改变了很多事情。您可能希望将搜索限制为针对当前技术的答案。
        • 它对我有用。您必须将“my_certificate”替换为密钥链中的密钥名称。
        • codesign 命令也用于@BrunoBronosky 响应。我不能直接在“*.ipa”文件上使用它,并且“-vv”选项总是在我知道它们已签名的文件上返回code object is not signed at all...
        【解决方案9】:

        试试这个应用 http://www.ketzler.de/2011/01/resign-an-iphone-app-insert-new-bundle-id-and-send-to-xcode-organizer-for-upload/

        它应该可以帮助您退出 IPA 文件。我自己尝试过,但无法通过 Entitlements.plist 传递错误。可能只是我的项目的问题。你应该试一试。

        【讨论】:

          猜你喜欢
          • 2011-10-17
          • 1970-01-01
          • 2022-08-04
          • 2016-12-28
          • 2017-04-17
          • 1970-01-01
          • 2014-02-27
          • 1970-01-01
          • 2013-02-23
          相关资源
          最近更新 更多