Подтвердить что ты не робот

Значения не всегда сохраняются в группе приложений между добавлением приложения и приложения для компаньона

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

Сопутствующее приложение viewDidLoad:

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

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

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

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

РЕДАКТИРОВАТЬ 2 Похоже, что еще один человек сообщил об этой точной проблеме:

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

РЕДАКТИРОВАТЬ 3 Больше доказательств: https://devforums.apple.com/message/1028078#1028078

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

enter image description hereenter image description here

EDIT 4

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

РЕДАКТИРОВАТЬ 5

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

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

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

4b9b3361

Ответ 1

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

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

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

Ответ 2

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

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

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

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

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

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

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

7) Перейдите к настройкам и переключите "Разрешить полный доступ" на NO, а затем на YES

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