Error al leer los valores en CFPrefsPlistSource iOS 10

86

Actualicé mi Xcode 8 a beta 2 hoy y estoy tratando de compartir datos entre la aplicación y la extensión Today. Me enfrento a esta advertencia de registro:

2016-07-08 18: 00: 24.732472 ProjetctX [941: 42801] [User Defaults] No se pudieron leer los valores en CFPrefsPlistSource <0x1700f1280> (Dominio: group.xpto, Usuario: kCFPreferencesAnyUser, ByHost: Sí, Contenedor: (nulo)) : El uso de kCFPreferencesAnyUser con un contenedor solo está permitido para los contenedores del sistema, separándose de cfprefsd

¿Alguien puede ayudarme?

Klevison
fuente
7
Estoy teniendo este mismo problema en mi aplicación
Pravin Kamble
@PravinKamble Recibí este error, pero puedo acceder a todo (el grupo de aplicaciones predeterminado del usuario).
Klevison
1
Al cambiar el objetivo de implementación en 9.3, se ejecutará perfectamente en el dispositivo, pero no funcionará con iOS 10.
Estaré
@PravinKamble, ¿ha creado su proyecto con Xcode 8 beta 2?
Klevison
Obtengo lo mismo usando valores predeterminados compartidos con XCode 8 beta 4.
Gruntcakes

Respuestas:

76

Esta es en realidad una advertencia falsa que se introdujo en iOS 10 y macOS 10.12:

Consejo de NSUserDefaults: en los sistemas operativos actuales hay un error registrado "... con un contenedor solo se permite para los contenedores del sistema ...".

Esto es falso.

Al intentar detectar un modo de falla en particular, se detectó un caso de operación normal al mismo tiempo.

Mi sucesor en UserDefaults tampoco ha descubierto una manera de hacer que esto sea menos alarmante sin hacer que el caso sintomático sea imposible de depurar: /

https://twitter.com/Catfish_Man/status/784460565972332544 [hilo]

El consejo de anteponer su ID de equipo silenciará la advertencia, pero también creará una nueva configuración predeterminada de usuario vacía. Esto resultará en que cualquier dato almacenado previamente sea ilegible.

Por el momento, la solución es simplemente ignorarlo.

Además, el miembro del personal de Apple CFM en los foros :

El mensaje registrado es falso a menos que esté haciendo cosas muy específicas que no creo que sean posibles sin usar funciones privadas (se agregó para detectar el uso indebido de esas funciones, pero desafortunadamente también detectó un caso de uso normal).

Waltflanagan
fuente
1
Intenté crear un grupo de aplicaciones que comience con el ID del equipo, pero lo obliga a comenzar con 'grupo'. Entonces, ¿no se supone que los dos coincidan?
SAHM
3
Veo estos mensajes de registro en High Sierra. Anteponer la identificación del equipo no silencia la advertencia para mí. ¿Apple tiene la intención de arreglar esto?
mschmidt
1
Lo siento, ¿podría darnos más detalles? "anteponer su ID de equipo" a qué?
Motti Shneor
19

A continuación, le mostramos cómo usar los valores predeterminados de usuario con grupos de aplicaciones para pasar datos entre su aplicación principal y su extensión:

  1. En su aplicación principal, seleccione su proyecto en el Navegador de proyectos.

  2. Seleccione el objetivo de su aplicación principal y elija la pestaña Capacidades.

  3. Mueva el interruptor de Grupos de aplicaciones a ON. Esto se comunicará con el Portal para desarrolladores para generar un conjunto de derechos.

  4. Crea un nuevo contenedor. Según Apple, su ID de contenedor debe comenzar con "grupo", por lo que un nombre como "group.io.intrepid.myapp" es perfecto.

  5. Seleccione el destino de su extensión y repita el proceso de habilitación de Grupos de aplicaciones. No cree un nuevo grupo de aplicaciones, simplemente seleccione el grupo que acaba de crear en el destino de la aplicación principal.

  6. Cuando lea o escriba UserDefaults en su aplicación o en su extensión, no acceda UserDefaults.standard. En su lugar utilice UserDefaults(suiteName: "group.io.intrepid.myapp"). Nota: El nombre de la suite es el nombre de su contenedor de grupo de aplicaciones creado en el paso 4.

¡Asegúrese de habilitar el grupo y usar la misma identificación de grupo para la sección de capacidad de la aplicación y la extensión!

El crédito va a http://blog.intrepid.io/ios-app-extensions

Arfan Mirza
fuente
"simplemente seleccione el grupo que acaba de crear en la aplicación principal de destino" => ¿Qué hacer cuando no apareció?
user3722523
¡habilite y seleccione el mismo grupo en la extensión también!
Arfan Mirza
Repito, ¿cómo seleccionar el mismo grupo si la selección está vacía en la extensión ???
user3722523
Cuando alterna / habilita grupos en la sección Compatibilidad, entonces muestra automáticamente la lista de grupos, si no se muestra, verifique el Equipo (cuenta de desarrollador de firma), ¡el equipo también necesita lo mismo! ¡Configura el equipo y cambia de grupo nuevamente!
Arfan Mirza
todavía no funciona ... sin embargo, con el proyecto iOS funciona. He creado un hilo: stackoverflow.com/questions/44914304/…
user3722523
3

El SuiteName (sufijo) no debe ser el ID del paquete principal.

Emmanuel Sellier
fuente
3

Cambie el nombre de su grupo en los derechos de Xcode de:

group.com.mycompany.myapp

A

group.MYTEAMID.com.mycompany.myapp

ps: puede encontrar su MYTEAMID en la membresía de developer.apple.com

Santiago
fuente
3

La solución para mí fue no usar el mismo identificador para el identificador de paquete de la aplicación y la parte después de "grupo".

Digamos que la identificación del paquete de aplicaciones es "com.app.id", luego la identificación del grupo como "group.com.app.id" está causando problemas. Después de cambiarlo a "group.com.app.id.something", se detiene.

Vitaly Baum
fuente
0

Compile con Xcode 8.1 Beta y verá la misma advertencia, pero también obtendrá el valor.

raz0r
fuente
0

Me enfrento a este mismo problema cuando intento usar initWithSuiteName. Parece que esto es un error de Apple. La única solución / solución alternativa que encontré es restablecer todas las configuraciones del dispositivo. Vaya a Configuración -> General -> Restablecer -> Restablecer todas las configuraciones.

Esto no borra ningún contenido en el iPhone, solo borra todas las configuraciones. Después de restablecer la configuración, todo funcionó bien. Déjame saber si también te ayuda.

Sagar D
fuente
-3

Si sufre este problema cuando intenta guardar datos en la aplicación de extensión usando userDefault, tal vez haya escrito este código:

[[NSUserDefaults standardUserDefaults] initWithSuiteName:@"group.xxx.com"];

Este código se restablece por defecto userDefault.

En realidad, el código correcto es:

[[NSUserDefaults alloc] initWithSuiteName:@"group.xxx.com"];

http://www.jianshu.com/p/e782104c3bc3

H u Y an g
fuente
-10

Cambiar de

[[NSUserDefaults alloc] initWithSuiteName:@"group.com.xxx.xxx"];

a

[[NSUserDefaults alloc] initWithSuiteName:@"nnnnnnnnnn.group.com.xxx.xxx"]; 

¿Dónde nnnnnnnnnestá tu número de equipo, el que usas para firmar tu código?

Probado bajo Xcode 8 GM y iOS 10 GM, ¡y funcionó!

Titán
fuente
2
¿Se supone que debemos usar "nnnnnnnnnn.group.com.xxx.xxx" para escribir también en la aplicación principal, o simplemente usar el ID del equipo en la extensión? Para mí, agregar la identificación del equipo parece sacar un UserDeaults en blanco sin ninguno de los datos que guardé en "group.com.xxx.xxx" en mi aplicación. Realmente espero que haya una solución para esto, ya que está bloqueando mi actualización de iOS 10.
timgcarlson
2
Los datos aún no se sincronizan. El error desaparece.
Jeet
3
Actualmente, parece que este error no afecta a la aplicación. Pero si agrega ID de equipo, falta el error pero los datos no se pueden recuperar.
scorpiozj
4
Esta no es una buena respuesta. Debería poner cualquier otra cosa y omitir el error como ayuda al cambiar la clave.
kokluch
No funciona en mi caso, el error desaparece pero los datos no se
recuperan