144

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

我从不同的人那里收到了几个 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 会改变,但内容看起来几乎完全相同。

非常感谢指针。

4

13 回答 13

220

终于搞定了!

使用用 cert1 签名的 IPA 进行了测试,用于应用商店提交,没有在配置文件中添加任何设备。生成使用企业帐户和移动配置文件签署的新 IPA,用于内部部署(移动配置文件嵌入到 IPA)。

解决方案:

解压 IPA

unzip Application.ipa

删除旧的 CodeSignature

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

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

于 2011-08-03T04:36:57.477 回答
58

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

----- 如何退出 iOS 应用 -----

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

准备新的签名资产

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

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

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

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

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

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

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

$ unzip MyApp.ipa

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

$ rm -rf Payload/MyApp.app/_CodeSignature

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

$ 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-resigned.ipa)。您现在可以在配置文件中包含的任何设备上安装 MyApp-resigned.ipa。

于 2016-05-11T20:37:25.193 回答
13

我认为最简单的是使用 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"
于 2019-06-03T11:56:09.543 回答
11

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

于 2012-04-02T14:26:13.640 回答
6

使用 Mac OS High Sierra 和 Xcode 10 检查

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

给出 1).ipa 的路径

2) 新的配置文件

3) 授权文件(可选,有授权时才添加)

4)捆绑ID

5) 经销证书

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

简单而强大的工具

于 2018-07-17T10:32:28.347 回答
4

这些辞职方法都对我不起作用,所以我必须解决其他问题。

就我而言,我有一个带有过期证书的 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 中,我打开了 Organizer 窗口,选择了这个新存档并进行了常规(在本例中为 Enterprise)导出。

结果是一个很好的 IPA 有效。

于 2017-10-05T03:00:39.907 回答
3

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/

于 2020-09-25T16:35:08.020 回答
1

使用 Fastlane sigh 的辞职选项,您可以非常轻松地做到这一点。

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

您也可以在命令之前使用 sigh 下载配置文件。

于 2017-09-14T07:25:22.917 回答
1

我尝试了所有解决方案,但最后我能够使用这些命令创建 resign ipa

辞职证书

  • * 是 ipa 名称和应用程序名称 $PROVISION 是配置文件的路径 $CERTIFICATE 是密钥链全名中的证书名称(双击证书时的通用名称)
  1. 转到要使用辞职证书创建新 ipa 的目录。将所有文件粘贴到 ipa、证书和 mobileprovision 并安装证书

  2. security cms -D -i path/to/MyProfile.mobileprovision > provision.plist (调用此命令并将移动配置替换为文件路径)

  3. /usr/libexec/PlistBuddy -x -c 'Print :Entitlements' provision.plist > entitlements.plist(点击此命令)

  4. 解压 -q *.ipa

  5. rm -rf Payload/*.app/_CodeSignature/

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

7.  Set :CFBundleIdentifier “com.mycompany.newbundleidentifier” (This should be new bundle ID)
8.  save
9.  quit
  1. cp $PROVISION Payload/*.app/embedded.mobileprovision

  2. codesign -d --entitlements :entitlements.plist Payload/*.app/ (如果应用程序不起作用,请尝试忽略此命令,然后下次使用此命令)

  3. codesign -f -s "$CERTIFICATE" --entitlements entitlements.plist Payload/ .app/Frameworks/

  4. codesign -f -s "$CERTIFICATE" --entitlements entitlements.plist Payload/*.app/

  5. zip -qr resigned.ipa 有效负载

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

于 2020-08-31T17:11:39.593 回答
0

谢谢你,埃里克,张贴这个。这对我有用。我想添加一个关于我需要的额外步骤的注释。在“Payload/Application.app/”中有一个名为“ CACertChains ”的目录,其中包含一个名为“ cacert.pem ”的文件。我必须删除目录和 .pem 才能完成这些步骤。再次感谢!–

于 2014-11-26T18:19:56.577 回答
0

如果您的 APP 是使用 Flutter 工具构建的,请检查codesign所有 pod 扩展的信息:

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

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

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

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 {} 

最后不要忘记codesign自己Runner.app

于 2021-02-24T14:05:51.693 回答
0

您可以使用 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

谢谢

于 2021-03-24T07:53:14.210 回答
-1

如果您有一个带有扩展的应用程序和/或一个手表应用程序,并且每个扩展程序/手表应用程序都有多个配置文件,那么您应该使用此脚本重新签署 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 选项来包含其他扩展配置文件。

对我来说 - 所有配置文件都由相同的证书/签名身份签名。

于 2016-02-16T23:50:08.983 回答