我目前用hudson使用xcodebuild构建我的所有应用程序,后跟xcrun没有任何问题
我收到了一些来自不同人的IPA文件,我想用企业帐户而不是公司帐户(对于应用程序商店,或有时是临时分发的)重新签名。
我的问题是,当我尝试重新签名应用程序时,它不会安装在我的设备上(它应该是企业版本)。错误消息在设备上(不在iTunes中),它只是告诉我它无法安装应用程序。没有提供更多信息。
这可能是可能的。我面临的问题是它似乎没有嵌入移动配置文件,因为我使用我的普通版本(使用xcrun)可以使用codesign工具控制,或者是否可以使用xcrun重新签名?
我的辞职脚本目前正在进行
我查看了生成的ipa文件,它似乎与原始应用程序非常相似。这里应该改变哪些文件?我最初认为_CodeSignature / CodeResources会改变,但内容看起来几乎完全一样。
非常感谢指针。
答案 0 :(得分:208)
终于搞定了!
使用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
编辑:删除了权利部分(参见小巷评论,谢谢)
答案 1 :(得分:34)
此问题的答案有点过时,并且缺少可能的关键步骤,因此这是从外部开发人员安装应用程序的更新指南。
-----如何重新启动iOS应用程序-----
假设您从其他开发人员那里收到了一个应用程序(例如MyApp.ipa),并且您希望能够在您的设备上安装并运行它(例如,使用 ideviceinstaller )。< / p>
准备新的签名资产
第一步是获得配置文件,其中包含您要安装和运行的所有设备。确保配置文件包含您在 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
现在使用您的配置文件中包含的证书和您之前创建的entitlements.plist对应用进行签名。
$ /usr/bin/codesign -f -s "iPhone Developer: Some Body (XXXXXXXXXX)" --entitlements entitlements.plist Payload/MyApp.app
重要提示:您还必须重新签署应用中包含的所有框架。您可以在Payload/MyApp.app/Frameworks
中找到这些内容。如果应用程序是用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)。您现在可以在配置文件中包含的任何设备上安装MyApp-resigned.ipa。
答案 2 :(得分:11)
我成功地遵循了这个答案,但由于权利已经改变,我只是删除了倒数第二句的--entitlements "Payload/Application.app/Entitlements.plist"
部分,它就像一个魅力。
答案 3 :(得分:4)
您可以使用应用程序iResign来实现相同的功能。
给出的路径 1).ipa
2)新的配置文件
3)权利文件(可选,仅在有权利时添加)
4)捆绑包ID
5)发行证书
您可以看到重新签名后保存的输出.ipa文件
简单而强大的工具
答案 4 :(得分:3)
这些辞职方法都不适合我,所以我不得不解决其他问题。
在我的情况下,我有一个过期证书的IPA。我本可以重建应用程序,但因为我们想确保我们分发完全相同的版本(仅使用新证书),我们不想重建它。
我没有采用其他答案中提到的辞职方式,而是采用了Xcode创建IPA的方法,该方法以构建中的.xcarchive开头。
我复制了现有的.xcarchive并开始替换内容。 (我忽略了.dSYM文件。)
我从旧的IPA文件中提取旧应用程序(通过解压缩;应用程序是Payload文件夹中唯一的内容)
我将此应用移动到新的.xcarchive中,在Products/Applications
下替换了那里的应用。
我编辑了Info.plist
,正在编辑
ApplicationProperties/ApplicationPath
ApplicationProperties/CFBundleIdentifier
ApplicationProperties/CFBundleShortVersionString
ApplicationProperties/CFBundleVersion
Name
我将.xcarchive移动到Xcode的存档文件夹中,通常是/Users/xxxx/Library/Developer/Xcode/Archives
。
在Xcode中,我打开了“管理器”窗口,选择了这个新档案,并定期(在本例中为“企业”)导出。
结果是有效的IPA。
答案 5 :(得分:1)
使用Fastlane叹气的辞职选项,你可以很容易地做到这一点。
sigh resign -p <path-to-profile-with-mobileprovision-ext> -i <code-sighning-identity-of-your-app>
您也可以在命令之前使用叹息下载配置文件。
答案 6 :(得分:1)
答案 7 :(得分:0)
感谢Erik发布此内容。这对我有用。我想添加一个关于我需要的额外步骤的说明。在“Payload / Application.app /”中,有一个名为“ CACertChains ”的目录,其中包含名为“ cacert.pem ”的文件。我不得不删除目录和.pem来完成这些步骤。再次感谢! -
答案 8 :(得分:0)
我认为最简单的方法是使用Fastlane:
sudo gem install fastlane -NV
hash -r # for bash
rehash # for zsh
fastlane sigh resign ./path/app.ipa --signing_identity "iPhone Distribution: Felix Krause" -p "my.mobileprovision"
答案 9 :(得分:0)
我尝试了所有解决方案,但最终我可以使用这些命令创建辞职ipa
辞职证书
转到要使用辞职证书创建新ipa的目录。将所有文件放在ipa,证书和 mobileprovision并安装证书
安全cms -D -i path / to / MyProfile.mobileprovision> Provision.plist(调用此命令,并用替换移动配置 文件的路径)
/ usr / libexec / PlistBuddy -x -c'Print:Entitlements'Provision.plist> entitlements.plist(单击此命令)
解压缩-q * .ipa
rm -rf有效载荷/ *。app / _CodeSignature /
/ 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
cp $ PROVISION有效载荷/ *。app / embedded.mobileprovision
codesign -d --entitlements:entitlements.plist有效负载/ *。app /((如果应用无法使用,请尝试忽略此命令,然后下次使用 该命令)
codesign -f -s“ $ CERTIFICATE”-权利entitlements.plist有效负载/.app/Frameworks /
codesign -f -s“ $ CERTIFICATE”-权利entitlements.plist有效负载/ *。app /
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
答案 10 :(得分:0)
如果您的 APP 是使用 Flutter 工具构建的,请检查所有 Pod 扩展的 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 {}
最后不要忘记codesign
Runner.app
本身
答案 11 :(得分:0)
您可以使用 XReSign 应用程序(一个简单的 GUI 工具)为您的 ipa 重新签名,我使用它为我的企业分发应用程序重新签名并且运行良好
https://github.com/xndrs/XReSign
你只需要
生成权利:
打开终端
$ security cms -D -i "your_path/Enterprise_Distribution.mobileprovision" > provision.plist
然后
$ /usr/libexec/PlistBuddy -x -c 'Print :Entitlements' provision.plist > entitlements.plist
谢谢
答案 12 :(得分:-1)
如果您的应用包含扩展程序和/或监视应用,并且每个扩展程序/监视应用程序都有多个配置文件,那么您应该使用此脚本重新签名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
您可以通过添加其他-p选项来添加其他扩展配置文件。
对我来说 - 所有配置文件都使用相同的证书/签名身份进行签名。