WatchKit SDK no recupera datos de NSUserDefaults

Quería hacer una aplicación de testing para el reloj Apple en la que puedes establecer una cadena en tu teléfono y luego se mostrará en el Apple Watch. Decidí usar la class NSUserDefaults para almacenar estos datos.

En mi controller de vista para el iPhone tengo un método que lleva la input y almacena en el almacenamiento local:

- (IBAction)saveInfo:(id)sender { NSString *userInput = [myTextField text]; NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults]; [defaults setObject:userInput forKey:@"savedUserInput"]; [defaults synchronize]; self.myLabel.text = [defaults stringForKey:@"savedUserInput"]; } 

Y en mi controller de interfaz de reloj tengo un método que recupera los datos y los muestra:

 - (IBAction)showText2 { NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults]; [defaults synchronize]; self.myLabel2.text = [defaults stringForKey:@"savedUserInput"]; } 

Excepto por alguna razón, los datos que bash recuperar se muestran como nulos y la label no se está actualizando.

+standardUserDefaults devuelve un object NSUserDefaults que solo guarda información para el process actual.

Si desea crear un object NSUserDefaults que comparta datos entre su aplicación de iOS y una de sus extensiones, deberá configurar un contenedor de grupo de aplicaciones y usar eso como base para compartir información.

De la documentation vinculada:

Después de habilitar los grupos de aplicaciones, una extensión de aplicación y su aplicación contenedora pueden usar la API NSUserDefaults para compartir el acceso a las preferences del usuario. Para habilitar este uso compartido, use el método initWithSuiteName: para crear una instancia de un nuevo object NSUserDefaults, pasando el identificador del grupo compartido. Por ejemplo, una extensión Compartir podría actualizar la count de uso compartido más reciente del usuario, usando un código como este:

 // Create and share access to an NSUserDefaults object. NSUserDefaults *myShanetworkingDefaults = [[NSUserDefaults alloc] initWithSuiteName:@"group.com.example.domain.MyShareExtension"]; // Use the shanetworking user defaults object to update the user's account. [myShanetworkingDefaults setObject:theAccountName forKey:@"lastAccountName"]; 

NOTA: Con el reloj OS2 ya no puede usar los contenedores de grupo compartidos.

IMPORTANTE

Con el reloj OS2 ya no puede usar los contenedores de grupo compartidos. Debe usar esta respuesta de desbordamiento de stack.

"Para OS2, necesitará usar los frameworks de WatchConnectivity e implementar WCSessionDelegate".