web-dev-qa-db-fra.com

containerURLForSecurityApplicationGroupIdentifier renvoie nil sur le simulateur iOS

Le contexte

Avec iOS8 et ses extensions, Apple a introduit les conteneurs de groupe d'applications ( pour plus d'informations ici ).

Problème

Nous l'utilisons avec la méthode containerURLForSecurityApplicationGroupIdentifier: de NSFileManager. Cela fonctionne bien en production sur AppStore (avec iOS8 et iOS7). Le problème est que depuis que notre équipe a mis à jour Xcode 6.1 (6A1052d), la méthode renvoie nil sur les simulateurs. 

Nous avons beaucoup cherché mais nous n'avons pas réussi à trouver d'indices. Même cette question ou celle-ci ne sont pas applicables ici.

TLDR: Question

La méthode containerURLForSecurityApplicationGroupIdentifier: de NSFileManager fonctionne-t-elle sur vos simulateurs? Y at-il un moyen de résoudre ce problème?

21
Francescu

La méthode containerURLForSecurityApplicationGroupIdentifier: fonctionne à la fois dans le périphérique et dans le simulateur.

Si vous avez configuré les deux cibles (ou Target et WatchKit Extension, par exemple) qui vont partager des données pour prendre en charge les groupes, et que vous continuez à retourner nil, vous pouvez vérifier vos paramètres de cibles.

  1. Paramètres de cible> Général> Equipe> votreSociété l'équipe de signature doit être sélectionnée ici. S'il y a un avertissement et un bouton Résoudre ce problème , soyez bon Et corrigez le problème en le tapant :)

  2. Paramètres de cible> Fonctionnalités> Groupes d'applications> Is On + indique que votre Groupe.com.votreentreprise.votre application.sharedContainter nom de groupe ("sharedContainer" est le nom de mon choix) sélectionné et en noir (pas rouge). Si le symbole est rouge ou s'il y a un avertissement et si le bouton Résoudre ce problème Est renouvelé, créez-en un autre.

  3. Paramètres de cible> Paramètres de construction> Signature de code> Signature de code Droits: pointez sur vos fichiers de droits pour Debug et (Quelque chose comme _ {VotreApp/votreAppritents)

  4. Paramètres cible> Paramètres de construction> Signature de code> Signature de code Identité: assurez-vous que l'identité fait partie de l'équipe sélectionnée ci-dessus. J'utilise Développeur iOS

  5. Paramètres de cible> Paramètres de construction> Signature de code> Provisioning Profil: comme ci-dessus, assurez-vous que le PP que vous utilisez appartient à l'équipe Requise. Je l'ai mis à Automatique.

Vérifiez ceux-ci pour les deux cibles partage des données.

J'espère que ça aide

21
Juan Fran Jimenez

Cela n'indique pas clairement la documentation, mais j'ai constaté que l'identificateur de groupe est sensible à la casse.

4
respectTheCode

Je trouve que containerURLForSecurityApplicationGroupIdentifier peut fonctionner à la fois sur un périphérique réel et sur un simulateur avec xcode 6.2. Je suis tombé sur ce fil parce que je n'ai pas non plus, mais maintenant, je trouve que la cause principale est mon erreur de frappe du nom du groupe "App Groups".

De plus, voici la liste dont vous avez besoin de vérifier:

  1. assurez-vous que les "groupes d'applications" ont été créés par xcode ou par la console Web à https://developer.Apple.com
  2. assurez-vous que les 'groupes d'applications' sont 'activés' sur 'Développement' et 'Production' sur la 'console Web: Identifiants-> Identifiants d'application' 
  3. assurez-vous que les 'profils de provisioning' correspondants sont 'actifs'
  4. le nom de groupe du droit dans les applications contenant et les applications d'extension doit correspondre à celui que vous avez créé à l'étape 1
  5. assurez-vous que l'identifiant de l'ensemble de toutes les cibles est identique à celui de la console Web: Identifiants-> ID de l'application
  6. assurez-vous que le «groupe» de toutes les cibles correspond à celui de la console Web
  7. assurez-vous de choisir le bon groupe sous l'onglet "Capacités" à la fois dans l'application cible et dans la cible d'application d'extension, et sans couleur rouge.
  8. nettoyer le cache xcode par cmd + shift + k 
  9. reconstruire et prier 
1
superZhen

La méthode containerURLForSecurityApplicationGroupIdentifier: fonctionne dans mon simulateur. Mais si je supprime tous les fichiers du dossier de groupe (si un utilisateur effectue une déconnexion dans mon application), la méthode renvoie nil lors du prochain RUN de Xcode 6.1. Je l'ai également testé avec Xcode 6.2 et iOS SDK 8.2 Beta, mais cela ne fonctionne pas.

Le code fonctionne correctement sur un appareil réel.

J'ai aussi essayé les solutions ci-dessus sans succès.

0
lahmar

J'ai trouvé que la cause de cette erreur dans mon cas était un fichier ".com.Apple.mobile_container_manager.metadata.plist" . Après avoir récupéré mon fichier de ce répertoire, j'ai supprimé tous les fichiers qu'il contient. Donc, ce fichier a également été supprimé. Et lorsque vous supprimez ce fichier, l'application vous renvoie une nil pour containerURLForSecurityApplicationGroupIdentifier

J'ai donc changé mon code pour ceci:

    NSURL *groupPath = [[NSFileManager defaultManager] containerURLForSecurityApplicationGroupIdentifier:YGGroupIdentifier];
    NSArray *fileArray = [fileManager contentsOfDirectoryAtPath:[groupPath path] error:nil];
    for (NSString *filename in fileArray)  {
        if (![filename hasPrefix:@".com"]) {
            [fileManager removeItemAtPath:[[groupPath path] stringByAppendingPathComponent:filename] error:nil];
        }
    }

Maintenant cela fonctionne très bien, même en simulateur.

0
George

Pour moi, il y a eu quelques dégâts avec mon Profil de provisioning d'équipe iOS (qui n'est pas requis pour s'exécuter dans Simulator). 

Pour exécuter mon application sur mon iPhone, je devais d'abord reconfigurer le iOS Team Provisioning Profile pour l'environnement de débogage. Appeler containerURLForSecurityApplicationGroupIdentifier: a parfaitement fonctionné sur l'appareil. Ensuite, je suis retourné au simulateur et - voilà, cela a encore fonctionné. 

0
martn_st