NSUserDefaults не сохраняет значения между приложением и пользовательской клавиатурой в iOS 8

Я пытаюсь обмениваться данными между своим приложением и пользовательским расширением клавиатуры. Я включил группы приложений как в основном целевом приложении, так и в настраиваемой клавиатуре. В моем основном приложении я добавляю объект со следующим:

NSUserDefaults *userDefaults = [[NSUserDefaults alloc] initWithSuiteName:@"group.mycompany.myapp"];
[userDefaults setObject:someObject forKey:@"KEY"];

Распечатка [userDefaults DictionRepresentation] в консоли показывает, что этот объект был сохранен, как и вызов [userDefaults objectForKey:@"KEY"].

Однако, когда я пытаюсь получить доступ к этому объекту в пользовательском расширении клавиатуры:

NSUserDefaults *userDefaults = [[NSUserDefaults alloc] initWithSuiteName:@"group.mycompany.myapp"];
NSString *value = [userDefaults objectForKey:@"KEY"];

Значение равно nil, и вызов [userDefaults DictionRepresentation] не показывает запись, которая была сохранена выше. Я использую Xcode 6 beta 3. Есть идеи?

ОБНОВЛЕНИЕ Исправлено в Xcode 6 beta 5


person bdev    schedule 16.07.2014    source источник
comment
возможный дубликат NSUserDefault с группой приложений не работает в iOS 8 бета 3   -  person Andrew    schedule 20.07.2014
comment
У меня есть XCode 6 beta 5, и проблема все еще сохраняется.   -  person iOS Dev    schedule 11.08.2014


Ответы (5)


Вот несколько возможных решений:

  1. Ваша группа приложений настроена неправильно, или вы используете неправильный идентификатор группы с initWithSuiteName:.

  2. #P3# <блочная цитата> #P4#
  3. Это ошибка.

person Andrew    schedule 19.07.2014
comment
Спасибо за ваш ответ! Я трижды проверил идентификатор группы - это правильно. Насколько мне известно, группы приложений были настроены правильно (просто выполнили шаги в разделе «Возможности», которые создали права для обеих целей с идентификатором группы). Отличный улов при включении доступа к сети - я изменил RequestsOpenAccess на YES, стер симулятор и переустановил; однако проблема все еще сохраняется. Я надеюсь, что это ошибка! Тестирование на Xcode beta 4 скоро... тогда будет обновление. - person bdev; 21.07.2014

  1. Задавать

    RequestsOpenAccess = YES;
    
  2. Настройки:

    NSUserDefaults * usrInfo = [[NSUserDefaults alloc] initWithSuiteName:@"myKeyboard"];
    [usrInfo setObject:theme.icon forKey:@"themeName"];  // This is the new data;
    [usrInfo synchronize]; 
    
  3. Изменение клавиатуры:

    NSUserDefaults * usrInfo = [[NSUserDefaults alloc] initWithSuiteName:@"myKeyboard"];
    [usrInfo synchronize];
    NSString * str = [usrInfo objectForKey:@"themeName"];
    

Затем вы можете изменить клавиатуру, например, изменить ее фон.

person SamSam    schedule 11.09.2014
comment
Есть ли способ получить доступ только для чтения к настройкам с клавиатуры и не запрашивать открытый доступ? - person Kyle Howells; 24.09.2014
comment
Я не нахожу доступ до сих пор. Если получится, скажите, пожалуйста, большое спасибо. - person SamSam; 25.09.2014
comment
У меня такая же проблема, как и у @bdev, но с расширением Watch Kit. AppGroup хорошо работал в бета-версии XCode 6.3, но не в XCode 6.2. Я добавил synchronize, как вы рекомендуете, но это не помогло. - person kelin; 12.03.2015

Я думаю, что имя вашего пакета должно начинаться с группы и соответствовать созданному вами контейнеру (источник).

person Tsvi Tannin    schedule 16.07.2014
comment
Да, в форме group.mycompany.myapp. Я отредактирую свой пост, чтобы сделать это более понятным - person bdev; 16.07.2014

Я обнаружил, что он должен соответствовать следующему формату: group.com.company.appname — у меня было что-то еще, и это не сработало.

person Johnny Rockex    schedule 19.03.2018

Имя вашей группы (как указано в Xcode) должно начинаться с «группы» (например, «group.com.myName.MyApp» (я узнал об этом при создании возможности группы, поскольку поле имени уже заполняется «группой».), а NSUserDefaults suiteName должен начинаться с другой «группы», поэтому «группа» присутствует дважды, например, «group.group.com.myName.MyApp»). узнал об этом, заглянув в папку Library/Preferences приложения, когда оно работало в sim.Ничего там не появилось бы, если бы я не использовал эту схему.

Мне до сих пор не удалось заставить приложение для просмотра увидеть общий файл групповых значений по умолчанию.

person Jeff    schedule 17.09.2015
comment
Начиная с Watch OS 2, возможность общего контейнера была удалена Apple. Это где-то задокументировано, но похоронено. Я потратил десять часов на эту проблему и узнал плохие новости из других постов. - person Jeff; 24.09.2015