Невозможно прочитать 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()

Не считывайте значение сразу же после записи в пользовательские значения по умолчанию, потому что, во-первых, это значение известно в коде, а во-вторых, процесс синхронизации базы данных работает асинхронно.

Это означает, что считывание значения обратно ненадежно.

Другие вопросы по тегам