Lecture de NSUserDefaults dans watchOS 2 (je sais que les groupes d'applications ne fonctionnent pas)

La documentation d'Apple indique «De plus, iOS transfère automatiquement une copy en lecture seule des preferences de votre application iOS à Apple Watch.Votre extension WatchKit peut lire ces preferences à l'aide d'un object NSUserDefaults …» . https://developer.apple.com/library/prerelease/watchos/documentation/General/Conceptual/WatchKitProgrammingGuide/SharingData.html#//apple_ref/doc/uid/TP40014969-CH29-SW1

Mais je ne peux pas lire les valeurs par défaut dans mon application WatchKit qui ont été enregistrées dans mon application iPhone, est-ce que je fais quelque chose de mal?

Dans l'application WatchKit, est-ce que je peux même sauvegarder (par un WatchKit seulement) des valeurs par défaut, ou cela ne fonctionne-t-il pas?

Data iPhone:

 let defaults = NSUserDefaults.standardUserDefaults() defaults.setObject(dataArray, forKey: "DataSaved" 

Regarder ExtensionDelegate :

 let defaults = NSUserDefaults.standardUserDefaults() print(defaults.arrayForKey("DataSaved")) print(defaults.objectForKey("DataSaved")) 

arrayForKey et objectForKey pour l'printing nil .

Je dois faire quelque chose de mal, savez-vous ce que ce serait?

Différence entre NSUserDefaults

NSUserDefaults est une unité de memory sur n'importe quel appareil, donc il est complètement différent dans iOS et watchOS, aussi bien dans tvOS, etc.

Par exemple, si vous exécutez un code qui ajoute une nouvelle key appelée "key1" à NSUserDefaults sur iOS (en supposant que vous utilisez NSUserDefaults.standardUserDefaults() ), lorsque vous requestz à lire ses données sur watchOS, il vous donne un dictionary vide.

C'est la première fois que vous stockez le dictionary uniquement dans iOS App Target et non dans un espace partagé entre deux appareils. Lorsque l'extension WatchKit souhaite utiliser NSUserDefaults , elle lit le dictionary (vide) enregistré dans WatchKit Target et non le dictionary (rempli) dans iOS Target.

Partage de données

Il existe des moyens de partager des dictionarys entre watchOS et iOS:

1- En utilisant WatchConnectivity framework dans watchOS 2, vous pouvez transmettre des données entre deux cibles. Vous pouvez utiliser sendMessage ou des fonctions similaires dans les classs WCSession pour le faire. N'oubliez pas d'append WCSessionDelegate à vos WCSessionDelegate InterfaceController (dans watchOS) ou ViewController (dans iOS) et aux delegates de l'application pour que l'application puisse recevoir des données de WatchConnectivity .

2- En utilisant les stockages en ligne / dans le cloud, vous pouvez download le dictionary depuis iOS App, puis le download sur l'application watchOS. Cependant, cela nécessite une connection Internet et ne convient pas dans la plupart des cas, par exemple si votre application n'a pas besoin de se connecter à Internet pour effectuer d'autres tâches et que vous forcez l'user à se connecter à Internet uniquement pour synchroniser un dictionary simple entre les deux cibles.

3- Utiliser des groupes d'applications (si vous utilisez watchOS 1), que je ne décris pas plus, car il est obsolète et que vous ne voulez probablement pas faire votre application juste pour watchOS 1.

Conclusion

1- NSUserDefaults renvoie deux dictionarys différents dans watchOS et iOS, respectivement.

2- Pour partager des données entre watchOS et iOS, vous pouvez utiliser WatchConnectivity , Internet (non recommandé) et App Groups (dans watchOS 1).

Davantage de ressources

Pour plus de détails sur WatchConnectivity , la réponse moderne à votre question, vous devriez consulter la documentation Apple dans le Portail des développeurs Apple .

Aussi, vous devriez voir cette session WWDC parler de ce grand cadre inclus dans watchOS 2.

Pardon. Vous ne pouvez pas lire les valeurs par défaut dans l'application WatchKit, car depuis watchOS2, il a sa propre memory à utiliser. Vous ne pouvez donc pas accéder à la valeur de NSUserDefaults d'iOS dans watchOS

Vous devez utiliser WatchConnectivity pour partager des données pour regarder OS2.

Pour être clair, NSUserDefaults.standardUserDefaults() vous donnera deux dictionarys différents lors de l'appel sur la montre et sur le téléphone.

Pour WatchConnectivity, consultez https://developer.apple.com/videos/play/wwdc2015/713/

Apple docs:

https://developer.apple.com/library/watchos/documentation/WatchConnectivity/Reference/WatchConnectivity_framework/index.html