Como compartilhar dados de chaves entre aplicativos iOS

Estou descrevendo um problema pelo qual levei algum tempo para aprender a resposta.

O exemplo ” GenericKeychain ” é um bom começo para fornecer um wrapper para compartilhar dados de chaves entre aplicativos ao usar o accessGroup no init.

No entanto, implementar isso no meu aplicativo gerou um código de erro obscuro (que demorou uma eternidade para localizar) -25243, o que significa: Sem controle de access.

Eu rodei o aplicativo de exemplo da Apple (GenericKeychain) no meu iPad apenas para obter o mesmo erro. Hã?

A documentação da Apple falha em fornecer o que é necessário para isso?

Depois de algumas escavações em toda a web, encontrei a resposta. O grupo de access que você usa ao construir sua class KeychainItemWrapper também deve ser especificado em cada um dos arquivos Entitlements.plist do seu aplicativo na seção “keychain-access-groups”.

Parece quase óbvio agora que vejo ” keychain-access-groups “. No entanto, eu não tinha ideia de nem olhar lá. Espero que isso ajude os outros.

Na verdade não é difícil de fazer. Por favor, siga os passos.

App1:

  1. Abra os resources de destino do seu aplicativo e ative o Compartilhamento de KeyChain.
  2. Adicione um identificador. (por exemplo: com.example.sharedaccess)
  3. Adicione ” UICKeyChainStore ” ao seu projeto.
  4. Certifique-se de que você tenha um ID de equipe adicionado ao seu projeto App1.
  5. Adicione Security.framework ao seu projeto App1.
  6. E adicione esses códigos em algum lugar que você precise.

    [UICKeyChainStore setString:@"someValue" forKey:@"someKey" service:@"someService"]; 

App2:

  • Abra os resources de destino do seu aplicativo e ative o Compartilhamento de KeyChain.
  • Adicione um identificador. (por exemplo: com.example.sharedaccess)
  • Adicione ” UICKeyChainStore ” ao seu projeto.
  • Certifique-se de que você tenha um ID de equipe adicionado ao seu projeto App2.
  • Adicione Security.framework ao seu projeto App2.
  • E adicione esses códigos em algum lugar que você precise.

     NSString *string = [UICKeyChainStore stringForKey:@"someKey" service:@"someService"]; 
  • Seus TeamIDs devem ser os mesmos para os dois projetos.

  • Eu tentei estas etapas em um dispositivo real do iPhone .
  • Eu também tentei estas etapas com o perfil de provisionamento do Automatic e do iOs Development .
  • Os identificadores do pacote dos meus aplicativos eram assim: com.example.app1, com.example.app2.