2014-11-23 9 views
0

Я настроил группы приложений для своего приложения, чтобы получить доступ к тому же NSUserDefaults в приложении и в моем расширении клавиатуры. У меня проблема. Я могу успешно записать логические значения по умолчанию, но когда я обращаюсь к нему на клавиатуре, он всегда возвращает false. Я знаю, что идентификатор, который он использует для ключа, и имя набора - то же самое. Я проверял, что группы приложений действительно включены как для приложения, так и для клавиатуры, а имя набора точно соответствует идентификатору группы приложений. Что может привести к тому, что он всегда будет false при доступе с клавиатуры?Хранение bool в общих NSUserDefaults всегда возвращает 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 

ответ

1

Я нашел ответ в App Extension Programming guide.

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

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

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

-1

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

NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults]; 
+0

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

 Смежные вопросы

  • Нет связанных вопросов^_^