iOS 8 ujawnił wczoraj nowe API dotyczące grup aplikacji. Udostępnianie danych i komunikowanie się między aplikacjami było trochę bałaganiarskie i uważam, że właśnie to mają poprawić grupy aplikacji.
W mojej aplikacji włączyłem grupy aplikacji i dodałem nową grupę, ale po prostu nie mogę znaleźć żadnej dokumentacji, jak z niej korzystać. Dokumentacja i odniesienia do API określają jedynie, jak dodać grupę.
Co tak naprawdę mają robić grupy aplikacji? Czy jest gdzieś dokumentacja, jak go używać?
źródło
Udostępnianie danych NSUserDefaults między wieloma aplikacjami
Aby mieć wspólne ustawienia domyślne między aplikacją a rozszerzeniem lub między 2 aplikacjami, musisz dodać grupę aplikacji w ustawieniach, wykonując następujące czynności:
Uwaga: jeśli przejdziesz do portalu Apple Developer Portal (witryna firmy Apple, która zawiera wszystkie Twoje certyfikaty, identyfikatory, urządzenia i profile obsługi administracyjnej) i wybierzesz Identyfikatory> Grupy aplikacji, powinieneś zobaczyć tę nową grupę aplikacji.
Aby przechowywać dane:
var userDefaults = NSUserDefaults(suiteName: "group.com.company.myApp")! userDefaults.setObject("user12345", forKey: "userId") userDefaults.synchronize()
Aby odzyskać dane:
var userDefaults = NSUserDefaults(suiteName: "group.com.company.myApp") if let testUserId = userDefaults?.objectForKey("userId") as? String { print("User Id: \(testUserId)") }
źródło
Grupy aplikacji, zgodnie z moją interpretacją istniejącej dokumentacji, są przeznaczone przede wszystkim na rozszerzenia, a dokładniej na widżety. Widżety to własny pakiet aplikacji, który współistnieje z Twoją aplikacją. Ponieważ są one oddzielną aplikacją i dlatego mają własną piaskownicę, do udostępniania plików będziesz musiał używać grup aplikacji.
Po pewnym grepowaniu nagłówka wydaje mi się, że API jest potrzebne, ale w rzeczywistości zostało wprowadzone jako część iOS 7.
NSFileManager
zawiera metodę, dziękicontainerURLForSecurityApplicationGroupIdentifier:
której możesz przekazać identyfikator utworzony podczas włączania grup aplikacji dla swoich aplikacji:NSURL *containerURL = [[NSFileManager defaultManager] containerURLForSecurityApplicationGroupIdentifier:@"group.com.company.app"];
źródło
NSUserDefaults
do pracy. Kredytuję do błędu Beta 1.NSUserDefaults
bazy danych. Zobacz moją odpowiedź.Jedna ważna pułapka, w którą dziś wpadłem, jest następująca:
W wielu projektach widziałem jeden cel aplikacji iz różnymi identyfikatorami pakietów ustawionymi dla każdej konfiguracji tego celu. Tutaj robi się bałagan. Programiści zamierzali stworzyć aplikację do debugowania dla konfiguracji debugowania i aplikację produkcyjną dla celu wydania.
Jeśli to zrobisz, obie aplikacje będą współdzielić te same NSUserDefaults, gdy zostaną skonfigurowane w ten sposób
var userDefaults = NSUserDefaults(suiteName: "group.com.company.myApp") userDefaults!.setObject("user12345", forKey: "userId") userDefaults!.synchronize()
Powoduje to problemy w wielu miejscach:
Ogólnym rozwiązaniem tego problemu jest poprzedzenie kluczy domyślnych bieżącą, zbudowaną konfiguracją. Konfigurację można łatwo wykryć w czasie wykonywania, ustawiając różne identyfikatory pakietów dla swoich konfiguracji. Następnie po prostu przeczytaj identyfikator pakietu z
NSBundle.mainBundle()
. Jeśli masz te same identyfikatory pakietów, musisz ustawić różne makra preprocesora, takie jak#ifdef DEBUG NSString* configuration = @"debug"; #elif RELEASE NSString* configuration = @"release"; #endif
W Swift będzie wyglądać prawie tak samo:
#if DEBUG let configuration = "debug" #elseif RELEASE let configuration = "release" #endif
źródło
NSUserDefaults.standardUserDefaults()
dla danych, które nie powinny być udostępniane.Przechować
let shared: NSUserDefaults = NSUserDefaults(suiteName: "group.abcapp")! shared.setObject("abc.png", forKey: "favEmoji") shared.synchronize()
źródło