web-dev-qa-db-ja.com

IPAの再署名(iPhone)

私は現在、xcodebuildに続いてxcrunを問題なく使用して、ハドソンですべてのアプリケーションをビルドしています

さまざまな人々から、企業アカウントではなく企業アカウント(アプリストア用、またはアドホック配布用)で再署名したいIPAファイルをいくつか受け取りました。

私の問題は、アプリを再署名しようとすると、デバイスにインストールされないことです(エンタープライズビルドなので、インストールする必要があります)。エラーメッセージはデバイス上にあり(iTunesにはありません)、アプリをインストールできなかったことを通知します。これ以上の情報は提供されません。

いくつかの情報を見つけました( http://www.ketzler.de/2011/01/resign-an-iphone-app-insert-new-bundle-id-and-send-to-xcode-オーガナイザー-for-upload /

そして、これは可能かもしれません。私が直面している問題は、通常のビルド(xcrunを使用)で行うようにモバイルプロビジョニングプロファイルが埋め込まれていないように見えることです。これは、codesignツールで制御できるか、xcrunで再署名できるかです。 ?

私の辞任スクリプトで私は現在やっています

  • app.ipaを解凍します
  • appname = $(lsペイロード)
  • 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が変更されると思っていましたが、コンテンツはほとんど同じに見えます。

ポインタは大歓迎です。

127
Erik

ついにこれが機能するようになりました!

プロビジョニングプロファイルにデバイスを追加せずに、アプリストア送信用に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

編集:資格部分を削除しました(路地のコメントを参照、ありがとう)

210
Erik

この質問に対する答えは少し古く、潜在的な重要な手順が欠落しているため、これは外部開発者からアプリをインストールするための更新されたガイドです。

----- iOSアプリの辞任方法-----

別の開発者からアプリ(MyApp.ipaなど)を受け取り、デバイスにインストールして実行できるようにしたいとします(たとえばideviceinstallerを使用して) 。

新しい署名アセットの準備

最初のステップは、インストールして実行するすべてのデバイスを含むProvisioning Profileを取得することです。 キーチェーンアクセスにインストールした証明書がプロファイルに含まれていることを確認します(例: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

完了

元のアプリ(MyApp.ipa)と辞任バージョン(MyApp-resigned.ipa)があるため、Payloadディレクトリを削除できます。これで、プロビジョニングプロファイルに含まれる任意のデバイスにMyApp-resigned.ipaをインストールできます。

36
grez

私はこの答えに成功しましたが、資格が変更されたので、最後から2番目のステートメントの--entitlements "Payload/Application.app/Entitlements.plist"部分を削除するだけで、魅力的に機能しました。

11
alleus

Mac OS High SierraおよびXcode 10で確認済み

アプリケーション iResign を使用して、同じものを簡単に実装できます。

1).ipaのパスを指定します

2)新しいプロビジョニングプロファイル

3)資格ファイル(オプション、資格がある場合のみ追加)

4)バンドルID

5)配布証明書

再署名後に保存された出力.ipaファイルを見ることができます

シンプルで強力なツール

5
Saranjith

これらの辞任アプローチはどれも私にとってはうまくいきませんでした。

私の場合、有効期限が切れた証明書を持つIPAがありました。アプリを再構築することはできましたが、まったく同じバージョンを(新しい証明書を使用して)確実に配布したかったため、再構築したくありませんでした。

他の回答に記載されている再署名の方法の代わりに、ビルドからの.xcarchiveで始まるIPAを作成するXcodeの方法に目を向けました。

  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でオーガナイザーウィンドウを開き、この新しいアーカイブを選択して、通常の(この場合はエンタープライズ)エクスポートを行いました。

その結果、良好なIPAが機能しました。

3
Gary Makin

Fastlaneため息の辞任オプションを使用すると、非常に簡単にこれを行うことができます。

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

コマンドの直前に、ため息を使用してプロファイルをダウンロードすることもできます。

1
Vineeth

これを投稿してくれてありがとう、Erik。これは私のために働いた。必要な追加手順についてメモを追加したいと思います。 「Payload/Application.app /」内には、「CACertChains」という名前のディレクトリがあり、「cacert.pem」という名前のファイルが含まれていました。これらの手順を完了するには、ディレクトリと.pemを削除する必要がありました。再度、感謝します! –

0
William Power

最も簡単なのは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"
0
Marián Černý