J'ai essayé très très fort de créer une simple application iOS pouvant recevoir des notifications Push. Mon seul objectif est de mettre en place une procédure que certains membres de l’équipe peuvent utiliser et qui n’ont pas été en mesure de trouver une version à jour et fonctionnelle de ces instructions ailleurs sur le Web. Notre boutique est relativement nouvelle pour iOS dev, personnellement, je suis totalement inexpérimenté avec iOS dev et Xcode. Je suis tombé sur des dizaines de didacticiels, d'articles et de messages de problèmes de Apple et d'ailleurs, et je sens que je pourrais être presque là ...
Voici où je dois en venir (remarque: j'utilise Xcode 4.3 et j'essaie au départ de ne déployer que sur iOS 5.1, et je suppose que certaines choses ont peut-être changé récemment par rapport aux versions précédentes de Xcode, mais encore une fois, je suis novice dans tous les domaines. ceci - et le trouvant complètement déroutant et compliqué):
1) J'ai un profil de provisioning sur mon iPhone qui a la fonctionnalité Push activée
2) Dans mon projet de test Xcode, ce profil d'approvisionnement a été sélectionné comme identité de signature (dans Paramètres de construction> Signature du code).
3) L'identifiant de mon lot est répertorié sous Résumé et infos> Propriétés de la cible iOS personnalisée définies correctement * (je pense ??)
4) J'ai appelé registerForRemoteNotificationTypes dans le didFinishLaunchingWithOptions de mon délégué.
5) J'ai didRegisterForRemoteNotificationsWithDeviceToken et didFailToRegisterForRemoteNotificationsWithError enregistrés dans mon délégué, configurés pour consigner le jeton ou l'erreur de périphérique, respectivement.
6) J'ai coché Activer les droits sous Résumé.
7) Juste en dessous du fichier de droits sélectionné, se trouve Tinker6 (le nom de mon projet de test), qui a été généré automatiquement lorsque j'ai coché la case Activer les droits.
8) Dans le fichier Tinker6.entitlements, j’ai le texte suivant (ce que j’ai recueilli correspond à plusieurs publications sur le Web, mais je ne trouve rien de définitif dans Apple lui-même. sur):
Mise à jour
9) De plus, j'ai tout essayé sans fichier de droits et j'ai obtenu le même résultat.
10) Le contenu de mon fichier mobileprovision comprend les droits d'accès correctement (j'ai brouillé le numéro et le domaine, mais la structure reste identique):
<key>application-identifier</key>
<string>12355456A7.com.whatever.tinker</string>
<key>aps-environment</key>
<string>development</string>
<key>get-task-allow</key>
<true/>
<key>keychain-access-groups</key>
<array>
<string>12355456A7.*</string>
</array>
/ end update
Lorsque j'essaie de l'exécuter sur mon périphérique, l'erreur suivante s'affiche dans la sortie Xcode:
2012-06-11 12:45:23.762 Tinker6[13332:707] Failed to get token, error:
Error Domain=NSCocoaErrorDomain Code=3000 "no valid 'aps-environment'
entitlement string found for application" UserInfo=0x24a3b0
{NSLocalizedDescription=no valid 'aps-environment' entitlement string
found for application}
J'ai essayé de définir get-task-allow to NO, environnement-aps-production, les quatre combinaisons possibles, même chose.
Comment puis-je aller au-delà de cela? Où est la documentation définitive à ce sujet?
- un contexte supplémentaire suit -
* En ce qui concerne l'identifiant du bundle, je ne vois toujours pas comment cela devrait être défini par rapport aux identifiants d'application et aux identifiants de profil dans le profil de provisioning. Dans le portail de provisioning sous les ID de l'application, j'ai ceci (encore une fois, brouillé le numéro et le domaine):
Et l’identifiant du bundle à deux endroits est défini, j’ai ceci:
Je ne suis pas du tout sûr que ce soit correct ou si un ou les deux doivent être réglés sur 12355456A7.com.w Whatever.tinker, même si j'ai déjà essayé ceux-ci plus tôt dans le processus sans succès ...
Note Je me rends compte qu'il y a beaucoup de posts avec des titres similaires, mais ils semblent tous être périmés par les noms de fichiers et ainsi de suite, et le fait qu'aucune des solutions ne semble utile. J'espère que le niveau de détail que j'ai fourni justifiera une réponse de qualité. Je vais probablement attribuer une prime dès que possible et si vous donnez une réponse de haute qualité menant à une solution, je vous attribuerai la prime ainsi que je ferai la promotion de votre réponse via Twitter et mon blog. Surtout si vous postez un très bon message "voici les (500) étapes exactes pour obtenir une application de notification Push simple, y compris le provisioning et tout le reste" article sur votre blog ou autre chose.
La réponse était: recommencez, faites la même chose, mais créez un nouveau profil de provisioning et installez-le. Ça a marché. L'inspection de tous les détails (droits d'accès dans la fourniture de services mobiles) a l'air exactement identique à tout dans ma question ici. Mais maintenant ça marche. Apple: WAT?
Bien sûr, il aurait été évident de procéder ainsi if il était possible de supprimer des profils de provisioning. Mais comme ce n’est pas possible, je ne voulais pas encombrer notre équipe de profils de tests. Enfin, finalement perdu patience et essayé de toute façon, et ça a fini par fonctionner. Whatevs.
Si vous avez créé votre profil de provisioning avant de configurer le app ID
pour Push, essayez de régénérer le profil de provisioning.
portail d'approvisionnement iOS -> Approvisionnement -> Votre certificat -> EDITER -> Éditer -> Télécharger un nouvel approvisionnement
Travaillé pour moi Maintenant, je peux utiliser Push.
Tout d’abord, vous n’avez pas besoin du fichier de droits sauf si vous ajoutez des paires clé/valeur personnalisées qui n’existent pas dans le profil de provisioning. Lorsque votre application est créée, tous les droits du profil de provisioning sont copiés dans l'application.
Étant donné que vous voyez toujours un message d'erreur à propos des droits manquants, je ne peux que supposer que les options de signature de code ne sont pas correctes dans les paramètres de construction.
Vous devez vous assurer que le bon profil est sélectionné pour la configuration "Débogage" et que, par sécurité, vous avez sélectionné le bon profil pour le "Débogage" et pour le noeud enfant intitulé "N'importe quel SDK iOS":
Bien que cette capture d'écran montre le profil "Développeur automatique" sélectionné, choisissez le profil de provisionnement exact dans le menu déroulant, uniquement à des fins de test. Il se peut que Xcode choisisse automatiquement un profil différent de celui que vous souhaitez.
Veillez également à effectuer une construction propre, à supprimer complètement l'application de votre appareil, etc. Ceci est juste pour vous assurer que vous n'avez pas de vieilles peluches qui traînent.
Le moyen le plus simple est de le faire à partir de vos comptes avec Xcode:
Head over Xcode -> Préférences -> Choisir l'onglet Comptes -> Afficher les détails -> Appuyer sur le bouton d'actualisation en bas à gauche -> Terminé.
Construisez à nouveau et cela devrait fonctionner.
Ok, j'ai déjà fait face au problème. Étant donné que la notification push nécessite une implémentation côté serveur, recréer le profil n'était pas une option. J'ai donc trouvé cette solution SANS créer de nouveau profil d'approvisionnement.
Xcode ne sélectionne pas correctement le profil de provisioning correct, même si nous le sélectionnons correctement.
Tout d'abord aller à l'organisateur. Dans l'onglet Périphériques, dans la liste Profil d'approvisionnement de la bibliothèque, sélectionnez le profil que nous essayons d'utiliser. Faites un clic droit dessus puis "Révéler le profil dans le Finder".
Le profil correct sera sélectionné dans la fenêtre du Finder ouverte. Notez le nom.
Maintenant, allez dans Xcode> Log Navigator. Sélectionnez le filtre pour "Tous" et "Tous les messages". Maintenant, dans la dernière phase (Build Target), recherchez l'étape appelée "ProcessProductPackaging" et développez-la. Notez le nom du profil d'approvisionnement. Ils ne doivent pas correspondre si vous rencontrez l'erreur.
Désormais, dans la fenêtre Opened Finder, supprimez le profil de provisioning non autorisé utilisé par Xcode. Maintenant, reconstruisez. L'erreur devrait être résolue. Si ce n'est pas le cas, répétez le processus pour trouver un autre profil non autorisé afin de le supprimer.
J'espère que cela t'aides.
Supprimez l'ancien profil d'approvisionnement de XCode dans Organizer.
Générez ensuite un nouveau profil de provisioning pour le même ID d'ensemble dans le portail de provisioning iOS (après avoir activé Push).
Importez le nouveau profil d'approvisionnement dans XCode, définissez-le dans les paramètres de construction de votre application.
Construire, courir, ça marche.
Je viens de le faire.
Cela m'a pris 10 minutes d'erreur à succès.
XCode 6.1.1 et plusieurs comptes de développeur Apple
Autre réponse à ce mélange déjà assez complet: j’ai rencontré ce problème à nouveau aujourd’hui, et cette fois-ci, c’est parce que j’avais plusieurs comptes Apple. J'avais d'abord besoin d'ajouter le deuxième compte développeur dans XCode> Préférences> Comptes> +
Ensuite, je devais activer explicitement l'achat intégré dans l'application (je n'avais pas besoin de le faire auparavant). XCode> (la fenêtre de l'application)> Cibles> Fonctionnalités> Achat intégré à l'application activée (et à ce stade, j'ai eu la possibilité de choisir le bon certificat)
Notez que j'avais déjà ajouté le certificat activé par Push en double-cliquant dessus dans le Finder.
(Xcode 5) Après une heure, j'ai résolu mon problème. Même si vous générez à nouveau le fichier de provisioning dans Xcode 5, vous devez mettre à jour votre compte manuellement. J'ai seulement modifié le fichier de provisioning dans l'onglet Organiseur qui ne fonctionnait pas, Xcode conservait la construction avec l'ancien fichier de provisioning.
Alors allez à
Xcode> Préférences> Comptes> Afficher les détails (sélectionnez votre compte)
Ensuite, actualisez vos fichiers de provisioning.
Mon problème était simplement que je signais avec le profil de provisioning générique géré par Xcode.
Après avoir créé un profil spécifique à l'application (et l'avoir téléchargé, double-cliqué dessus et assuré que mes paramètres de construction s'y rapportent), j'ai correctement reçu un jeton de périphérique APNS.
J'ai eu le même problème était tout le monde et essayé tous les trucs ci-dessus, rien n'a fonctionné. J'ai même supprimé et commencé à neuf avec un compte de développeur différent.
Ce qui a fonctionné pour moi à la fin a été
Je ne sais pas si vous pouvez l'activer pour une application générique, mais après avoir essayé au moins 12 suggestions différentes et perdu quelques jours, j'espère que cela aidera quelqu'un
Vous mentionnez un profil d'approvisionnement, mais je ne vois aucune mention d'un profil Push Apple.
Pour utiliser Push, vous devez avoir un profil Push (il y en a deux, un pour le développement et un pour la publication). Une fois que vous l'avez créé, vous devez vous assurer qu'il contient les certificats appropriés (voir la section ÉDITER ci-dessous).
C'est un excellent tutoriel qui vous guidera à travers toutes les étapes:
http://www.raywenderlich.com/3443/Apple-Push-notification-services-tutorial-part-12
Il faudrait des heures et des heures à moi-même ou à qui que ce soit d'autre pour écrire une réponse détaillée et détaillée comme ce tutoriel. Je ne vais donc pas tenter de le réclamer, ni réclamer la prime lorsque ce tutoriel existe déjà.
P.S. Je crois que vous n’avez plus besoin de droits, c’est un héritage.
EDIT: Vous devriez également vérifier que vous avez les profils nécessaires sur le périphérique - allez dans les paramètres, puis général, profils, vérifiez que vos profils sont listés, en particulier le profil Push bien sûr. Vous pouvez également vérifier cela depuis la section Organiseur de XCode. Dans Organizer, deux sections indiquent les profils de provision - une en haut à gauche dans la bibliothèque (il s'agit des profils dans XCode que vous utilisez pour signer, etc.). Vous verrez également une section appeler Profils de provisioning pour le périphérique connecté. est le profil installé sur le combiné. Si vous ne les avez pas installés sur le combiné, vous pouvez les télécharger à partir du site Web du portail d'approvisionnement, puis cliquez sur le bouton Ajouter en bas de la fenêtre Organiseur.
Dans le portail d'approvisionnement, vous devez également vérifier que le profil Apple comprend les certificats: - cliquez sur Approvisionnement dans le menu de gauche - vous verrez une liste de votre profil, puis sélectionnez MODIFIER le Apple Profil Push - vous verrez une section de certificats, avec une liste de développeurs ou de testeurs, etc., dans votre projet, assurez-vous que la case à cocher correspondante est cochée. - vous verrez également une section de périphériques, assurez-vous que le périphérique que vous testez a bien été ajouté.
Si vous avez d'anciens profils dans XCode ou sur le périphérique, supprimez-les et téléchargez/actualisez/installez tous les nouveaux profils à partir du portail d'approvisionnement.
Couru dans ce même problème moi-même. Pour moi, le problème était que mon nom de produit ($ TARGET_NAME) n’était pas capitalisé de la même manière que celle présentée dans le certificat fourni par Apple. Par exemple, j'avais com.companyid.APNDemo alors que le certificat Apple utilisait com.companyid.apndemo.
J'ai changé ma cible pour être en minuscule et cela a fonctionné. Remarque: L'indice pour moi était que le paramètre de signature de code dans les paramètres de construction était défini sur mon certificat de développeur par défaut. pas le profil d'approvisionnement APNTest.
Vous devez vous assurer que vous avez bien dans vos profils de provisionnement ( https://developer.Apple.com/account/ios/profile/ ) un profil de distribution iOS.
Lorsque vous téléchargez de xCode vers l'App Store, assurez-vous que l'environnement aps figure dans les droits. Sinon, téléchargez-les à partir de Voir les comptes -> Voir les détails -> Tout télécharger.
Bon nombre des réponses ci-dessus sont correctes. Cependant, il semble y avoir plus d’une erreur possible quand on traite de cela.
Celui que j'avais était un problème de capitalisation avec mon identifiant d'application. Mon identifiant d'application pour une raison quelconque n'a pas été mis en majuscule, mais mon application l'était. Une fois que j'ai recréé l'ID de l'application avec la casse correcte, tout s'est bien déroulé. J'espère que cela t'aides. Frustrant comme l'enfer cependant.
P.S. si cela ne fonctionne toujours pas, essayez de modifier manuellement le champ d'identité de signature de code avec "modifier". Modifiez la deuxième ligne avec le nom du nom de profil d'approvisionnement approprié.
recréer des fichiers provisoires a résolu tous mes problèmes.
Cette erreur peut se produire lorsque votre certificat a expiré.
La solution consiste à renouveler le certificat et à signer l'application avec ce dernier.
Cela m'a pris des heures pour le résoudre. Étant donné que quelqu'un utilise des scripts personnalisés pour signer et créer des packages alors que d'autres utilisent xcode lui-même, il n'y a qu'un seul moyen de vérifier ce qui se termine dans votre application. Dump vous droits avec
codesign --display --entitlements :- path/to/MyApp.app
et vérifiez aps-environment
et application-identifier
.
J'ai eu un problème similaire. Je rebondis entre les codes XCode 7 et 8 pour diverses raisons. Une fois que vous avez utilisé 8 pour construire, vous devrez en utiliser 8. J'ai simplement utilisé Xcode 8 et appliqué certaines des modifications suggérées ci-dessus et cela a fonctionné.
Avant de supprimer et de régénérer des AppID/profils, assurez-vous que les mêmes profils (et les bons) sont installés sur votre bibliothèque et votre périphérique.
J'ai commencé à voir cette erreur après avoir migré vers un nouvel ordinateur. Push fonctionnait correctement avant la migration.
Le problème était (duh) que je n'avais pas importé les profils dans la bibliothèque Xcode sur la nouvelle machine (dans Organizer/Devices sous Library-> Provisioning Profiles).
La partie déroutante était que le PÉRIPHÉRIQUE avait déjà les bons profils et qu'ils se présentaient comme prévu dans les paramètres de construction, donc tout semblait correct, mais la XCode LIBRARY ne les avait pas, alors il signait l'application avec ... ?? ?
Il semble y avoir quelque chose de bizarre avec les droits "automatiques" dans Xcode 4.6.
Il existe un fichier Entitlement.plist pour chaque SDK à l'adresse suivante:
/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS6.1.sdk/Entitlements.plist
Une solution de contournement que j'ai trouvée consistait à éditer ce fichier et à ajouter manuellement la clé sournoise aps-environment, comme ceci:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.Apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>application-identifier</key>
<string>$(AppIdentifierPrefix)$(CFBundleIdentifier)</string>
<key>aps-environment</key>
<string>development</string>
<key>keychain-access-groups</key>
<array>
<string>$(AppIdentifierPrefix)$(CFBundleIdentifier)</string>
</array>
</dict>
</plist>
Ensuite, Xcode génère le fichier Xcent correct, qui contient la clé aps-environment à:
/Users/mySelf/Library/Developer/Xcode/DerivedData/myApp-buauvgusocvjyjcwdtpewdzycfmc/Build/Intermediates/myApp.build/Debug-iphoneos/myApp.build/myApp.xcent
Vous pouvez localiser l'emplacement de création de votre fichier Xcent à l'aide de Log Navigator de Xcode.
cherchez "ProcessProductPackaging".
Malheureusement, c’est la seule façon pour moi de constater que corrige le problème .
(et enfin capable d’obtenir correctement le jeton Push maintenant)
Je me demande simplement si une autre solution plus élégante est disponible.
Veuillez consulter ma SO question pour plus de détails à ce sujet:
Le droit automatique Xcode 4.6 ne fonctionne pas - "pas d'environnement aps valide"
J'ai essayé toutes les réponses énumérées ici, mais personne n'a résolu mon problème. Dans mon cas, cette erreur est due à mon erreur stupide dans la création d'Appid. J'ai utilisé l'ID d'application générique au lieu d'utiliser l'ID d'application explicite a causé le problème
Si vous souhaitez qu'une application reçoive des notifications à distance (notifications Push), vous devez utiliser un ID d'application explicite , tel que com.tutsplus.Push au lieu de com.tutsplus. *
C'est ce qui a réglé le problème pour moi. (J'avais déjà essayé d'activer/de désactiver les fonctionnalités, de recréer le profil d'approvisionnement, etc.).
Dans l'onglet Configurer les paramètres , dans Droits de signature de code , mon .entitlements le fichier n'était pas un lien pour toutes les sections. Une fois que je l'ai ajouté à la section Any SDK , l'erreur a été résolue.