Nie udało się odczytać wartości w CFPrefsPlistSource iOS 10

86

Zaktualizowałem dziś mój Xcode 8 do wersji beta 2 i próbuję udostępniać dane między aplikacją a rozszerzeniem Today. Mam do czynienia z tym ostrzeżeniem dziennika:

2016-07-08 18: 00: 24.732472 ProjetctX [941: 42801] [Ustawienia domyślne użytkownika] Nie można odczytać wartości w CFPrefsPlistSource <0x1700f1280> (domena: group.xpto, użytkownik: kCFPreferencesAnyUser, ByHost: tak, kontener: (null)) : Używanie kCFPreferencesAnyUser z kontenerem jest dozwolone tylko dla kontenerów systemowych, odłączanie od cfprefsd

Czy ktoś może mi pomóc?

Klevison
źródło
7
mam ten sam problem w mojej aplikacji
Pravin Kamble
@PravinKamble Otrzymałem ten błąd, ale mam dostęp do wszystkiego (grupa aplikacji ustawień domyślnych użytkownika).
Klevison
1
zmieniając cel wdrożenia na 9.3, będzie działał idealnie na urządzeniu, ale nie będzie działał z iOS 10 Będę szukał rozwiązania Zostanie tutaj opublikowany, jak tylko znajdę rozwiązanie
Pravin Kamble
@PravinKamble czy stworzyłeś swój projekt przy użyciu Xcode 8 beta 2?
Klevison,
Dostaję to samo, używając wspólnych ustawień domyślnych z XCode 8 beta 4.
Gruntcakes

Odpowiedzi:

76

W rzeczywistości jest to fałszywe ostrzeżenie, które zostało wprowadzone w iOS 10 i macOS 10.12:

Wskazówka NSUserDefaults: w obecnych systemach operacyjnych jest zarejestrowany błąd „… z kontenerem jest dozwolone tylko dla kontenerów systemowych…”.

To jest fałszywe.

Próbując złapać określony tryb awarii, jednocześnie przechwycono przypadek normalnej pracy.

Mój następca w UserDefaults również nie znalazł sposobu, aby uczynić to mniej niepokojącym bez uniemożliwienia debugowania objawowego przypadku: /

https://twitter.com/Catfish_Man/status/784460565972332544 [wątek]

Porada dotycząca dołączenia identyfikatora zespołu na początku wyciszy ostrzeżenie, ale utworzy również nowe, puste wartości domyślne użytkownika. Spowoduje to, że wszystkie wcześniej zapisane dane staną się nieczytelne.

Na razie rozwiązaniem jest po prostu zignorowanie tego.

Ponadto członek zespołu Apple CFM na forach :

Zarejestrowana wiadomość jest fałszywa, chyba że robisz bardzo konkretne rzeczy, które moim zdaniem nie są możliwe bez użycia funkcji prywatnych (został dodany, aby wykryć niewłaściwe użycie tych funkcji, ale niestety wychwycono również normalny przypadek użycia).

waltflanagan
źródło
1
Próbowałem utworzyć grupę aplikacji, która zaczyna się od identyfikatora zespołu, ale wymusza na niej rozpoczęcie od „grupy”. Więc - czy te dwa nie powinny pasować ???
SAHM
3
Widzę te komunikaty dziennika w High Sierra. Podanie numeru identyfikacyjnego zespołu na początku nie ucisza ostrzeżenia. Czy Apple zamierza to naprawić?
mschmidt
1
Przepraszam, czy możesz to rozwinąć? „dołącz swój identyfikator zespołu” do czego?
Motti Shneor
19

Oto jak używać funkcji UserDefaults z grupami aplikacji do przekazywania danych między główną aplikacją a rozszerzeniem:

  1. W aplikacji głównej wybierz projekt w Nawigatorze projektów.

  2. Wybierz główny cel aplikacji i wybierz kartę Możliwości.

  3. Przełącz przełącznik Grupy aplikacji na WŁ. Spowoduje to komunikację z portalem dla programistów w celu wygenerowania zestawu uprawnień.

  4. Utwórz nowy kontener. Według Apple identyfikator kontenera musi zaczynać się od „group”, więc nazwa taka jak „group.io.intrepid.myapp” jest idealna.

  5. Wybierz docelowe rozszerzenie i powtórz proces włączania grup aplikacji. Nie twórz nowej grupy aplikacji, po prostu wybierz grupę, która została właśnie utworzona w głównym celu aplikacji.

  6. Podczas czytania lub pisania UserDefaults w aplikacji lub rozszerzeniu nie uzyskuj dostępu UserDefaults.standard. Zamiast tego użyj UserDefaults(suiteName: "group.io.intrepid.myapp"). Uwaga: nazwa pakietu to nazwa kontenera grupy aplikacji utworzonego w kroku 4.

Upewnij się, że włącz grupę i użyj tego samego identyfikatora grupy dla sekcji rozszerzeń i funkcji aplikacji!

Kredyt trafia do http://blog.intrepid.io/ios-app-extensions

Arfan Mirza
źródło
"po prostu wybierz grupę, która została właśnie utworzona w głównym celu aplikacji" => Co zrobić, gdy się nie pojawiła?
user3722523
włącz i wybierz tę samą grupę również w rozszerzeniu!
Arfan Mirza
Powtarzam, jak wybrać tę samą grupę, jeśli zaznaczenie jest puste w rozszerzeniu ???
user3722523
Kiedy przełączasz / włączasz grupy w sekcji Zgodność, to automatycznie wyświetla listę grup, jeśli nie jest wyświetlana, sprawdź zespół (konto programisty podpisującego), zespół również potrzebuje tego samego! Ustaw zespół i ponownie przełączaj grupy!
Arfan Mirza
nadal nie działa ... jednak z projektem iOS działa. Utworzyłem wątek: stackoverflow.com/questions/44914304/ ...
user3722523
3

SuiteName (postfix) nie może być głównym identyfikatorem pakietu.

Emmanuel Sellier
źródło
3

Zmień nazwę grupy w uprawnieniach Xcode z:

group.com.mycompany.myapp

Do

group.MYTEAMID.com.mycompany.myapp

ps: możesz znaleźć swój MYTEAMID w członkostwie developer.apple.com

Santiago
źródło
3

Rozwiązaniem dla mnie było nie używać tego samego identyfikatora dla identyfikatora pakietu aplikacji i części po „grupie”.

Powiedzmy, że identyfikator pakietu aplikacji to „com.app.id”, a identyfikator grupy to „group.com.app.id” powoduje problemy. Po zmianie na „group.com.app.id.something” program się zatrzymuje.

Witalij Baum
źródło
0

Buduj za pomocą Xcode 8.1 Beta, a zobaczysz to samo ostrzeżenie, ale otrzymasz także wartość.

raz0r
źródło
0

Mam ten sam problem, gdy próbuję użyć initWithSuiteName. Wygląda na to, że to błąd firmy Apple. Jedynym rozwiązaniem / obejściem, które znalazłem, jest zresetowanie wszystkich ustawień urządzenia. Przejdź do Ustawienia -> Ogólne -> Resetuj -> Resetuj wszystkie ustawienia.

Nie usuwa to żadnej zawartości z iPhone'a, po prostu usuwa wszystkie ustawienia. Po zresetowaniu ustawień wszystko działało dobrze. Daj mi znać, jeśli to też ci pomoże.

Sagar D.
źródło
-3

jeśli napotkasz ten problem podczas próby zapisania danych w rozszerzeniu APP przy użyciu userDefault, być może napisałeś ten kod:

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

Ten kod resetuje domyślnie userDefault.

Właściwie prawidłowy kod to:

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

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

H u Y i g
źródło
-10

Zmień z

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

do

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

Gdzie nnnnnnnnnjest numer twojego zespołu, ten, którego używasz do podpisania kodu.

Przetestowany pod Xcode 8 GM i iOS 10 GM i działał!

tytan
źródło
2
Czy powinniśmy używać „nnnnnnnnnn.group.com.xxx.xxx” również do pisania w głównej aplikacji, czy po prostu używać identyfikatora zespołu w rozszerzeniu? Wydaje mi się, że dodanie identyfikatora zespołu powoduje wyciągnięcie pustego konta UserDeaults bez danych zapisanych w „group.com.xxx.xxx” w mojej aplikacji. Naprawdę mam nadzieję, że jest to poprawione, ponieważ blokuje moją aktualizację iOS 10.
timgcarlson
2
Dane nadal nie są synchronizowane. Błąd znika.
Jeet
3
obecnie wygląda na to, że ten błąd nie dotyczy aplikacji. Ale jeśli dodajesz identyfikator zespołu, brakuje błędu, ale nie można pobrać danych.
scorpiozj
4
To nie jest dobra odpowiedź. Możesz umieścić cokolwiek innego i pominąć błąd jako pomoc przy zmianie klucza.
kokluch
Nie działa w moim przypadku, błąd znika, ale dane nie są pobierane
TibiaZ