Невозможно прочитать NSUserDefaults группы приложений, но можно записать в него
У меня действительно странная проблема при разработке расширения блокировщика контента. Я пытаюсь обмениваться данными между ним и моим приложением, используя NSUserDefaults с группой приложений, но чтение чего-либо из группы приложений всегда приводит к сбою расширения.
Вот пример кода, который работает:
func beginRequestWithExtensionContext(context: NSExtensionContext) {
NSUserDefaults(suiteName: "group.Bug")!.setBool(true, forKey: "here")
NSUserDefaults(suiteName: "group.Bug")!.synchronize()
let attachment = NSItemProvider(contentsOfURL: NSBundle.mainBundle().URLForResource("blockerList", withExtension: "json"))!
let item = NSExtensionItem()
item.attachments = [attachment]
context.completeRequestReturningItems([item], completionHandler: nil);
}
Расширение не возвращает ошибку, и я могу прочитать here
в моем приложении.
Вот то же самое с еще одной строкой, пытающейся прочитать значение, которое я только что установил:
func beginRequestWithExtensionContext(context: NSExtensionContext) {
NSUserDefaults(suiteName: "group.Bug")!.setBool(true, forKey: "here")
NSUserDefaults(suiteName: "group.Bug")!.synchronize()
NSLog("%@", (NSUserDefaults(suiteName: "group.Bug")!.boolForKey("here")))
let attachment = NSItemProvider(contentsOfURL: NSBundle.mainBundle().URLForResource("blockerList", withExtension: "json"))!
let item = NSExtensionItem()
item.attachments = [attachment]
context.completeRequestReturningItems([item], completionHandler: nil);
}
Возвращается Optional(Error Domain=ContentBlockerErrorDomain Code=3 "(null)")
,
Проблема возникает только при запуске кода на реальном устройстве, оно работает на симуляторе. Кто-нибудь знает, что может быть источником проблемы?
2 ответа
При записи данных в NSUserDefaults
не забудь NSUserDefaults( ).synchronize()
Не считывайте значение сразу же после записи в пользовательские значения по умолчанию, потому что, во-первых, это значение известно в коде, а во-вторых, процесс синхронизации базы данных работает асинхронно.
Это означает, что считывание значения обратно ненадежно.