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


86

Сьогодні я оновив свій Xcode 8 до бета-версії 2 і намагаюся обмінюватися даними між додатком і розширенням сьогодні. Я стикаюся з цим попередженням про журнал:

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

Хто-небудь може мені допомогти?


7
у мене з цим самим випуском у моєму додатку
Pravin Kamble

@PravinKamble Я отримав цю помилку, але я можу отримати доступ до всього (група додатків за замовчуванням).
Klevison

1
змінивши ціль розгортання на 9.3, він буде чудово працювати на пристрої, але він не буде працювати з iOS 10, я буду шукати рішення, я буду розміщувати тут, як тільки знайду рішення
Pravin Kamble

@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 на форумах :

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


1
Я намагався створити групу додатків, яка починається з ідентифікатора команди, але вона змушує її починати з "групи". Тож - чи не повинні вони збігатися ???
SAHM

3
Я бачу цей журнал повідомлень на High Sierra. Попередній ідентифікатор команди для мене не приглушує попередження. Apple має намір це виправити?
mschmidt

1
Вибачте, можете, будь ласка, детальніше сказати? "додати ідентифікатор команди" до чого?
Motti Shneor

19

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

  1. У головному додатку виберіть проект у Навігаторі проектів.

  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

включити та вибрати ту саму групу в розширенні!
Арфан Мірза

Повторюю, як вибрати ту саму групу, якщо виділення порожнє у розширенні ???
user3722523 04

Коли ви перемикаєте / вмикаєте групи в розділі Сумісність, тоді він автоматично показує список груп, якщо не відображається, то перевірте Команда (Підписання облікового запису розробника), Команда також потребує того ж! Встановіть команду та знову перемикайте групи!
Арфан Мірза

він все ще не працює ... однак з проектом iOS він працює. I'v створив нитка: stackoverflow.com/questions/44914304 / ...
user3722523



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, і ви побачите те саме попередження, але також отримаєте значення.


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


-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

2
Дані все одно не синхронізуються. Помилка справді зникає.
Джит

3
наразі ця помилка не впливає на додаток. Але якщо додати ідентифікатор команди, помилка відсутня, але дані не вдається отримати.
scorpiozj

4
Це невдалі відповіді. Ви можете помістити будь-що інше і пропустити помилку як допомогу під час зміни ключа.
kokluch

У моєму випадку не працює, помилка зникає, але дані не отримуються
TibiaZ
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.