Enregistrer et charger des données sur les extensions actuelles (iOS 8)

Est-il possible de sauvegarder et de charger des données sur Today Extension en utilisant NSUserDefaults? Après la fermeture du centre de notifications, le widget se comporte comme une application qui est terminée, de sorte que les résultats de données sont perdus. Comment pourrais-je résoudre ce problème?

C'est mon code:

NSUserDefaults *defaults; - (void)viewDidLoad { [super viewDidLoad]; defaults = [NSUserDefaults standardUserDefaults]; NSArray *loadSsortingngs = [defaults ssortingngArrayForKey:@"savedSsortingngs"]; if ([loadSsortingngs objectAtIndex:0] != nil) { [display setText:[NSSsortingng ssortingngWithFormat:@"%@", [loadSsortingngs objectAtIndex:0]]]; } if ([loadSsortingngs objectAtIndex:1] != nil) { calculatorMemory = [NSSsortingng ssortingngWithFormat:@"%@", [loadSsortingngs objectAtIndex:1]].doubleValue; } } - (IBAction)saveData:(id)sender { NSSsortingng *displaySsortingng; NSSsortingng *memorySsortingng; NSArray *saveSsortingngs = [[NSArray alloc] initWithObjects: displaySsortingng, memorySsortingng, nil]; defaults = [NSUserDefaults standardUserDefaults]; [defaults setObject:saveSsortingngs forKey:@"savedSsortingngs"]; [defaults synchronize]; } 

Vous devez utiliser l'identifiant du groupe d'applications au lieu de com. * Par exemple:

 NSUserDefaults *shared = [[NSUserDefaults alloc]initWithSuiteName:@"group.company.appgroup"]; 

N'oubliez pas de synchroniser lorsque vous stockez des données

 [shared synchronize]; 

Vous devez append les éléments du groupe d'applications détaillés ci- dessous , puis si cela a réellement fonctionné (assez iffy sous bêta), cela devrait vous permettre de partager des données NSUserDefault comme d'habitude entre l'hôte et le widget.

Edit: Normal NSUserDefaults ne fonctionne pas . Apple a mis en place une nouvelle méthode. Pour l'utiliser, redéfinissez simplement votre instance NSUserDefaults comme ceci:

 NSUserDefaults *shared = [[NSUserDefaults alloc]initWithSuiteName:@"com.you.app.container"]; 

Pour tous ceux qui se requestnt comment sauver et get des valeurs dans le monde, regardez ce code.

Dans votre application habituelle, ajoutez ceci pour save ce que vous voulez dans votre file * .m.

 NSUserDefaults *shared = [[NSUserDefaults alloc]initWithSuiteName:@"group.yourcompanyname.TodayExtensionSharingDefaults"]; //save dic [shared setObject:dictionary2 forKey:@"dicForTodayWidget"]; //save array [shared setObject:tempArray2 forKey:@"arrayForTodayWidget"]; //save some value [shared setObject:@"1234" forKey:@"myValForTodayWidget"]; [shared synchronize]; 

Dans votre widget d'aujourd'hui sous TodayViewController.m dans viewDidLoad ajoutez ceci.

 NSUserDefaults *shared = [[NSUserDefaults alloc]initWithSuiteName:@"group.yourcompanyname.TodayExtensionSharingDefaults"]; //get dic NSMutableDictionary *dictionary = [shared objectForKey:@"dicForTodayWidget"]; 

Vous devez d'abord configurer les groupes d'applications pour les deux cibles (application et extension).

Ensuite, utilisez le

 NSUserDefaults *shared = [[NSUserDefaults alloc]initWithSuiteName:@"group.company.myapp"]; 

pour get l'object par défaut que vous pouvez lire / écrire comme d'habitude.

Si vous souhaitez être informé des modifications apscopes aux valeurs par défaut, utilisez NSUserDefaultsDidChangeNotification dans votre widget (ou application).

Pour un didacticiel étape par étape expliquant tout cela, jetez un coup d'oeil à cet article de blog .

@edukulele Today Extension et l'application principale s'exécutent sur deux process. Aujourd'hui Extension ne peut pas recevoir NSUserDefaultsDidChangeNotifications. J'ai essayé d'utiliser MMWormhole. C'est très bien.