Falha ao ler valores em CFPrefsPlistSource iOS 10

86

Eu atualizei meu Xcode 8 para beta 2 hoje e estou tentando compartilhar dados entre o App e o Today Extension. Estou enfrentando este aviso de registro:

2016-07-08 18: 00: 24.732472 ProjetctX [941: 42801] [User Defaults] Falha ao ler os valores em CFPrefsPlistSource <0x1700f1280> (Domain: group.xpto, User: kCFPreferencesAnyUser, ByHost: Sim, Container: (null)) : Usar kCFPreferencesAnyUser com um contêiner só é permitido para Contêineres de sistema, desconectando-se de cfprefsd

Alguém pode me ajudar?

Klevison
fonte
7
estou tendo esse mesmo problema em meu aplicativo
Pravin Kamble
@PravinKamble Recebi este erro, mas consigo acessar tudo (grupo de aplicativos dos padrões do usuário).
Klevison
1
alterar o destino de implantação no 9.3 funcionará perfeitamente no dispositivo, mas não funcionará com o iOS 10, estarei procurando uma solução que postarei aqui assim que encontrar uma solução
Pravin Kamble
@PravinKamble você criou seu projeto usando o Xcode 8 beta 2?
Klevison
Eu recebo a mesma coisa usando padrões compartilhados com XCode 8 beta 4.
Gruntcakes

Respostas:

76

Na verdade, este é um aviso falso que foi introduzido no iOS 10 e no macOS 10.12:

Dica NSUserDefaults: nos sistemas operacionais atuais há um erro registrado "… com um contêiner só é permitido para contêineres do sistema…".

Isso é espúrio.

Tentando capturar um modo de falha específico, peguei um caso de operação normal ao mesmo tempo.

Meu sucessor em UserDefaults também não descobriu uma maneira de tornar isso menos alarmante sem tornar o caso sintomático impossível de depurar: /

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

O conselho de prefixar seu ID de equipe silenciará o aviso, mas também criará novos padrões de usuário vazios. Isso fará com que todos os dados armazenados anteriormente sejam ilegíveis.

Por enquanto, a solução é simplesmente ignorá-lo.

Além disso, o membro da equipe da Apple CFM nos fóruns :

A mensagem registrada é espúria, a menos que você esteja fazendo coisas muito específicas que eu não acho que sejam possíveis sem usar funções privadas (ela foi adicionada para detectar o uso indevido dessas funções, mas infelizmente também pegou um caso de uso normal).

Waltflanagan
fonte
1
Tentei criar um grupo de aplicativos que começa com o ID da equipe, mas força-o a começar com 'grupo'. Então - os dois não deveriam combinar ???
SAHM
3
Estou vendo essas mensagens de log em High Sierra. Anexar o ID da equipe não silencia o aviso para mim. A Apple pretende consertar isso?
mschmidt
1
Desculpe, você pode explicar? "prefixar sua ID de equipe" a quê?
Motti Shneor
19

Veja como usar UserDefaults com grupos de aplicativos para passar dados entre seu aplicativo principal e sua extensão:

  1. Em seu aplicativo principal, selecione seu projeto no Project Navigator.

  2. Selecione o destino do seu aplicativo principal e escolha a guia Capacidades.

  3. Alterne o botão Grupos de aplicativos para LIGADO. Isso se comunicará com o Portal do Desenvolvedor para gerar um conjunto de direitos.

  4. Crie um novo contêiner. De acordo com a Apple, seu ID de contêiner deve começar com "grupo", então um nome como "group.io.intrepid.myapp" é perfeito.

  5. Selecione seu destino de extensão e repita o processo de habilitação de grupos de aplicativos. Não crie um novo Grupo de aplicativos, simplesmente selecione o grupo que acabou de ser criado no destino do aplicativo principal.

  6. Ao ler ou gravar UserDefaults em seu aplicativo ou extensão, não acesse UserDefaults.standard. Em vez disso, use UserDefaults(suiteName: "group.io.intrepid.myapp"). Observação: o nome do conjunto é o nome do contêiner do grupo de aplicativos criado na etapa 4.

Certifique-se de habilitar o grupo e usar o mesmo ID de grupo para a seção de extensão e capacidade do aplicativo!

O crédito vai para http://blog.intrepid.io/ios-app-extensions

Arfan Mirza
fonte
"basta selecionar o grupo que acabou de ser criado no destino do aplicativo principal" => O que fazer quando ele não aparecer ??
user3722523
habilite e selecione o mesmo grupo na extensão também!
Arfan Mirza
Repito, como selecionar mesmo grupo se a seleção está vazia no ramal ???
user3722523
Quando você alterna / habilita grupos na seção Compatibilidade, ele mostra automaticamente a lista de grupos; se não for exibida, verifique a Equipe (conta de desenvolvedor de assinatura), Equipe também precisa disso! Defina a equipe e alterne os grupos novamente!
Arfan Mirza
ainda não funciona ... no entanto, com o projeto iOS funciona. Criei um tópico: stackoverflow.com/questions/44914304/…
user3722523
4

Também tive o mesmo problema com meu aplicativo macOS.

Resolvido com: Reinicialize o dispositivo!

https://stackoverflow.com/a/39876271

Jxtt
fonte
Surpreendentemente, ajudou. Obrigado!
DmitryKanunnikoff
3

O SuiteName (postfix) não deve ser o ID do Bundle principal.

Emmanuel Sellier
fonte
3

Altere o nome do seu grupo em direitos Xcode de:

group.com.mycompany.myapp

Para

group.MYTEAMID.com.mycompany.myapp

ps: você pode encontrar seu MYTEAMID na associação em developer.apple.com

Santiago
fonte
3

A solução para mim foi não usar o mesmo identificador para o identificador de pacote do aplicativo e a parte após "grupo".

Digamos que o id do pacote de aplicativos seja "com.app.id", então o id do grupo como "group.com.app.id" está causando problemas. Depois que eu mudo para "group.com.app.id.something", ele para.

Vitaly Baum
fonte
0

Compile com o Xcode 8.1 Beta e você verá o mesmo aviso, mas também obterá o valor.

raz0r
fonte
0

Estou enfrentando esse mesmo problema quando tento usar initWithSuiteName. Parece que este é um bug da Apple. A única solução / solução alternativa que encontrei é redefinir todas as configurações do dispositivo. Vá para Configurações -> Geral -> Redefinir -> Redefinir todas as configurações.

Isso não apaga nenhum conteúdo do iPhone, apenas apaga todas as configurações. Depois de redefinir a configuração, tudo funcionou bem. Deixe-me saber se isso te ajudar também.

Sagar D
fonte
-3

se você sofre esse problema ao tentar salvar dados na extensão APP usando userDefault, talvez você tenha escrito este código:

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

Este código é redefinido como padrão userDefault.

Na verdade, o código correto é:

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

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

E você
fonte
-10

Mudar de

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

para

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

Onde nnnnnnnnnestá o número da sua equipe, aquele que você usa para assinar o seu código.

Testado em Xcode 8 GM e iOS 10 GM, e funcionou!

Titã
fonte
2
Devemos usar "nnnnnnnnnn.group.com.xxx.xxx" também para escrever no aplicativo principal ou apenas usar o ID da equipe na extensão? Para mim, adicionar o ID da equipe parece puxar um UserDeaults em branco, sem nenhum dos dados que salvei em "group.com.xxx.xxx" em meu aplicativo. Realmente espero que haja uma correção para isso, pois está bloqueando minha atualização do iOS 10.
timgcarlson
2
Os dados ainda não sincronizam. O erro vai embora.
Jeet
3
Atualmente, parece que este erro não afeta o aplicativo. Mas se adicionar o ID da equipe, o erro está ausente, mas os dados não podem ser buscados.
scorpiozj
4
Esta não é uma boa resposta. Você colocaria qualquer outra coisa e pularia o erro como ajuda ao mudar a chave.
kokluch,
Não funcionando no meu caso, o erro desaparece, mas os dados não estão sendo
buscados