Fehler beim Lesen der Werte in CFPrefsPlistSource iOS 10

85

Ich habe meinen Xcode 8 heute auf Beta 2 aktualisiert und versuche, Daten zwischen App und Today Extension auszutauschen. Ich stehe vor dieser Protokollwarnung:

2016-07-08 18: 00: 24.732472 ProjetctX [941: 42801] [Benutzerstandards] Fehler beim Lesen der Werte in CFPrefsPlistSource <0x1700f1280> (Domäne: group.xpto, Benutzer: kCFPreferencesAnyUser, ByHost: Ja, Container: (null)) : Die Verwendung von kCFPreferencesAnyUser mit einem Container ist nur für Systemcontainer zulässig, die von cfprefsd getrennt werden

Kann mir jemand helfen?

Klevison
quelle
7
Ich habe mit dem gleichen Problem in meiner App
Pravin Kamble
@PravinKamble Ich habe diesen Fehler erhalten, kann aber auf alles zugreifen (App-Gruppe der Benutzerstandards).
Klevison
1
Wenn Sie das Bereitstellungsziel auf 9.3 ändern, läuft es perfekt auf dem Gerät, aber es funktioniert nicht mit iOS 10. Ich werde nach einer Lösung suchen. Ich werde hier posten, sobald ich eine Lösung gefunden habe
Pravin Kamble
@PravinKamble Haben Sie Ihr Projekt mit Xcode 8 Beta 2 erstellt?
Klevison
Ich bekomme das gleiche mit gemeinsamen Standardeinstellungen mit XCode 8 Beta 4.
Gruntcakes

Antworten:

75

Dies ist tatsächlich eine falsche Warnung, die in iOS 10 und macOS 10.12 eingeführt wurde:

NSUserDefaults-Tipp: In den aktuellen Betriebssystemen wird der Fehler "... mit einem Container ist nur für Systemcontainer zulässig ..." protokolliert.

Das ist falsch.

Beim Versuch, einen bestimmten Fehlermodus zu erfassen, wurde gleichzeitig ein normaler Betriebsfall erfasst.

Mein Nachfolger bei UserDefaults hat auch keinen Weg gefunden, dies weniger alarmierend zu machen, ohne das Debuggen des symptomatischen Falls unmöglich zu machen: /

https://twitter.com/Catfish_Man/status/784460565972332544 [thread]

Wenn Sie Ihre Team-ID voranstellen, wird die Warnung stummgeschaltet, es werden jedoch auch neue leere Benutzerstandards erstellt. Dies führt dazu, dass zuvor gespeicherte Daten nicht mehr lesbar sind.

Die Lösung besteht vorerst darin, sie zu ignorieren.

Auch Apple-Mitarbeiter CFM in den Foren :

Die protokollierte Nachricht ist falsch, es sei denn, Sie tun ganz bestimmte Dinge, die meiner Meinung nach ohne die Verwendung privater Funktionen nicht möglich sind (sie wurde hinzugefügt, um den Missbrauch dieser Funktionen zu erkennen, hat aber leider auch einen normalen Anwendungsfall festgestellt).

Waltflanagan
quelle
1
Ich habe versucht, eine App-Gruppe zu erstellen, die mit der Team-ID beginnt, aber sie zwingt sie, mit "Gruppe" zu beginnen. Also - sollen die beiden nicht zusammenpassen ???
SAHM
3
Ich sehe diese Protokollnachrichten in High Sierra. Durch das Voranstellen der Team-ID wird die Warnung für mich nicht zum Schweigen gebracht. Beabsichtigt Apple, dies zu beheben?
mschmidt
1
Entschuldigung, können Sie bitte näher darauf eingehen? "Stellen Sie Ihre Team-ID voran" an was?
Motti Shneor
18

So verwenden Sie UserDefaults mit App-Gruppen, um Daten zwischen Ihrer Haupt-App und Ihrer Erweiterung zu übertragen:

  1. Wählen Sie in Ihrer Haupt-App Ihr ​​Projekt im Projektnavigator aus.

  2. Wählen Sie Ihr Hauptziel für die App aus und wählen Sie die Registerkarte Funktionen.

  3. Schalten Sie den App Groups-Schalter auf ON. Dadurch wird mit dem Entwicklerportal kommuniziert, um eine Reihe von Berechtigungen zu generieren.

  4. Erstellen Sie einen neuen Container. Laut Apple muss Ihre Container-ID mit "group" beginnen, daher ist ein Name wie "group.io.intrepid.myapp" perfekt.

  5. Wählen Sie Ihr Erweiterungsziel aus und wiederholen Sie den Vorgang zum Aktivieren von App-Gruppen. Erstellen Sie keine neue App-Gruppe, sondern wählen Sie einfach die Gruppe aus, die gerade im Haupt-App-Ziel erstellt wurde.

  6. Greifen Sie beim Lesen oder Schreiben von UserDefaults in Ihrer App oder Ihrer Erweiterung nicht darauf zu UserDefaults.standard. Verwenden Sie stattdessen UserDefaults(suiteName: "group.io.intrepid.myapp"). Hinweis: Der Suite-Name ist der Name Ihres App-Gruppen-Containers, der in Schritt 4 erstellt wurde.

Stellen Sie sicher, dass die Gruppe aktiviert und dieselbe Gruppen-ID sowohl für den Erweiterungs- als auch für den App-Funktionsbereich verwendet wird!

Das Guthaben geht an http://blog.intrepid.io/ios-app-extensions

Arfan Mirza
quelle
"Wählen Sie einfach die Gruppe aus, die gerade im Haupt-App-Ziel erstellt wurde" => Was tun, wenn sie nicht angezeigt wird?
user3722523
Aktivieren und wählen Sie dieselbe Gruppe auch in der Erweiterung aus!
Arfan Mirza
Ich wiederhole, wie man dieselbe Gruppe auswählt, wenn die Auswahl in der Erweiterung leer ist ???
user3722523
Wenn Sie Gruppen im Abschnitt Kompatibilität umschalten / aktivieren, wird automatisch die Liste der Gruppen angezeigt. Wenn dies nicht angezeigt wird, überprüfen Sie das Team (Entwicklerkonto signieren). Das Team benötigt dasselbe! Setze Team und schalte Gruppen wieder um!
Arfan Mirza
es funktioniert immer noch nicht ... aber mit iOS-Projekt funktioniert es. Ich habe einen Thread erstellt: stackoverflow.com/questions/44914304/…
user3722523
4

Hatte auch das gleiche Problem mit meiner macOS App.

Gelöst durch: Starten Sie das Gerät neu!

https://stackoverflow.com/a/39876271

Jxtt
quelle
Überraschenderweise hat es geholfen. Vielen Dank!
DmitryKanunnikoff
3

Der SuiteName (Postfix) darf nicht die Haupt-Bundle-ID sein.

Emmanuel Sellier
quelle
3

Ändern Sie Ihren Gruppennamen in Xcode-Berechtigungen von:

group.com.mycompany.myapp

Zu

group.MYTEAMID.com.mycompany.myapp

ps: Sie finden Ihre MYTEAMID in der Mitgliedschaft bei developer.apple.com

Santiago
quelle
3

Die Lösung für mich bestand darin, nicht denselben Bezeichner für den Bundle-Bezeichner der Anwendung und den Teil nach "Gruppe" zu verwenden.

Angenommen, die App-Bundle-ID lautet "com.app.id", und die Gruppen-ID "group.com.app.id" verursacht Probleme. Nachdem ich es in "group.com.app.id.something" geändert habe, wird es gestoppt.

Vitaly Baum
quelle
0

Wenn Sie mit Xcode 8.1 Beta erstellen, wird dieselbe Warnung angezeigt, aber Sie erhalten auch den Wert.

raz0r
quelle
0

Ich habe das gleiche Problem, wenn ich versuche, initWithSuiteName zu verwenden. Scheint, dass dies ein Fehler von Apple ist. Die einzige Lösung / Problemumgehung, die ich gefunden habe, besteht darin, alle Einstellungen des Geräts zurückzusetzen. Gehen Sie zu Einstellungen -> Allgemein -> Zurücksetzen -> Alle Einstellungen zurücksetzen.

Dadurch werden keine Inhalte auf dem iPhone gelöscht, sondern alle Einstellungen gelöscht. Nach dem Zurücksetzen der Einstellung funktionierte alles einwandfrei. Lassen Sie mich wissen, ob es Ihnen auch hilft.

Sagar D.
quelle
-3

Wenn Sie dieses Problem haben, wenn Sie versuchen, Daten mithilfe von in der Erweiterungs-APP zu speichern userDefault, haben Sie möglicherweise diesen Code geschrieben:

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

Dieser Code setzt die Standardeinstellungen zurück userDefault.

Eigentlich ist der richtige Code:

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

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

H u Y an g
quelle
-10

Wechsel von

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

zu

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

Wo nnnnnnnnnist Ihre Teamnummer, die Sie zum Signieren Ihres Codes verwenden?

Getestet unter Xcode 8 GM und iOS 10 GM und funktioniert!

Titan
quelle
2
Sollen wir "nnnnnnnnnn.group.com.xxx.xxx" auch zum Schreiben in der Haupt-App verwenden oder nur die Team-ID in der Erweiterung verwenden? Für mich scheint das Hinzufügen der Team-ID ein leeres UserDeaults ohne die Daten zu ziehen, die ich in meiner App unter "group.com.xxx.xxx" gespeichert habe. Ich hoffe wirklich, dass es eine Lösung dafür gibt, da es mein iOS 10-Update blockiert.
Timgcarlson
2
Daten werden immer noch nicht synchronisiert. Der Fehler verschwindet.
Jeet
3
Derzeit scheint dieser Fehler keine Auswirkungen auf die App zu haben. Wenn Sie jedoch die Team-ID hinzufügen, fehlt der Fehler, aber die Daten können nicht abgerufen werden.
Scorpiozj
4
Dies ist keine gute Antwort. Sie würden alles andere setzen und den Fehler als Hilfe überspringen, wenn Sie den Schlüssel ändern.
Kokluch
Funktioniert in meinem Fall nicht, der Fehler verschwindet, aber die Daten werden nicht
abgerufen