Re-signer IPA (iPhone)

129

Je construis actuellement toutes mes applications avec hudson en utilisant xcodebuild suivi d'un xcrun sans aucun problème

J'ai reçu quelques fichiers IPA de différentes personnes que je souhaite re-signer avec un compte d'entreprise au lieu du compte d'entreprise (pour l'App Store, ou parfois distribué ad hoc).

Mon problème est que lorsque j'essaie de résilier l'application, elle ne s'installe pas sur mon appareil (et cela devrait être le cas puisqu'il s'agit d'une version d'entreprise). Le message d'erreur est sur l'appareil (pas dans iTunes) et il me dit simplement qu'il n'a pas pu installer l'application. Aucune autre information n'est donnée.

J'ai trouvé des informations, ( http://www.ketzler.de/2011/01/resign-an-iphone-app-insert-new-bundle-id-and-send-to-xcode-organizer-for- télécharger / )

Et cela pourrait être possible. Le problème auquel je suis confronté est qu'il ne semble pas intégrer le profil de provisionnement mobile comme je le fais avec mes builds normaux (en utilisant xcrun) est-ce possible de contrôler avec l'outil de conception de codes, ou est-il possible de re-signer avec xcrun ?

Avec mon script de démission, je fais actuellement

  • décompressez 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"

J'ai regardé dans le fichier ipa résultant et il semble être très similaire à l'application d'origine. Quels fichiers devraient vraiment changer ici? J'ai d'abord pensé que le _CodeSignature / CodeResources changerait, mais le contenu est à peu près le même.

Les pointeurs sont très appréciés.

Erik
la source

Réponses:

212

Finalement, cela fonctionne!

Testé avec un IPA signé avec cert1 pour la soumission de l'App Store sans aucun appareil ajouté dans le profil d'approvisionnement. Résultats dans un nouvel IPA signé avec un compte d'entreprise et un profil de provisionnement mobile pour le déploiement en interne (le profil de provisionnement mobile est intégré à l'IPA).

Solution:

Décompressez l'IPA

unzip Application.ipa

Supprimer l'ancien CodeSignature

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

Remplacer le profil de provisionnement mobile intégré

cp "MyEnterprise.mobileprovision" "Payload/Application.app/embedded.mobileprovision"

Démissionner

/usr/bin/codesign -f -s "iPhone Distribution: Certificate Name" --resource-rules "Payload/Application.app/ResourceRules.plist" "Payload/Application.app"

Re-emballer

zip -qr "Application.resigned.ipa" Payload

Edit: Suppression de la partie droit (voir le commentaire des allées, merci)

Erik
la source
6
Une chose qui nous a causé des problèmes était le fichier de droits, si vous en avez un, doit correspondre à l'identifiant d'application fourni par Apple. Étant donné que nous modifions l'ID du bundle, les droits ne correspondaient pas. L'application s'exécuterait, mais le trousseau s'effacerait après chaque exécution.
tjg184
5
Selon oleb.net/blog/2011/06/code-signing-changes-in-xcode-4, l'ID d'application est intégré au binaire, vous ne pouvez donc démissionner qu'en utilisant le même ID d'application. Je sais que je n'ai pas pu démissionner avec un identifiant d'application différent.
Michael Baltaks
7
@ValerioSantinelli Vous devrez reporter les droits de la signature de code précédente. Les notifications push FWIW ne fonctionneront pas sans droits. Après la décompression: /usr/bin/codesign -d --entitlements :entitlements.plist /Payload/appname.apppuis lors de la démission de l'ajout--entitlements entitlements.plist
Peter
11
codesign échoue sur Yosemite - Attention: --resource-rules est obsolète sous Mac OS X> = 10.10! Payload / Aaa.app / ResourceRules.plist: impossible de lire les ressources
Jibeex
4
Attention: --resource-rules est obsolète sous Mac OS X> = 10.10! Payload / Application.app / ResourceRules.plist: impossible de lire les ressources. Vous obtenez cette erreur?
megha le
44

Les réponses à cette question sont un peu dépassées et manquent d'étapes potentiellement clés.Il s'agit donc d'un guide mis à jour pour installer une application d'un développeur externe.

----- Comment résilier une application iOS -----

Supposons que vous receviez une application (par exemple MyApp.ipa) d'un autre développeur, et que vous souhaitiez pouvoir l'installer et l'exécuter sur vos appareils (en utilisant ideviceinstaller , par exemple).

Préparer de nouveaux actifs de signature

La première étape consiste à obtenir un profil de provisionnement qui inclut tous les périphériques que vous souhaitez installer et exécuter. Assurez-vous que le profil contient un certificat que vous avez installé dans votre accès au trousseau (par exemple, iPhone Developer: Some Body (XXXXXXXXXX)). Téléchargez le profil (MyProfile.mobileprovision) afin de pouvoir remplacer le profil intégré dans l'application.

Ensuite, nous allons préparer un fichier de droits à inclure dans la signature. Ouvrez votre terminal et exécutez ce qui suit.

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

Cela créera un fichier xml décrivant votre profil d'approvisionnement . Ensuite, nous voulons extraire les droits dans un fichier.

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

Remplacer le profil de provisionnement et démissionner de l'application

Si vous travaillez avec un fichier .ipa , commencez par décompresser l'application (si vous avez plutôt un .app , vous pouvez ignorer cette étape).

$ unzip MyApp.ipa

Votre répertoire de travail contiendra désormais Payload/et Payload/MyApp.app/. Ensuite, supprimez les anciens fichiers de signature de code.

$ rm -rf Payload/MyApp.app/_CodeSignature

Remplacez le profil de provisionnement existant (c'est-à-dire embedded.mobileprovision) par le vôtre.

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

Maintenant, signez l'application avec le certificat inclus dans votre profil de provisioning et le droit d'accès.plist que vous avez créé précédemment.

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

IMPORTANT: vous devez également résilier tous les frameworks inclus dans l'application . Vous les trouverez dans Payload/MyApp.app/Frameworks. Si l'application est écrite en Swift ou si elle comprend des frameworks supplémentaires, ceux-ci doivent être résignés ou l'application s'installera mais ne s'exécutera pas.

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

Vous pouvez maintenant rezip de l'application.

$ zip -qr MyApp-resigned.ipa Payload

Terminé

Vous pouvez maintenant supprimer le Payloadrépertoire puisque vous avez votre application d'origine (MyApp.ipa) et votre version résignée (MyApp-resigned.ipa). Vous pouvez maintenant installer MyApp-resigned.ipa sur n'importe quel appareil inclus dans votre profil d'approvisionnement.

InnisBrendan
la source
Cette même approche s'appliquera-t-elle aux profils de distribution? IE: puis-je extraire les droits et re-signer à partir de ma distro.mobileprovision?
Chase Florell le
@grez Cela fonctionnera-t-il également pour la distribution des API?
LearneriOS
Je veux dire également la distribution des API d'applications `` d'entreprise '' @grez
LearneriOS
@LearneriOS Cela n'a pas fonctionné pour moi pour Enterprise IPA Distribution. J'utilise Sierra, Xcode 8, iOS 10. L'application s'installe via iTunes mais est ensuite supprimée immédiatement après l'installation.
Bryan Bryce
@PhoenixFF Je ne suis pas sûr d'installer avec iTunes, mais pouvez-vous essayer d'installer à partir de la ligne de commande comme ceci: $ ideviceinstaller -i myapp.ipa
InnisBrendan
11

J'ai suivi cette réponse avec succès, mais comme les droits ont changé, j'ai simplement supprimé la --entitlements "Payload/Application.app/Entitlements.plist"partie de l'avant-dernière déclaration, et cela a fonctionné comme un charme.

alleus
la source
Je seconde le commentaire précédent. Supprimez les droits pour que cela fonctionne avec la boîte à outils moderne.
Bruno Bronosky
2
Sans droits mon application a effectivement commencé à travailler bizarre, donnant ce journal en: SecItemCopyMatching: missing entitlement. Je n'ai pas le fichier Entitlements.plist séparé, afin de préserver les droits que j'ai utilisé @ commentaire de LordT : d' abord créer un fichier de droits: echo "<?xml version=\"1.0\" encoding=\"UTF-8\"?>/usr/bin/codesign -d --entitlements - temp/Payload/$APP_NAME | sed -E -e '1d'" > temp/newEntitlements, puis utilisez lors de la signature: --entitlements temp/newEntitlements.
Bulat
5

Vérifié avec Mac OS High Sierra et Xcode 10

Vous pouvez simplement implémenter la même chose en utilisant l'application iResign .

Donnez le chemin de 1) .ipa

2) Nouveau profil de provision

3) Fichier de droits (facultatif, ajoutez seulement si vous avez le droit)

4) Identifiant du bundle

5) Certificat de distribution

Vous pouvez voir le fichier .ipa de sortie enregistré après la reconnexion

Outil simple et puissant

Saranjith
la source
4

Aucune de ces approches démissionnaires ne fonctionnait pour moi, alors j'ai dû trouver autre chose.

Dans mon cas, j'avais un IPA avec un certificat expiré. J'aurais pu reconstruire l'application, mais comme nous voulions nous assurer que nous distribuions exactement la même version (juste avec un nouveau certificat), nous ne voulions pas la reconstruire.

Au lieu des moyens de démissionner mentionnés dans les autres réponses, je me suis tourné vers la méthode de Xcode de création d'un IPA, qui commence par un .xcarchive d'une build.

  1. J'ai dupliqué un .xcarchive existant et commencé à remplacer le contenu. (J'ai ignoré le fichier .dSYM.)

  2. J'ai extrait l'ancienne application de l'ancien fichier IPA (par décompression; l'application est la seule chose dans le dossier Payload)

  3. J'ai déplacé cette application dans la nouvelle .xcarchive, en Products/Applicationsremplaçant l'application qui s'y trouvait.

  4. J'ai édité Info.plist, édité

    • ApplicationProperties/ApplicationPath
    • ApplicationProperties/CFBundleIdentifier
    • ApplicationProperties/CFBundleShortVersionString
    • ApplicationProperties/CFBundleVersion
    • Name
  5. J'ai déplacé le .xcarchive dans le dossier d'archive de Xcode, généralement /Users/xxxx/Library/Developer/Xcode/Archives.

  6. Dans Xcode, j'ai ouvert la fenêtre de l'Organisateur, choisi cette nouvelle archive et effectué une exportation régulière (dans ce cas Enterprise).

Le résultat est un bon IPA qui fonctionne.

Gary Makin
la source
1
C'est une solution géniale qui fonctionne toujours depuis Xcode 9.2. Dans mon cas, je viens de copier l'ancien fichier .app sous le .xcarchive existant. Je n'ai pas changé Info.plist et donc la version de l'application est restée comme l'ancienne version mais a été signée avec le nouveau certificat d'entreprise.
dodgy_coder
3

Je pense que le plus simple est d'utiliser 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"
Marián Černý
la source
J'ai essayé de nombreuses façons mais pas de chance. Cette solution a fonctionné pour moi merci.
Omid Kia le
1

Avec l'option de démission de Fastlane soupir, vous pouvez le faire très facilement.

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

Vous pouvez également télécharger le profil en utilisant soupir, juste avant la commande.

Vineeth
la source
0

Merci, Erik, d'avoir publié ceci. Cela a fonctionné pour moi. J'aimerais ajouter une note sur une étape supplémentaire dont j'avais besoin. Dans "Payload / Application.app /", il y avait un répertoire nommé " CACertChains " qui contenait un fichier nommé " cacert.pem ". J'ai dû supprimer le répertoire et le .pem pour terminer ces étapes. Merci encore! -

William Power
la source
-1

Si vous avez une application avec des extensions et / ou une application de surveillance et que vous avez plusieurs profils d'approvisionnement pour chaque extension / application de surveillance, vous devez utiliser ce script pour signer à nouveau le fichier ipa.

Re-signature du script sur Github

Voici un exemple d'utilisation de ce script:

./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

Vous pouvez également inclure d'autres profils de provisionnement d'extensions en les ajoutant avec une autre option -p.

Pour moi, tous les profils d'approvisionnement ont été signés par le même certificat / identité de signature.

RPM
la source
Votre lien est cassé ... trouvez cette alternative en regardant le github de l'auteur. github.com/fastlane/fastlane/blob/…
jugutier
ceci est une ancienne réponse et devrait probablement être supprimée car elle ne fonctionne plus, mais il n'y a aucun moyen de la supprimer dans StackOverflow
RPM
1
Cela a fonctionné pour nous, il suffit de mettre à jour le lien vers ceci: github.com/fastlane/fastlane/blob/…
jugutier
ok bon de savoir que ça marche toujours. Je ne peux plus modifier la réponse d'origine, les gens devront donc lire les commentaires :)
RPM
Utilisez fastlane sigh resign YourApp.ipa --signing_identity "iPhone Distribution: YourCompanyOrDeveloperName" -p <path_to_provisioning_profile_for_app>.mobileprovision -p <path_to_provisioning_profile_for_watchkitextension>.mobileprovisionplutôt.
green0range