Значения не всегда сохраняются в группе приложений между сопутствующим приложением и расширением приложения.

Время от времени, но не всегда (у меня это работало некоторое время), приложение/расширение переходит в состояние, когда я не могу прочитать флаг, установленный в моей группе приложений между моим сопутствующим приложением и моим расширением приложения. Не знаю, как он попадает в это состояние или почему значения различаются, но для моего приложения критично, чтобы они всегда были синхронизированы.

Просмотр сопутствующего приложенияDidLoad:

NSUserDefaults *myAppSettings = [[NSUserDefaults alloc] initWithSuiteName:@"group.myapp"];

.....

[myAppSettings setBool:true forKey:@"myBool"];

[myAppSettings synchronize];

NSLog([myAppSettings boolForKey:@"myBool"] ? @"Companion app - bool TRUE" : @"Companion app - bool FALSE");

ViewDidLoad расширения приложения

NSUserDefaults *myAppSettings = [[NSUserDefaults alloc] initWithSuiteName:@"group.myapp"];

[myAppSettings synchronize];

NSLog([myAppSettings boolForKey:@"myBool"] ? @"App extension app - bool TRUE" : @"App extension - bool FALSE");

Консольный вывод

Companion app - bool TRUE
App extension - bool FALSE

Я также синхронизирую, прежде чем мое приложение-компаньон перейдет в фоновый режим. У меня есть группа приложений, настроенная на портале и т. д.

Что я делаю неправильно?

ИЗМЕНИТЬ

Очевидно, у других тоже есть эта проблема: https://devforums.apple.com/message/977151#977151< /а>

«Я думаю, что в настоящее время это очень глючит.

Иногда обмен данными работает, затем происходит изменение, и вдруг виджет больше не может видеть общие данные (как на симуляторе, так и на устройстве).

Раздражает, и надеюсь, что в следующей бета-версии он станет немного надежнее!»

EDIT 2 Похоже, что другой человек также сообщил об этой проблеме:

«Я тоже заметил то же самое. Это происходит не только с NSUserDefaults, но и со всеми файлами в папке контейнера. Расширение клавиатуры внезапно потеряет разрешение на чтение/запись в папку контейнера после использования клавиатуры некоторое время».

ИЗМЕНИТЬ 3 Дополнительные доказательства: https://devforums.apple.com/message/1028078#1028078

После обновления до бета-версии 3 я заметил, что иногда клавиатура не может открыть базу данных, потому что ей не удается получить доступ к файлу БД. Клавиатура могла получить доступ к файлу раньше.

введите здесь описание изображениявведите здесь описание изображения

ИЗМЕНИТЬ 4

Похоже, это может быть из-за того, что клавиатура теряет флаг RequestsOpenAccess. Но я не могу воспроизвести его, и я не могу сказать наверняка.

ИЗМЕНИТЬ 5

Похоже, другие сообщают об этом в сборке iOS8 GM:

Эта проблема все еще сохраняется для меня в GM. Кажется, это связано со сбоем клавиатуры... но также, похоже, между клавиатурой и содержащим приложением есть некоторые разногласия в отношении того, кто создает набор и в каком порядке. Я думаю, что эта проблема на стороне Apple. Поверьте мне, я ХОЧУ, чтобы это была моя вина, но я провел бесчисленное количество часов методом проб и ошибок. Независимо от того, что я делаю в коде и проверяю с помощью NSLog, в конечном итоге он окажется в этом состоянии. Надеюсь, кто-нибудь найдет волшебную таблетку. :С

Кто-нибудь решил это еще?


person barfoon    schedule 07.08.2014    source источник
comment
у вас это помечено как iOS 8. проблема именно в этом?   -  person Brad Allred    schedule 09.08.2014
comment
Да — это относится к расширениям приложений, которые есть только в iOS 8.   -  person barfoon    schedule 09.08.2014
comment
Насколько я могу судить, вы все делаете правильно, это определенно пахнет ошибкой Apple :[   -  person Chris Wagner    schedule 13.08.2014
comment
Я не могу заставить это работать и для расширения клавиатуры, используя Gold Master Xcode и iOS 8. Очень расстраивает. Тестировал на устройстве и ни разу не видел, чтобы это работало. Только что попробовал на симуляторе, все заработало, но не очень обнадеживает. Кому-нибудь повезло?   -  person Jared Egan    schedule 11.09.2014
comment
Здесь как у Джареда Игана   -  person Ethan Long    schedule 11.09.2014
comment
Я думаю, что это должно быть ошибка Apple. Изучив примечания к выпуску iOS 8, вы узнаете, что включено для клавиатур. Доступ к сети необходим для совместного использования хранилища данных. Известные проблемы с клавиатурами. Доступ к сети отключается после добавления новой клавиатуры из того же комплекта. Пользовательские клавиатуры могут стать пустыми после переключения приложений. Обходной путь: закройте клавиатуру и откройте ее снова; это должно перезагрузить представление. developer.apple.com/library/ предварительная/ios/releasenotes/общая/   -  person Jared Egan    schedule 15.09.2014
comment
Просто мысль: пытались ли вы переместить код расширения приложения в viewDidAppear или viewWillAppear?   -  person carlodurso    schedule 04.11.2014


Ответы (2)


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

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

Убедитесь, что вы изменили поле RequestsOpenAccess на YES. Вы найдете его в Info.plist клавиатуры > NSExtension > NSExtensionAttributes > RequestOpenAccess. Затем удалите клавиатуру в настройках, удалите приложение, запустите его снова и снова добавьте клавиатуру. После того, как вы добавите его, нажмите на название клавиатуры, а затем переверните переключатель, чтобы включить «Разрешить полный доступ». Вам нужно будет проинструктировать пользователей выполнить те же шаги, чтобы предоставить доступ (и заверить их, что вы не злодей), иначе это просто не сработает, и вы никогда не получите данные, хранящиеся в вашем общем контейнере. Обратите внимание, что в iOS 8.3+, если пользователь не включил полный доступ, клавиатура сможет получить доступ к общему контейнеру, но запись в него не сохранит данные в целях безопасности и конфиденциальности. В версии 8.2 вы не можете получить доступ к этим данным без предоставления открытого доступа.

person Jordan H    schedule 23.11.2014

Я могу подтвердить, что проблема связана с флагом RequestsOpenAccess. Предполагая, что все сделано правильно (NSUserDefaults использует initWithSuiteName, установлены все возможности для основного приложения и пользовательской клавиатуры и т. д.), у меня есть следующие шаги:

1) Установите основное приложение и пользовательскую клавиатуру на устройство

2) Установите для параметра Разрешить полный доступ для пользовательской клавиатуры значение YES.

3) Добавьте некоторые элементы (в моем случае это простые текстовые шаблоны) в основное приложение.

4) Перейдите на клавиатуру и убедитесь, что все элементы, которые были добавлены из основного приложения, появились в пользовательской клавиатуре.

5) Перейдите в главное приложение и добавьте еще несколько элементов.

6) Перейдите на клавиатуру и теперь вы увидите, что ничего не изменилось

7) Перейдите в настройки и установите для параметра "Разрешить полный доступ" значение НЕТ, а затем значение ДА.

8) Снова перейдите на пользовательскую клавиатуру и проверьте, появился ли элемент, который был добавлен на шаге 5.

person Sapozhnik Ivan    schedule 04.05.2015