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

86

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

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

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

Клевисон
источник
7
У меня такая же проблема в моем приложении
Pravin Kamble
@PravinKamble Я получил эту ошибку, но я могу получить доступ ко всему (группа приложений по умолчанию).
Klevison
1
изменение цели развертывания на 9.3, он будет отлично работать на устройстве, но он не будет работать с iOS 10, я буду искать решение, я опубликую здесь, как только найду решение
Правин Камбл
@PravinKamble, вы создали свой проект, используя Xcode 8 beta 2?
Klevison
Я получаю то же самое, используя общие настройки по умолчанию с XCode 8 beta 4.
Gruntcakes

Ответы:

76

На самом деле это ложное предупреждение, появившееся в iOS 10 и macOS 10.12:

Совет NSUserDefaults: в текущих ОС регистрируется ошибка «… с контейнером разрешено только для системных контейнеров…».

Это подделка.

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

Мой преемник по UserDefaults также не нашел способа сделать это менее тревожным, не сделав симптоматический случай невозможным для отладки: /

https://twitter.com/Catfish_Man/status/784460565972332544 [поток]

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

На данный момент решение - просто игнорировать это.

Также сотрудник Apple CFM на форумах :

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

Waltflanagan
источник
1
Я попытался создать группу приложений, которая начинается с идентификатора команды, но он заставляет ее начинаться с «группы». Итак - эти двое не должны совпадать ???
SAHM 01
3
Я вижу это сообщение журнала на High Sierra. Предварение командного идентификатора никак не заглушить предупреждение для меня. Планирует ли Apple это исправить?
mschmidt 02
1
Извините, не могли бы вы уточнить? "добавить идентификатор вашей команды" к чему?
Мотти Шнеор 07
19

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

  1. В основном приложении выберите свой проект в Project Navigator.

  2. Выберите основное целевое приложение и перейдите на вкладку «Возможности».

  3. Установите переключатель "Группы приложений" в положение ВКЛ. Это свяжется с порталом разработчика для создания набора прав.

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

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

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

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

Кредит идет на http://blog.intrepid.io/ios-app-extensions

Арфан Мирза
источник
"просто выберите группу, которая только что была создана в основной цели приложения" => Что делать, если она не появилась ??
user3722523 04
включить и выбрать ту же группу в расширении!
Arfan Mirza 04
Повторяю, как выбрать такую ​​же группу, если в расширении выделение пусто ???
user3722523 04
Когда вы переключаете / включаете группы в разделе «Совместимость», он автоматически отображает список групп, если он не отображается, проверьте команду (учетная запись разработчика подписи), команде также нужно то же самое! Снова установите команду и переключите группы!
Arfan Mirza 04
он все еще не работает ... однако с проектом iOS он работает. Я создал
ветку
4

Также была такая же проблема с моим приложением macOS.

Решил: Перезагрузите устройство!

https://stackoverflow.com/a/39876271

Jxtt
источник
Удивительно, но это помогло. Благодарность!
DmitryKanunnikoff
3

SuiteName (постфикс) не должен быть основным идентификатором пакета.

Эммануэль Селье
источник
3

Измените имя группы в правах Xcode с:

group.com.mycompany.myapp

Чтобы

group.MYTEAMID.com.mycompany.myapp

ps: вы можете найти свой MYTEAMID в членстве на developer.apple.com

Сантьяго
источник
3

Для меня решением было не использовать один и тот же идентификатор для идентификатора пакета приложения и части после «group.».

Скажем, идентификатор пакета приложений - com.app.id, а идентификатор группы - group.com.app.id вызывает проблемы. После того, как я меняю его на «group.com.app.id.something», он останавливается.

Виталий Баум
источник
0

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

raz0r
источник
0

У меня такая же проблема, когда я пытаюсь использовать initWithSuiteName. Похоже, это ошибка Apple. Единственное решение / обходной путь, который я нашел, - сбросить все настройки устройства. Зайдите в Настройки -> Общие -> Сброс -> Сбросить все настройки.

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

Сагар Д
источник
-3

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

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

Этот код сбрасывает значение по умолчанию userDefault.

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

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

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

H u Y an g
источник
-10

Меняться от

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

к

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

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

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

Титан
источник
2
Должны ли мы использовать nnnnnnnnnn.group.com.xxx.xxx для записи в основном приложении или просто использовать идентификатор команды в расширении? Для меня добавление идентификатора команды приводит к появлению пустого значения UserDeaults без каких-либо данных, которые я сохранил в «group.com.xxx.xxx» в моем приложении. Очень надеюсь, что это исправление, так как оно блокирует мое обновление iOS 10.
timgcarlson 08
2
Данные по-прежнему не синхронизируются. Ошибка исчезнет.
Jeet
3
в настоящее время кажется, что эта ошибка не влияет на приложение. Но при добавлении идентификатора команды ошибка отсутствует, но данные не могут быть получены.
scorpiozj
4
Это нехорошие ответы. Вы бы поместили что-нибудь еще и пропустили ошибку, чтобы помочь вам изменить ключ.
kokluch
Не работает в моем случае, ошибка исчезает, но данные не
загружаются