Хранение bool в общих NSUserDefaults всегда возвращает false

Я настроил группы приложений для своего приложения, чтобы иметь доступ к одному и тому же NSUserDefaults в приложении и в моем расширении клавиатуры. У меня есть проблема. Я могу успешно записать логическое значение по умолчанию, но когда я обращаюсь к нему с клавиатуры, оно всегда возвращает false. Я точно знаю, что идентификатор, который он использует для ключа, и имя набора совпадают. Я убедился, что группы приложений действительно включены как для приложения, так и для клавиатуры, а имя пакета точно соответствует идентификатору группы приложений. Что может привести к тому, что при доступе с клавиатуры всегда будет false?

В приложении:

NSUserDefaults *SharedDefaults = [[NSUserDefaults alloc] initWithSuiteName:@"group.com.myname.sharedPrefsName"];
[SharedDefaults setBool:YES forKey:@"com.myname.appname.dataName"];
[SharedDefaults synchronize];

Я подтвердил, что при следующем запуске приложения он успешно установил значение YES:

NSUserDefaults *SharedDefaults = [[NSUserDefaults alloc] initWithSuiteName:@"group.com.myname.sharedPrefsName"];
BOOL dataIsYes = [SharedDefaults boolForKey:@"com.myname.appname.dataName"]; //YES

Но на клавиатуре всегда ложно:

let sharedprefs = NSUserDefaults(suiteName: "group.com.myname.sharedPrefsName")!
let data = sharedprefs.boolForKey("com.myname.appname.dataName") //false

person Jordan H    schedule 23.11.2014    source источник


Ответы (2)


Я нашел ответ в руководстве по программированию расширений приложений< /а>.

По умолчанию клавиатура не имеет доступа к сети и не может совместно использовать контейнер с содержащим ее приложением. Чтобы включить эти возможности, задайте для логического ключа RequestsOpenAccess в файле Info.plist значение YES.

Чтобы решить эту проблему, мне пришлось изменить поле RequestsOpenAccess на YES в Info.plist клавиатуры > NSExtension > NSExtensionAttributes > RequestOpenAccess. Затем удалите клавиатуру в настройках, удалите приложение, запустите его снова и снова добавьте клавиатуру. Затем обязательно нажмите на название клавиатуры, а затем переведите переключатель в положение «Разрешить полный доступ».

Если пользователи не включат полный доступ, расширение по-прежнему сможет получить доступ к общему контейнеру (только для iOS 8.3+), но не сможет писать в него по соображениям безопасности и конфиденциальности. В 8.2- вы не можете читать из него без открытого доступа.

person Jordan H    schedule 23.11.2014

Не используйте alloc/init для NSUserDefaults. Это синглтон. Вы должны использовать метод класса standardUserDefaults, чтобы получить указатель на общий объект по умолчанию пользователя:

NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
person Duncan C    schedule 23.11.2014
comment
Стандартные пользовательские значения по умолчанию не совпадают при доступе из приложения и клавиатуры — это два разных контейнера, поэтому вам необходимо инициализировать значения по умолчанию с одним и тем же именем пакета. - person Jordan H; 24.11.2014