重新签署IPA(iPhone)

Eri*_*rik 127 iphone build codesign ipa

我目前用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-上传/)

这可能是可能的.我面临的问题是它似乎没有嵌入移动配置文件,因为我使用我的普通版本(使用xcrun)可以使用codesign工具控制,或者是否可以使用xcrun重新签名?

我的辞职脚本我目前正在做

  • 解压缩app.ipa
  • appname = $(ls Payload)
  • xcrun -sdk iphoneos PackageApplication -s"$ provisioning_profile""$ project_dir/Payload/$ appname"-o"$ project_dir/app-resigned.ipa"--sign"$ provisioning_profile"--embed"$ mobileprovision"

我查看了生成的ipa文件,它似乎与原始应用程序非常相似.这里应该改变哪些文件?我最初认为_CodeSignature/CodeResources会改变,但内容看起来几乎完全一样.

指针非常感谢.

Eri*_*rik 210

终于搞定了!

使用cert1签署的IPA进行测试,用于提交应用商店,但未在配置文件中添加任何设备.使用企业帐户和内部部署的移动配置配置文件签署的新IPA中的结果(移动配置配置文件嵌入到IPA中).

解:

解压缩IPA

unzip Application.ipa
Run Code Online (Sandbox Code Playgroud)

删除旧的CodeSignature

rm -r "Payload/Application.app/_CodeSignature" "Payload/Application.app/CodeResources" 2> /dev/null | true
Run Code Online (Sandbox Code Playgroud)

替换嵌入式移动配置文件

cp "MyEnterprise.mobileprovision" "Payload/Application.app/embedded.mobileprovision"
Run Code Online (Sandbox Code Playgroud)

辞职

/usr/bin/codesign -f -s "iPhone Distribution: Certificate Name" --resource-rules "Payload/Application.app/ResourceRules.plist" "Payload/Application.app"
Run Code Online (Sandbox Code Playgroud)

重新包装

zip -qr "Application.resigned.ipa" Payload
Run Code Online (Sandbox Code Playgroud)

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

  • 在Yosemite上代码签名失败 - 警告: - Mac OS X中已弃用--resource-rules> = 10.10!Payload/Aaa.app/ResourceRules.plist:无法读取资源 (11认同)
  • @ValerioSantinelli您需要从先前的代码签名中继承权利.如果没有权利,FWIW推送通知将无法运行.解压后:`/ usr/bin/codesign -d --entitlements:entitlements.plist/Payload/appname.app`然后在辞职期间添加`--entitlements entitlements.plist` (7认同)
  • 导致我们问题的一件事是Entitlements文件,如果你有一个,必须与Apple提供的app id匹配.由于我们正在更改捆绑包ID,因此权利不匹配.该应用程序将运行,但每次运行后钥匙串将清除. (6认同)
  • 根据http://oleb.net/blog/2011/06/code-signing-changes-in-xcode-4/,应用程序ID内置于二进制文件中,因此您只能使用相同的应用程序ID进行重新签名.我知道我无法使用其他应用ID辞职. (5认同)
  • 警告:在Mac OS X中,不推荐使用--resource-rules> = 10.10!Payload/Application.app/ResourceRules.plist:无法读取资源.得到这个错误? (4认同)
  • 嗨@Erik,我创建了一个基于这个解决方案的宝石,以方便.ipa文件重新签名的过程...可能你可以检查出来,欢呼https://github.com/felipesabino/provise/ (2认同)

gre*_*rez 38

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

-----如何重新启动iOS应用程序-----

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

准备新的签名资产

第一步是获得Provisioning Profile,其中包括您要安装和运行的所有设备.确保配置文件包含您已在Keychain Access中安装的证书(例如iPhone Developer:Some Body(XXXXXXXXXX)).下载配置文件(MyProfile.mobileprovision),以便您可以替换应用程序中嵌入的配置文件.

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

$ security cms -D -i path/to/MyProfile.mobileprovision > provision.plist
Run Code Online (Sandbox Code Playgroud)

这将创建一个描述您的Provisioning Profile的xml文件.接下来,我们要将权利提取到文件中.

$ /usr/libexec/PlistBuddy -x -c 'Print :Entitlements' provision.plist > entitlements.plist
Run Code Online (Sandbox Code Playgroud)

替换配置文件和辞职应用程序

如果您正在使用.ipa文件,请首先解压缩应用程序(如果您有.app,则可以跳过此步骤).

$ unzip MyApp.ipa
Run Code Online (Sandbox Code Playgroud)

您的工作目录现在将包含Payload/Payload/MyApp.app/.接下来,删除旧的代码签名文件.

$ rm -rf Payload/MyApp.app/_CodeSignature
Run Code Online (Sandbox Code Playgroud)

用您自己的配置文件替换现有的配置文件(即embedded.mobileprovision).

$ cp path/to/MyProfile.mobileprovision Payload/MyApp.app/embedded.mobileprovision
Run Code Online (Sandbox Code Playgroud)

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

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

重要提示:您还必须重新签署应用程序中包含的所有框架.你会发现这些Payload/MyApp.app/Frameworks.如果应用程序是用Swift编写的,或者它包含任何其他框架,则必须重新签名,否则应用程序将安装但不会运行.

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

您现在可以重新压缩该应用程序.

$ zip -qr MyApp-resigned.ipa Payload
Run Code Online (Sandbox Code Playgroud)

完成

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

  • 2023 年有什么变化吗?我正在尝试完全相同的步骤,但安装后,iPhone 说“无法安装此应用程序,因为无法验证其完整性”。我做错了什么吗?@InnisBrendan 任何意见都会很好。 (2认同)

all*_*eus 11

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

  • 没有权利我的应用程序实际上开始工作很奇怪,在日志中给出这个:`SecItemCopyMatching:missing entitlement`.我没有单独的Entitlements.plist文件,所以为了保留我使用的权利[@ LordT的评论](http://stackoverflow.com/questions/11088460/keychain-integration-causing-crash-with-missing-entitlement-error -via-comma):首先创建一个权利文件:`echo"<?xml version = \"1.0 \"encoding = \"UTF-8 \"?>/usr/bin/codesign -d --entitlements - temp/Payload/$ APP_NAME | sed -E -e'1d'"> temp/newEntitlements`,然后在签名时使用它:`--entitlements temp/newEntitlements`. (2认同)

Mar*_*rný 11

我认为最简单的是使用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"
Run Code Online (Sandbox Code Playgroud)


Pan*_*ini 8

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
Run Code Online (Sandbox Code Playgroud)

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


Gar*_*kin 5

这些辞职方法对我来说都不起作用,所以我必须想出别的办法。

\n\n

就我而言,我的 IPA 证书已过期。我本可以重建该应用程序,但因为我们想确保分发完全相同的版本(仅使用新证书),所以我们不想重建它。

\n\n

我没有使用其他答案中提到的辞职方法,而是转向 Xcode\xe2\x80\x99s 创建 IPA 的方法,该方法以构建中的 .xcarchive 开头。

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

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

  4. \n
  5. 我将此应用程序移至新的 .xcarchive 下Products/Applications替换那里的应用程序。

  6. \n
  7. 我编辑过Info.plist,编辑

    \n\n
      \n
    • ApplicationProperties/ApplicationPath
    • \n
    • ApplicationProperties/CFBundleIdentifier
    • \n
    • ApplicationProperties/CFBundleShortVersionString
    • \n
    • ApplicationProperties/CFBundleVersion
    • \n
    • Name
    • \n
  8. \n
  9. 我将 .xcarchive 移动到 Xcode\xe2\x80\x99s 存档文件夹中,通常/Users/xxxx/Library/Developer/Xcode/Archives.

  10. \n
  11. 在 Xcode 中,我打开了 Organizer 窗口,选择了这个新存档并进行了常规(在本例中为 Enterprise)导出。

  12. \n
\n\n

结果是一款效果良好的 IPA。

\n


Sar*_*ith 5

经过Mac OS High Sierra和Xcode 10的检查

您可以使用iResign应用程序简单地实现相同的功能

给出1).ipa的路径

2)新的配置文件

3)授权文件(可选,仅在有授权的情况下添加)

4)捆绑ID

5)发行证明

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

简单而强大的工具