visual studio programar para multiplataforma español ejemplos curso con compilar app objective-c nsuserdefaults ios8 ios-app-group

objective c - studio - Los valores no siempre persisten en el grupo de aplicaciones entre la aplicación complementaria y la extensión de la aplicación



xamarin studio español (2)

De vez en cuando, pero no siempre (he tenido esto funcionando por un tiempo), la aplicación / extensión se pone en un estado en el que no puedo leer un marcador establecido en mi grupo de aplicaciones entre mi aplicación complementaria y mi extensión de aplicación. No sé cómo se pone en este estado o por qué los valores son diferentes, pero es fundamental para mi aplicación que estos siempre estén sincronizados.

Aplicación complementaria viewDidLoad :

NSUserDefaults *myAppSettings = [[NSUserDefaults alloc] initWithSuiteName:@"group.myapp"]; ..... [myAppSettings setBool:true forKey:@"myBool"]; [myAppSettings synchronize]; NSLog([myAppSettings boolForKey:@"myBool"] ? @"Companion app - bool TRUE" : @"Companion app - bool FALSE");

Extensión de aplicación viewDidLoad

NSUserDefaults *myAppSettings = [[NSUserDefaults alloc] initWithSuiteName:@"group.myapp"]; [myAppSettings synchronize]; NSLog([myAppSettings boolForKey:@"myBool"] ? @"App extension app - bool TRUE" : @"App extension - bool FALSE");

Salida de consola

Companion app - bool TRUE App extension - bool FALSE

También sincronizo antes de que mi aplicación compañera ingrese el fondo. Tengo mi grupo de aplicaciones configurado en el portal, etc.

¿Qué estoy haciendo mal?

EDITAR

Al parecer, otros también tienen este problema: https://devforums.apple.com/message/977151#977151

"Creo que esto es actualmente muy defectuoso.

A veces, el intercambio de datos funciona, luego se produce un cambio y, de repente, el widget ya no puede ver los datos compartidos (tanto en el simulador como en el dispositivo).

¡Molesto y espero que sea un poco más confiable en la próxima versión beta! "

EDITAR 2 Parece que otra persona también ha informado este problema exacto:

"También noté lo mismo. Esto no solo sucede con los NSUserDefaults, sino también con todos los archivos de la carpeta del contenedor. La extensión del teclado perderá repentinamente el permiso de lectura / escritura en la carpeta del contenedor después de usar el teclado por un tiempo".

EDITAR 3 Más evidencia: https://devforums.apple.com/message/1028078#1028078

Después de actualizar a la versión beta 3, noté que a veces el teclado no podía abrir la base de datos porque no se podía acceder al archivo DB. El teclado ha podido acceder al archivo anteriormente.

EDIT 4

Parece que esto podría deberse a que el teclado pierde el indicador RequestsOpenAccess . Pero no puedo reproducirlo, y no hay forma de que lo diga con certeza.

EDIT 5

Parece que otros informan esto en la compilación GM de iOS8:

Este problema aún persiste para mí en el GM. Parece relacionado con un bloqueo del teclado ... pero también parece haber cierta disputa entre el teclado y la aplicación que lo contiene en términos de quién crea el paquete en qué orden. Creo que este problema está en el final de Apple. Confía en mí, QUIERO que sea mi culpa, pero he pasado incontables horas con prueba y error. No importa lo que haga en el código y verifique con NSLog, eventualmente terminará en este estado. Esperando que alguien encuentre una píldora mágica. : S

¿Alguien ha resuelto esto todavía?


Puedo confirmar que el problema está relacionado con el indicador RequestsOpenAccess . Suponiendo que todo se hace bien (NSUserDefaults usa initWithSuiteName, se configuraron todas las Capacidades para la aplicación principal y el teclado personalizado, etc.) Tengo los siguientes pasos:

1) Instale la aplicación principal y un teclado personalizado en el dispositivo

2) Configure '' Permitir acceso completo '' para el teclado personalizado a SÍ

3) Agregue algunos elementos (en mi caso esta es una plantilla de texto simple) en la aplicación principal

4) Vaya al teclado y verifique que todos los elementos, que se agregaron desde la aplicación principal, aparecieron en el teclado personalizado

5) Ir a la aplicación principal y agregar algunos artículos más

6) Ve al teclado y verás que nada ha cambiado

7) Ir a la configuración y cambiar ''Permitir acceso completo'' a NO y luego a SÍ

8) Ir al teclado personalizado de nuevo y verificar que el elemento que se agregó en el paso 5 apareció.


Debe solicitar acceso abierto para acceder a NSUserDefaults compartidos. Se indica directamente en la guía de programación de extensión de la aplicación :

De forma predeterminada, un teclado no tiene acceso a la red y no puede compartir un contenedor con la aplicación que lo contiene. Para habilitar estas cosas, establezca el valor de la clave Boolean RequestsOpenAccess en el archivo Info.plist en YES.

Asegúrese de cambiar el campo RequestsOpenAccess a YES . Lo encontrará en Info.plist del teclado> NSExtension> NSExtensionAttributes> RequestOpenAccess. Luego, quite el teclado en Configuración, elimine la aplicación, vuelva a ejecutarla y agregue el teclado nuevamente. Después de agregarlo, toque el nombre del teclado y luego encienda el interruptor para habilitar Permitir acceso total. Tendrá que indicar a los usuarios que sigan los mismos pasos para otorgar acceso (y les asegure que no es malo), de lo contrario, simplemente no funcionará y nunca obtendrá los datos que están almacenados en su contenedor compartido. Tenga en cuenta que en iOS 8.3+, si el usuario no ha habilitado el acceso completo, el teclado podrá acceder al contenedor compartido, pero escribir en él no guardará los datos, por razones de seguridad y privacidad. En 8.2- no puede acceder a esos datos sin acceso abierto concedido.