Не удалось прочитать значения в CFPrefsPlistSource iOS 10

Я обновил свой Xcode 8 до бета-версии 2 сегодня, и я пытаюсь обмениваться данными между App и Today Extension. Я столкнулся с этим предупреждением журнала:

2016-07-08 18: 00: 24.732472 ProjetctX [941: 42801] [Пользовательские значения по умолчанию] Сбой для чтения значений в CFPrefsPlistSource < 0x1700f1280 > (Домен: group.x.p.t.o, Пользователь: kCFPreferencesAnyUser, ByHost: Да, Контейнер: (null)): Использование kCFPreferencesAnyUser с контейнером разрешено только для системных контейнеров, отсоединение от cfprefsd

Кто-нибудь может мне помочь?

Ответ 1

Это на самом деле ложное предупреждение, появившееся в iOS 10 и macOS 10.12. (Источник: https://twitter.com/Catfish_Man/status/784460565972332544)

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

В настоящее время решение состоит в том, чтобы просто игнорировать его.

Кроме того, сотрудник Apple CFM на форумах:

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

Ответ 2

Вот как использовать NSUserDefaults с группами приложений для передачи данных между вашим основным приложением и вашим расширением:

  • В основном приложении выберите свой проект в Навигаторе проектов.

  • Выберите цель вашего основного приложения и выберите вкладку "Возможности".

  • Переключите переключатель групп приложений в положение ON. Это будет связываться с Портал разработчика для создания набора прав.

  • Создайте новый контейнер. Согласно Apple, ваш идентификатор контейнера должен начните с "group", поэтому имя, например "group.io.intrepid.myapp", совершенны.

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

  • При чтении или записи NSUserDefaults в приложении или в вашем приложении расширения, не обращайтесь к NSUserDefaults.standardUserDefaults(). Вместо этого используйте NSUserDefaults (имя пакета: "group.io.intrepid.myapp" ). Примечание. Имя пакета - это имя вашего контейнера группы приложений, созданного на этапе 4.

Убедитесь, что группа включена и использует тот же идентификатор группы как для раздела расширения, так и для приложений!

Кредит отправляется http://blog.intrepid.io/ios-app-extensions

Ответ 3

Мне приходится сталкиваться с этой же проблемой, когда я пытаюсь использовать initWithSuiteName. Кажется, что это ошибка от Apple. Единственное решение/обходное решение, которое я нашел, - это reset все настройки устройства. Перейдите в Настройки → Общие → reset → reset Все настройки.

Это не удаляет любой контент на iPhone, просто удаляет все настройки. После сброса настроек все работало нормально. Дайте мне знать, если это вам тоже поможет.

Ответ 4

Создайте с помощью Xcode 8.1 Beta, и вы увидите то же предупреждение, но вы также получите значение.

Ответ 5

если вы страдаете этой проблемой при попытке сохранить данные в APP расширения с помощью userDefault, возможно, вы написали этот код:

[[NSUserDefaults standardUserDefaults] initWithSuiteName:@"group.xxx.com"];

Этот код reset по умолчанию userDefault.

Собственно, правильный код:

[[NSUserDefaults alloc] initWithSuiteName:@"group.xxx.com"];

http://www.jianshu.com/p/e782104c3bc3

Ответ 6

Измените

[[NSUserDefaults alloc] initWithSuiteName:@"group.com.xxx.xxx"];

к

[[NSUserDefaults alloc] initWithSuiteName:@"nnnnnnnnnn.group.com.xxx.xxx"]; 

Где nnnnnnnnn - номер вашей команды, который вы используете для подписи кода.

Протестировано под Xcode 8 GM и iOS 10 GM и работает!