web-dev-qa-db-fra.com

Re-signer IPA (iPhone)

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 souhaiterais signer à nouveau avec un compte d'entreprise au lieu d'un compte d'entreprise (pour l'app store ou parfois distribué de manière ad hoc).

Mon problème est que lorsque j'essaie de démissionner de l'application, celle-ci ne s'installe pas sur mon appareil (et cela devrait être le cas, car 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- organisateur à 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 provisioning mobile comme je le fais avec mes versions normales (avec xcrun). C’est-il possible de contrôler avec l’outil Codesign, ou est-il possible de signer à nouveau avec xcrun ?

Avec mon script de démission je fais actuellement

  • décompressez app.ipa
  • appname = $ (charge utile ls)
  • xcrun -sdk iphoneos PackageApplication -s "$ provisioning_profile" "$ project_dir/Payload/$ appname" -o "$ project_dir/app-resigned.ipa" --sign "$ provisioning_profile" --embed "$ mobileprovision"

J'ai examiné le fichier ipa résultant et il semble être très similaire à l'application d'origine. Quels fichiers doivent vraiment changer ici? Au début, je pensais que le _CodeSignature/CodeResources changerait, mais le contenu est à peu près identique.

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

127
Erik

Enfin, cela fonctionne!

Testé avec un IPA signé avec cert1 pour la soumission de magasin d'applications sans ajout de périphériques dans le profil d'approvisionnement. Résultats: une nouvelle IPA signée avec un compte d'entreprise et un profil d'approvisionnement mobile pour un déploiement interne (le profil d'approvisionnement 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 d'approvisionnement 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 Entitlement (voir le commentaire des allées, merci)

210
Erik

Les réponses à cette question sont un peu obsolètes et manquent potentiellement d'étapes clés. Il s'agit donc d'un guide mis à jour pour l'installation d'une application à partir d'un développeur externe.

----- Comment démissionner d'une application iOS -----

Supposons que vous recevez une application (par exemple, MyApp.ipa) d'un autre développeur et que vous souhaitez 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 d'approvisionnement qui inclut tous les périphériques sur lesquels vous souhaitez installer et exécuter le programme. 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) pour pouvoir remplacer le profil intégré à l'application.

Nous allons ensuite 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 provisioning et quitter l'application

Si vous travaillez avec un fichier . Ipa , décompressez d'abord l'application (si vous avez un . App à la place, vous pouvez ignorer cette étape).

$ unzip MyApp.ipa

Votre répertoire de travail va maintenant contenir Payload/ et Payload/MyApp.app/. Ensuite, supprimez les anciens fichiers de signature de code.

$ rm -rf Payload/MyApp.app/_CodeSignature

Remplacez le profil de provisioning existant (par exemple, 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 avec le droit rightslement.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 démissionner de tous les cadres inclus dans l'application. Vous les trouverez dans Payload/MyApp.app/Frameworks. Si l'application est écrite dans Swift ou si elle inclut des cadres supplémentaires, ceux-ci doivent être résignés, sinon l'application sera installée mais ne sera pas exécutée.

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

Vous pouvez maintenant rezip l'application.

$ Zip -qr MyApp-resigned.ipa Payload

Fait

Vous pouvez maintenant supprimer le répertoire Payload puisque vous avez votre application d'origine (MyApp.ipa) et votre version démissionnée (MyApp-resigned.ipa). Vous pouvez maintenant installer MyApp-resigned.ipa sur n’importe quel périphérique inclus dans votre profil de provisioning.

36
grez

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

11
alleus

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

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

Donner le chemin de 1) .ipa

2) Nouveau profil de provision

3) Fichier de droits (facultatif, à ajouter uniquement si vous avez le droit)

4) Identifiant du paquet

5) certificat de distribution

Vous pouvez voir le fichier .ipa en sortie enregistré après la nouvelle signature

Outil simple et puissant

5
Saranjith

Aucune de ces approches démissionnaires ne fonctionnait pour moi, alors je devais trouver autre chose.

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

Au lieu des moyens de démission mentionnés dans les autres réponses, je me suis tourné vers la méthode de création d’une IPA de Xcode, qui commence par une .xcarchive à partir d’une compilation.

  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 (via la décompression; l'application est la seule chose dans le dossier Payload)

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

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

    • 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. Sous Xcode, j'ai ouvert la fenêtre de l'organiseur, choisi cette nouvelle archive et procédé à une exportation régulière (dans ce cas, Enterprise).

Le résultat était un bon IPA qui fonctionne.

3
Gary Makin

Avec l'option de démission de Fastlane sigh, 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.

1
Vineeth

Merci, Erik, d'avoir posté 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! -

0
William Power

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"
0
Marián Černý