Вчера iOS 8 представила новый API, касающийся групп приложений. Раньше было довольно сложно обмениваться данными и общаться между приложениями, и я считаю, что это именно то, что группы приложений призваны исправить.
В своем приложении я включил группы приложений и добавил новую группу, но я просто не могу найти никакой документации о том, как ее использовать. В документации и справочниках API указано только, как добавить группу.
Итак, для чего на самом деле предназначены группы приложений? Есть ли где-нибудь документация о том, как его использовать?
Обмен данными NSUserDefaults между несколькими приложениями
Чтобы иметь общие настройки по умолчанию между приложением и расширением или между двумя приложениями, вам необходимо добавить группу приложений в свои настройки, выполнив следующие действия:
Примечание. Если вы зайдете на портал разработчика Apple (веб-сайт Apple, на котором показаны все ваши сертификаты, идентификаторы, устройства и профили обеспечения) и перейдете в «Идентификаторы»> «Группы приложений», вы должны увидеть эту новую группу приложений.
Для хранения данных:
var userDefaults = NSUserDefaults(suiteName: "group.com.company.myApp")! userDefaults.setObject("user12345", forKey: "userId") userDefaults.synchronize()
Чтобы получить данные:
var userDefaults = NSUserDefaults(suiteName: "group.com.company.myApp") if let testUserId = userDefaults?.objectForKey("userId") as? String { print("User Id: \(testUserId)") }
источник
Группы приложений, согласно моей интерпретации существующей документации, в первую очередь предназначены для расширений, а точнее для виджетов. Виджеты - это отдельный пакет приложений, сосуществующий с вашим приложением. Поскольку они представляют собой отдельное приложение и, следовательно, имеют собственную песочницу, вам нужно будет использовать группы приложений для обмена файлами.
После некоторого заголовка grep'ing, я думаю, что обнаружил, что API необходим, но на самом деле он был добавлен как часть iOS 7.
NSFileManager
есть метод, вcontainerURLForSecurityApplicationGroupIdentifier:
котором вы можете передать идентификатор, который вы создали при включении групп приложений для своих приложений:NSURL *containerURL = [[NSFileManager defaultManager] containerURLForSecurityApplicationGroupIdentifier:@"group.com.company.app"];
источник
NSUserDefaults
к работе. Я считаю, что это ошибка Beta 1.NSUserDefaults
базы данных. Смотрите мой ответ.Одна из важных ловушек, в которую я сегодня попался, заключается в следующем:
Во многих проектах я видел одну цель приложения и с разными идентификаторами пакетов, установленными для каждой конфигурации этой цели. Здесь все запутывается. Разработчики намеревались создать приложение отладки для конфигурации отладки и производственное приложение для целевой версии.
Если вы это сделаете, оба приложения будут использовать одни и те же NSUserDefaults, когда они настроены так
var userDefaults = NSUserDefaults(suiteName: "group.com.company.myApp") userDefaults!.setObject("user12345", forKey: "userId") userDefaults!.synchronize()
Это вызывает проблемы во многих местах:
В общем случае решение этой проблемы состоит в том, чтобы префикс ключей по умолчанию с текущей созданной конфигурацией. Вы можете легко обнаружить конфигурацию во время выполнения, установив различные идентификаторы пакетов для ваших конфигураций. Затем просто прочтите идентификатор пакета из
NSBundle.mainBundle()
. Если у вас одинаковые идентификаторы пакета, вам необходимо установить разные макросы препроцессора, например#ifdef DEBUG NSString* configuration = @"debug"; #elif RELEASE NSString* configuration = @"release"; #endif
В Swift это будет выглядеть почти так же:
#if DEBUG let configuration = "debug" #elseif RELEASE let configuration = "release" #endif
источник
NSUserDefaults.standardUserDefaults()
для данных, которые не должны передаваться.Хранить
let shared: NSUserDefaults = NSUserDefaults(suiteName: "group.abcapp")! shared.setObject("abc.png", forKey: "favEmoji") shared.synchronize()
источник