重新签署 IPA (iPhone)

目前,我使用 hudson 构建所有的应用程序,使用 xcodebuild,然后使用 xcrun,没有任何问题

我从不同的人那里收到了几个 IPA 文件,我想用企业账户而不是公司账户(应用程序商店,有时是特别分发的)重新签署。

我的问题是,当我试图退出这个应用程序时,它不会安装到我的设备上(它应该安装,因为它是一个企业版本)。错误消息在设备上(不在 iTunes 中) ,它简单地告诉我无法安装应用程序。没有提供更多的信息。

我找到了一些信息,(http://www.ketzler.de/2011/01/resign-an-iphone-app-insert-new-bundle-id-and-send-to-xcode-organizer-for-upload/)

这也许是可能的。我面临的问题是,它似乎没有嵌入移动供应配置文件,因为我做我的正常构建(使用 xcrun)这是可能的控制与协同设计工具,或有可能重新签署与 xcrun?

用我现在的辞职剧本

  • 解压应用程序
  • Appname = $(ls Payload)
  • Xcrun-sdk iphoneos PackageApplication-s“ $provision oning _ profile”“ $project _ dir/Payload/$appname”-o“ $project _ dir/app-辞职. ipa”——签名“ $provision oning _ profile”——嵌入“ $mobile provision”

我查看了最终的 ipa 文件,它似乎与最初的应用程序非常相似。什么文件真正应该在这里更改?我最初以为 _ CodeSignature/CodeResources 会改变,但是内容看起来几乎完全一样。

多谢指点。

132351 次浏览

终于成功了!

使用用 cert1签署的 IPA 进行测试,以便在没有添加设备的情况下提交应用程序商店配置文件。结果生成一个新的 IPA,其中包含一个企业帐户和一个用于内部部署的移动供应配置文件(移动供应配置文件嵌入到 IPA 中)。

解决方案:

拉开 IPA 的拉链

unzip Application.ipa

删除旧的代码签名

rm -r "Payload/Application.app/_CodeSignature" "Payload/Application.app/CodeResources" 2> /dev/null | true

替换嵌入式移动配置文件

cp "MyEnterprise.mobileprovision" "Payload/Application.app/embedded.mobileprovision"

重新签约

/usr/bin/codesign -f -s "iPhone Distribution: Certificate Name" --resource-rules "Payload/Application.app/ResourceRules.plist" "Payload/Application.app"

重新包装

zip -qr "Application.resigned.ipa" Payload

编辑: 删除权利部分(见巷子评论,谢谢)

我成功地遵循了这个答案,但是由于权利已经改变了,我只是删除了倒数第二个语句的 --entitlements "Payload/Application.app/Entitlements.plist"部分,它就像施了魔法一样工作。

如果你有一个带有扩展名和/或手表的应用程序,并且每个扩展名/手表应用程序都有多个配置文件,那么你应该使用这个脚本来重新签署 ipa 文件。

在 Github 重新签署脚本

下面是一个如何使用这个脚本的例子:

./resign.sh YourApp.ipa "iPhone Distribution: YourCompanyOrDeveloperName" -p <path_to_provisioning_profile_for_app>.mobileprovision -p <path_to_provisioning_profile_for_watchkitextension>.mobileprovision -p <path_to_provisioning_profile_for_watchkitapp>.mobileprovision -p <path_to_provisioning_profile_for_todayextension>.mobileprovision  resignedYourApp.ipa

您还可以通过添加另一个-p 选项来包含其他扩展配置文件。

对我来说,所有的供应配置文件都使用相同的证书/签名身份进行签名。

这个问题的答案有点过时,可能缺少关键步骤,所以这是一个从外部开发人员安装应用程序的更新指南。

- 如何辞去 iOS 应用程序 -

假设您从另一个开发人员那里收到了一个应用程序(例如 MyApp.ipa) ,您希望能够在您的设备上安装并运行它(例如,通过使用 视频安装程序)。

准备新的签约资产

第一步是获得一个 供应概况,其中包括您希望安装和运行的所有设备。确保配置文件包含您在 钥匙链访问中安装的证书(例如,iPhone Developer: Some Body (XXXXXXXXXX))。下载配置文件(MyProfile.mobile) ,这样您就可以替换嵌入在应用程序中的配置文件。

接下来,我们将准备一个权利文件以包含在签名中。打开您的终端并运行以下命令。

$ security cms -D -i path/to/MyProfile.mobileprovision > provision.plist

这将创建一个描述 供应概况的 xml 文件。

$ /usr/libexec/PlistBuddy -x -c 'Print :Entitlements' provision.plist > entitlements.plist

替换供应配置文件和退出应用程序

如果使用的是 。 ipa文件,首先解压应用程序(如果使用的是 。应用程序,则可以跳过此步骤)。

$ unzip MyApp.ipa

你的工作目录现在将包含 Payload/Payload/MyApp.app/。下一步,删除旧的代码签名文件。

$ rm -rf Payload/MyApp.app/_CodeSignature

用您自己的配置文件替换现有的配置文件(即嵌入式.mobile 配置文件)。

$ cp path/to/MyProfile.mobileprovision Payload/MyApp.app/embedded.mobileprovision

重要提示: 您还必须放弃应用程序 中包含的所有框架。你会在 Payload/MyApp.app/Frameworks中找到这些。如果应用程序是用 Swift 编写的,或者它包含任何额外的框架,这些框架必须辞职,否则应用程序将安装但不运行。

$ /usr/bin/codesign -f -s "iPhone Developer: Some Body (XXXXXXXXXX)" --entitlements entitlements.plist Payload/MyApp.app/Frameworks/*

现在,使用您的供应配置文件中包含的证书和您之前创建的 entitlements.plist 对应用程序进行签名。

$ /usr/bin/codesign -f -s "iPhone Developer: Some Body (XXXXXXXXXX)" --entitlements entitlements.plist Payload/MyApp.app

现在可以重新压缩应用程序。

$ zip -qr MyApp-resigned.ipa Payload

成交

现在,您可以删除 Payload目录,因为您已经有了原始应用程序(MyApp.ipa)和辞职版本(MyApp 辞职)。Ipa).你现在可以安装 MyApp 了。在配置文件中包含的任何设备上使用 IPA。

有了 Fastlane 叹气的辞职选项,你可以很容易地做到这一点。

sigh resign -p <path-to-profile-with-mobileprovision-ext> -i <code-sighning-identity-of-your-app>

您也可以在使用这个命令之前使用 sign 下载这个概要文件。

这些辞职的方法对我都不管用,所以我不得不另想办法。

就我而言,我的 IPA 证书过期了。我本来可以重新构建这个应用程序,但是因为我们想确保发布的是完全相同的版本(只是使用了一个新的证书) ,所以我们不想重新构建它。

我没有使用其他答案中提到的辞职方式,而是使用了 Xcode 创建 IPA 的方法,该方法以。构建中的 xcarchive。

  1. 我复制了一个现有的. xcarchive 并开始替换内容(我忽略了. dSYM 文件)

  2. 我从旧的 IPA 文件中提取了旧的应用程序(通过解压缩; 应用程序是 Payload 文件夹中唯一的东西)

  3. 我把这个应用程序移到了新的.xcarchive 中,用 Products/Applications替换原来的应用程序。

  4. 我编辑 Info.plist,编辑

    • ApplicationProperties/ApplicationPath
    • ApplicationProperties/CFBundleIdentifier
    • ApplicationProperties/CFBundleShortVersionString
    • ApplicationProperties/CFBundleVersion
    • Name
  5. 我将. xcarchive 移动到 Xcode 的归档文件夹中,通常是 /Users/xxxx/Library/Developer/Xcode/Archives

  6. 在 Xcode,我打开“组织者”窗口,选择这个新存档,并定期(在本例中是企业)导出。

其结果是一个很好的 IPA 工程。

检查 Mac OS High Sierra 和 Xcode 10

您可以简单地使用应用程序 我辞职实现相同的内容。

给路 1) ipa

2)新条文简介

3)权利文件(可选,只有当你有权利时才添加)

4) Bundle id

5)分发证书

您可以看到重新签名后保存的 output. ipa 文件

简单而强大的工具

我认为最简单的方法是使用 Fastlane:

sudo gem install fastlane -NV
hash -r # for bash
rehash # for zsh
fastlane sigh resign ./path/app.ipa --signing_identity "Apple Distribution: Company Name" -p "my.mobileprovision"

我尝试了所有的解决方案,但最终我能够用这些命令创建辞职 ipa

辞职证书

  • * 是 ipa 的名字,也是 app 的名字 $条款是条款配置文件的路径 $CERTIFICATE 是密钥链全名中的证书的名称(双击证书时的通用名称)
  1. 转到要创建带有辞职证书的新 ipa 的目录。将所有的文件传送到 IPA,证书和 并安装证书

  2. Security cms-D-i path/to/MyProfile.mobileprovision > provision. plist (调用此命令并将 mobile provision 替换为 文件的路径)

  3. /usr/libexec/PlistBuddy-x-c‘ Print: Entitments’provision ision.plist > Entitlements.plist (点击此命令)

  4. Unzip-q * . ipa

  5. Rm-rf Payload/* . app/_ CodeSignature/

  6. /usr/libexec/PlistBuddy Payload/* . app/Info.plist (在此命令之后,如果不需要更改 bundle,则必须添加新的 bundle ID 然后我们可以忽略这3个步骤)

7.  Set :CFBundleIdentifier “com.mycompany.newbundleidentifier” (This should be new bundle ID)
8.  save
9.  quit
  1. 有效载荷/* . app/嵌入式

  2. Codesign-d —— entiments: entitlements.plist Payload/* . app/(如果 app 不能工作,请忽略此命令,然后下次使用 命令)

  3. Codesign-f-s“ $CERTIFICATE”——应享权利

  4. Codesign-f-s“ $CERTIFICATE”——应享权利 entitlements.plist Payload/* . app/

  5. Zip-qr 辞职 ipa 有效载荷

Https://stackoverflow.com/a/37172815 Https://stackoverflow.com/a/50392448 Https://coderwall.com/p/qwqpnw/resign-ipa-with-new-cfbundleidentifier-and-certificate

2020年,我和 Fastlane 合作

下面是我使用的命令

$ fastlane run resign ipa:"/Users/my_user/path/to/app.ipa" signing_identity:"iPhone Distribution: MY Company (XXXXXXXX)" provisioning_profile:"/Users/my_user/path/to/profile.mobileprovision" bundle_id:com.company.new.bundle.name

完整的文件在这里 -https://docs.fastlane.tools/actions/resign/

如果您的应用程序是使用 Flutter 工具建立的,请检查所有吊舱扩展的 codesign信息:

codesign -d --verbose=4 Runner.app/Frameworks/xxx.framework |& grep 'Authority='

结果应该是您的团队的名称。

运行下面的 shell 脚本到 codesign所有扩展:

IDENTITY=<prefix of Team ID number>
ENTITLEMENTS=<entitlements.plist>
find Payload/Runner.app -type d -name '*framework' | xargs -I '{}' codesign -s $IDENTITY -f --entitlements $ENTITLEMENTS {}

最后,不要忘记 codesignRunner.app本身

您可以使用 XReSign 应用程序(一个简单的 GUI 工具)来重新签署您的 IPA,我用它来重新签署我的企业分发应用程序,它工作得很好

Https://github.com/xndrs/xresign

你只需要

  1. Ipa 辞职
  2. 移动设备
  3. 应享权利(产生应享权利请检查以下步骤)
  4. 企业分销证书企业分销证书

产生应享权利:

打开终端

$ security cms -D -i "your_path/Enterprise_Distribution.mobileprovision" > provision.plist

那么

$ /usr/libexec/PlistBuddy -x -c 'Print :Entitlements' provision.plist > entitlements.plist

谢谢