Avec iOS8 et ses extensions, Apple a introduit les conteneurs de groupe d'applications ( pour plus d'informations ici ).
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.
La méthode containerURLForSecurityApplicationGroupIdentifier:
de NSFileManager
fonctionne-t-elle sur vos simulateurs? Y at-il un moyen de résoudre ce problème?
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.
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 :)
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.
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)
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.
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
Cela n'indique pas clairement la documentation, mais j'ai constaté que l'identificateur de groupe est sensible à la casse.
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:
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.
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.
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é.