O iOS 8 revelou uma nova API ontem em relação aos grupos de aplicativos. Antes era meio confuso compartilhar dados e se comunicar entre aplicativos e acredito que é exatamente isso que o App Groups pretende corrigir.
Em meu aplicativo, habilitei os grupos de aplicativos e adicionei um novo grupo, mas simplesmente não consigo encontrar nenhuma documentação sobre como usá-lo. Referências de documentação e API apenas indicam como adicionar um grupo.
Então, o que os Grupos de aplicativos realmente pretendem fazer? Existe alguma documentação em algum lugar sobre como usá-lo?
fonte
Compartilhamento de dados NSUserDefaults entre vários aplicativos
Para ter padrões compartilhados entre um aplicativo e uma extensão ou entre 2 aplicativos, você deve adicionar um Grupo de aplicativos em suas configurações usando as seguintes etapas:
Observação: se você for ao Portal do desenvolvedor da Apple (o site da Apple que mostra todos os seus certificados, identificadores, dispositivos e perfis de provisionamento) e acessar Identificadores> Grupos de aplicativos, deverá ver este novo grupo de aplicativos.
Para armazenar dados:
var userDefaults = NSUserDefaults(suiteName: "group.com.company.myApp")! userDefaults.setObject("user12345", forKey: "userId") userDefaults.synchronize()
Para recuperar dados:
var userDefaults = NSUserDefaults(suiteName: "group.com.company.myApp") if let testUserId = userDefaults?.objectForKey("userId") as? String { print("User Id: \(testUserId)") }
fonte
Grupos de aplicativos, de acordo com minha interpretação da documentação existente, são direcionados principalmente para extensões, mais especificamente, para widgets. Os widgets são seus próprios pacotes de aplicativos que coexistem com o seu aplicativo. Como eles são um aplicativo separado e, portanto, têm sua própria sandbox, você precisará usar grupos de aplicativos para compartilhar arquivos.
Depois de alguns greping de cabeçalho, acho que achei a API necessária, mas na verdade foi colocada como parte do iOS 7.
NSFileManager
tem um métodocontainerURLForSecurityApplicationGroupIdentifier:
onde você pode passar o identificador que você criou ao ativar Grupos de aplicativos para seus aplicativos:NSURL *containerURL = [[NSFileManager defaultManager] containerURLForSecurityApplicationGroupIdentifier:@"group.com.company.app"];
fonte
NSUserDefaults
trabalhar. Eu atribuo a bug até Beta 1.NSUserDefaults
banco de dados. Veja minha resposta.Uma armadilha importante que descobri hoje é a seguinte:
Em muitos projetos, vi um único destino de aplicativo e com diferentes identificadores de pacote definidos para cada configuração desse destino. Aqui as coisas ficam complicadas. O que os desenvolvedores pretendiam era criar um aplicativo de depuração para a configuração de depuração e um aplicativo de produção para o destino de lançamento.
Se você fizer isso, os dois aplicativos compartilharão os mesmos NSUserDefaults quando forem configurados dessa forma
var userDefaults = NSUserDefaults(suiteName: "group.com.company.myApp") userDefaults!.setObject("user12345", forKey: "userId") userDefaults!.synchronize()
Isso causa problemas em muitos lugares:
A solução para este problema em geral é prefixar as chaves padrão com a configuração atual construída. Você pode detectar a configuração facilmente em tempo de execução, definindo diferentes identificadores de pacote para suas configurações. Em seguida, basta ler o identificador do pacote de
NSBundle.mainBundle()
. Se você tiver os mesmos identificadores de pacote, você precisa definir diferentes macros de pré-processador, como#ifdef DEBUG NSString* configuration = @"debug"; #elif RELEASE NSString* configuration = @"release"; #endif
Em Swift será quase o mesmo:
#if DEBUG let configuration = "debug" #elseif RELEASE let configuration = "release" #endif
fonte
NSUserDefaults.standardUserDefaults()
para dados que não devem ser compartilhados.Armazenar
let shared: NSUserDefaults = NSUserDefaults(suiteName: "group.abcapp")! shared.setObject("abc.png", forKey: "favEmoji") shared.synchronize()
fonte