重新签署IPA(iPhone)

我目前使用xcodebuild和xcrun构build所有我的应用程序与哈德森没有任何问题

我收到了来自不同人的几个IPA文件,我想用企业帐户而不是公司帐户(对于应用程序商店,或者有时临时分发)重新签名。

我的问题是,当我尝试辞职的应用程序,它不会安装在我的设备(它应该,因为它是一个企业版本)。 错误信息在设备上(不在iTunes中),它告诉我,它不能安装应用程序。 没有更多的信息给出。

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

这可能是可能的。 我面临的问题是,它似乎没有embedded移动configurationconfiguration文件,因为我用我的正常版本(使用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会改变,但内容看起来几乎完全一样。

指针非常感谢。

终于得到了这个工作!

使用cert1签署的IPA进行testing,以提交configuration文件中未添加任何设备。 导致使用企业帐户签署的新IPA和内部部署的移动configuration文件(移动configuration文件embedded到IPA中)。

解:

解压IPA

unzip Application.ipa 

删除旧的CodeSignature

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

replaceembedded式移动设置configuration文件

 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 

编辑:删除权利的一部分(见胡同评论,谢谢)

这个问题的答案有点过时了,并且漏掉了潜在的关键步骤,所以这是一个从外部开发者安装应用程序的更新指南。

—–如何辞职一个iOS应用程序—–

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

准备新的签名资产

第一步是获得configuration文件 ,其中包含您希望安装和运行的所有设备。 确保configuration文件包含您在钥匙串访问中安装的证书(例如iPhone Developer:Some Body(XXXXXXXXXX))。 下载configuration文件(MyProfile.mobileprovision),以便您可以replace应用程序中embedded的configuration文件。

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

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

这将创build一个描述您的configuration文件的XML文件。 接下来,我们要将权利提取到一个文件中。

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

replace供应configuration文件并退出应用程序

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

 $ unzip MyApp.ipa 

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

 $ rm -rf Payload/MyApp.app/_CodeSignature 

用你自己的replace现有的configuration文件(即embedded.mobileprovision)。

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

现在使用您的供应configuration文件中包含的证书和您之前创build的entitlements.plist签署该应用程序。

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

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

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

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

 $ zip -qr MyApp-resigned.ipa Payload 

完成

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

我成功地遵循了这个答案,但是因为权利已经改变了,所以我简单地删除了--entitlements "Payload/Application.app/Entitlements.plist"第二个语句中的--entitlements "Payload/Application.app/Entitlements.plist"部分的--entitlements "Payload/Application.app/Entitlements.plist" ,它像一个魅力一样工作。

谢谢你,Erik,张贴这个。 这对我有效。 我想添加一个关于我需要的额外步骤的说明。 在“Payload / Application.app /”中有一个名为“ CACertChains ”的目录,其中包含一个名为“ cacert.pem ”的文件。 我不得不删除目录和.pem来完成这些步骤。 再次感谢! –

随着Fastlane叹息的辞职选项,你可以很容易地做到这一点。

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

您也可以在命令之前使用叹息来下载configuration文件。

这些辞职方式都没有为我工作,所以我不得不另外做一些工作。

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

在其他答案中提到的辞职方式,我转向了Xcode创buildIPA的方法,该方法从构build的.xcarchive开始。

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

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

  3. 我把这个应用程序移到了新的.xcarchive下,在Products/Applicationsreplace了那里的应用程序。

  4. 我编辑了Info.plist ,编辑

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

  6. 在Xcode中,我打开了组织者窗口,select了这个新的档案,并做了一个常规(在这种情况下,企业)出口。

结果是一个很好的IPA工作。

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

对于我来说 – 所有的configuration文件都是由相同的证书/签名标识签名的。