重新签署IPA(iPhone)

重新签署IPA(iPhone),iphone,build,codesign,ipa,Iphone,Build,Codesign,Ipa,我目前使用hudson使用xcodebuild构建所有应用程序,然后使用xcrun,没有任何问题 我从不同的人那里收到了几个IPA文件,我想用企业帐户而不是公司帐户(对于应用商店,有时是临时分发的)重新签名 我的问题是,当我尝试退出应用程序时,它不会安装在我的设备上(而且应该安装,因为它是企业版)。错误消息在设备上(不在iTunes中),它告诉我它无法安装应用程序。没有提供更多的信息 我找到了一些信息,() 这是可能的。我面临的问题是,它似乎没有像我在正常构建(使用xcrun)中那样嵌入移动资源

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

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

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

我找到了一些信息,()

这是可能的。我面临的问题是,它似乎没有像我在正常构建(使用xcrun)中那样嵌入移动资源调配配置文件。这是可以用代码设计工具控制的,还是可以用xcrun重新签名

用我的辞职脚本,我现在做

  • 解压app.ipa
  • appname=$(ls有效负载)
  • xcrun-sdk iphoneos软件包应用程序-s“$PROVITIONING\U profile”$project\U dir/Payload/$appname”-o“$project\U dir/app DEDICTION.ipa”--签署“$PROVITIONING\U profile”--嵌入“$mobileprovision”
我查看了生成的ipa文件,它似乎与原始应用非常相似。这里真正应该更改哪些文件?我最初以为_CodeSignature/CodeResources会改变,但内容看起来几乎完全一样


非常感谢指针。

终于可以使用了

使用与cert1签署的IPA进行测试,以提交应用商店,并且在配置配置文件中未添加任何设备。产生一个新的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

编辑:删除了授权部分(请参见alleys评论,谢谢)

我成功地遵循了这个答案,但由于授权发生了变化,我只是删除了从第二条到最后一条语句中的
--授权“Payload/Application.app/authorities.plist”
部分,效果非常好。

谢谢你,Erik,发了这篇文章。这对我有用。我想补充一下我需要的额外步骤。在“Payload/Application.app/”中有一个名为“CACertChains”的目录,其中包含一个名为“cacert.pem”的文件。我必须删除目录和.pem才能完成这些步骤。再次感谢

如果您有一个带有扩展名的应用程序和/或一个watch应用程序,并且每个扩展名/watch应用程序都有多个配置文件,那么您应该使用此脚本对ipa文件重新签名

以下是如何使用此脚本的示例:

./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
/dedict.sh YourApp.ipa“iPhone发行:YourCompanyOrDeveloperName”-p.mobileprovision-p.mobileprovision-p.mobileprovision-p.mobileprovision resignedYourApp.ipa
您还可以通过添加另一个-p选项来包括其他扩展配置文件


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

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

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

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

准备新的签名资产

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

接下来,我们将准备一份权利文件,包括在签名中。打开终端并运行以下操作

$ security cms -D -i path/to/MyProfile.mobileprovision > provision.plist
这将创建一个描述配置文件的xml文件。接下来,我们要将权利提取到一个文件中

$ /usr/libexec/PlistBuddy -x -c 'Print :Entitlements' provision.plist > entitlements.plist
更换配置文件并退出应用程序

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

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

$ rm -rf Payload/MyApp.app/_CodeSignature
用您自己的配置文件替换现有的配置文件(即embedded.mobileprovision)

$ cp path/to/MyProfile.mobileprovision Payload/MyApp.app/embedded.mobileprovision
重要提示:您还必须退出应用程序中包含的所有框架。您将在
有效负载/MyApp.app/Frameworks
中找到这些。如果应用程序是用Swift编写的,或者如果它包含任何其他框架,则必须放弃这些框架,否则应用程序将安装但不运行

$ /usr/bin/codesign -f -s "iPhone Developer: Some Body (XXXXXXXXXX)" --entitlements entitlements.plist Payload/MyApp.app/Frameworks/*
现在,使用您的资源调配配置文件中包含的证书和您先前创建的authorights.plist对应用程序进行签名

$ /usr/bin/codesign -f -s "iPhone Developer: Some Body (XXXXXXXXXX)" --entitlements entitlements.plist Payload/MyApp.app
您现在可以重新压缩应用程序

$ zip -qr MyApp-resigned.ipa Payload
完成


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

使用Fastlane Sign的dedict选项,您可以非常轻松地完成此操作

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

你也可以在命令发出之前使用sigh下载个人资料。

这些辞职方法都不适合我,所以我不得不做些别的事情

就我而言,我的IPA证书过期。我本来可以重新构建这个应用程序,但因为我们想确保我们正在分发
sigh resign -p <path-to-profile-with-mobileprovision-ext> -i <code-sighning-identity-of-your-app>
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"
7.  Set :CFBundleIdentifier “com.mycompany.newbundleidentifier” (This should be new bundle ID)
8.  save
9.  quit
$ 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
codesign -d --verbose=4 Runner.app/Frameworks/xxx.framework |& grep 'Authority='
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 {} 
$ security cms -D -i "your_path/Enterprise_Distribution.mobileprovision" > provision.plist
$ /usr/libexec/PlistBuddy -x -c 'Print :Entitlements' provision.plist > entitlements.plist