Einfache Möglichkeit, gespeicherte NSUserDefaults anzuzeigen?

225

Gibt es eine Möglichkeit zu sehen, in was NSUserDefaultsdirekt gespeichert wurde ? Ich würde gerne sehen, ob meine Daten korrekt gespeichert wurden.

Ethan
quelle
3
Verwenden Sie diese Option, um den Speicherort Ihres Apps-Verzeichnisses abzurufen: print (NSHomeDirectory ()) von diesem Speicherort aus, gehen Sie zu Bibliothek> Einstellungen> <yourAppsBundleName.plist>. Hier speichert NSUserDefaults Ihre Daten.
Bobby

Antworten:

162

Sie finden die pList-Datei für Ihre App im Simulator unter:

/ users / Ihr Benutzername / Library / Application Support / iPhone Simulator / <Sim-Version> / Applications

Dieses Verzeichnis enthält eine Reihe von GUID-Verzeichnissen. Wenn Sie an einigen Apps arbeiten, gibt es einige davon. Sie müssen also Ihre App-Binärdatei finden:

find . -name foo.app
./1BAB4C83-8E7E-4671-AC36-6043F8A9BFA7/foo.app

Wechseln Sie dann in das Verzeichnis Library / Preferences im GUID-Verzeichnis. So:

cd 1BAB4C83-8E7E-4671-AC35-6043F8A9BFA7/Library/Preferences

Sie sollten eine Datei finden, die wie folgt aussieht:

<Bundle Identifier>.foo.pList

Öffnen Sie dies im pList-Editor und durchsuchen Sie dauerhafte Werte nach Herzenslust.

RedBlueThing
quelle
12
Ich habe festgestellt, dass sich dies in späteren Versionen von XCode geändert hat. Sie finden es jetzt in einem Verzeichnis unter der aktuellen ios-Versionsnummer anstelle von Benutzer - z. B. / Benutzer / Ihr Benutzername / Bibliothek / Anwendungsunterstützung / iPhone Simulator / 4.3 / Anwendungen
Nevster
Interessant ... Wenn Sie OCMock / SenTestingKit-Unit-Tests mit durchführen NSUserDefaults, NSUserDefaultswerden diese nicht in einer .plist-Datei gespeichert, sondern im Speicher verwaltet: stackoverflow.com/questions/6193597/…
ma11hew28
Wie kann ich es für eine bereits installierte Anwendung anzeigen? Mein Client hat die Anwendung aus dem Appstore heruntergeladen, und etwas stimmt nicht. Ich muss die NSUserDefaults-Datei überprüfen
Dejell
Ihr Kunde könnte - wenn Sie mit ihm sprechen können und er etwas versiert ist - ein Tool wie PhoneView verwenden, um Zugriff auf das Dateisystem seines Telefons zu erhalten und die Datei vom Telefon zu kopieren, um sie an Sie zu senden.
Daniel Schneller
13
Der Pfad hat sich geändert zu: ~ / Library / Developer / CoreSimulator / Devices
Brainware
355

Sie können alle aktuellen NSUserDefaults in das Protokoll drucken:

Nur Schlüssel:

NSLog(@"%@", [[[NSUserDefaults standardUserDefaults] dictionaryRepresentation] allKeys]);

Schlüssel und Werte:

NSLog(@"%@", [[NSUserDefaults standardUserDefaults] dictionaryRepresentation]);
Marshn
quelle
1
THX, dieser ist effizienter ~
akustisch
3
Apple könnte hierfür einen einfachen Viewer in XCode erstellen. Wie der Plist Viewer. Aber nein, sie wollen es nicht einfach machen.
GeneCode
78

In Swift können wir Folgendes verwenden: -

Swift 3.x & 4.x.

So erhalten Sie alle Schlüssel und Werte:

for (key, value) in UserDefaults.standard.dictionaryRepresentation() {
    print("\(key) = \(value) \n")
}

So rufen Sie die vollständige Wörterbuchdarstellung der Benutzerstandards ab:

print(Array(UserDefaults.standard.dictionaryRepresentation()))

Zum Abrufen der Schlüssel:

// Using dump since the keys are an array of strings.
dump(Array(UserDefaults.standard.dictionaryRepresentation().keys))

Zum Abrufen der Werte:

Wir können hier auch dump verwenden, aber das gibt die vollständige Vererbungshierarchie jedes Elements im Wertearray zurück. Wenn weitere Informationen zu den Objekten erforderlich sind, verwenden Sie dump, andernfalls fahren Sie mit der normalen print-Anweisung fort.

// dump(Array(UserDefaults.standard.dictionaryRepresentation().values))
print(Array(UserDefaults.standard.dictionaryRepresentation().values))

Swift 2.x.

So rufen Sie die vollständige Wörterbuchdarstellung der Benutzerstandards ab:

print(NSUserDefaults.standardUserDefaults().dictionaryRepresentation())

Zum Abrufen der Schlüssel:

print(NSUserDefaults.standardUserDefaults().dictionaryRepresentation().keys.array)

Zum Abrufen der Werte:

print(NSUserDefaults.standardUserDefaults().dictionaryRepresentation().values.array)
footyapps27
quelle
40

Sie können die Werte für jeden Schlüssel im Array überprüfen, der von zurückgegeben wird

[[[NSUserDefaults standardUserDefaults] dictionaryRepresentation] allKeys]
Morion
quelle
3
Dies funktionierte auch im Debugger mit dem folgenden Befehl: (lldb) "po [[[NSUserDefaults standardUserDefaults] dictionaryRepresentation] allKeys]"
Ethan Parker
21

Ich verwende manchmal das folgende Snippet, um den Speicherort meiner NSUserDefaults-Datei auszudrucken, wenn ich im Simulator ausgeführt werde

NSArray * path = NSSearchPathForDirectoriesInDomains (
   NSLibraryDirectory, NSUserDomainMask, YES);
NSString * folder = [Pfad objectAtIndex: 0];
NSLog (@ "Ihre NSUserDefaults werden in diesem Ordner gespeichert:% @ / Preferences", Ordner);

Es gibt den Pfad zum Einstellungsordner an

Ihre NSUserDefaults werden in folgendem Ordner gespeichert: / Users / Castle / Library / Anwendungsunterstützung / iPhone Simulator / User / Applications / BC5056A0-F46B-4AF1-A6DC-3A7DAB984960 / Library / Preferences

Ihre NSUserDefaults-Datei befindet sich im Einstellungsordner und ist nach Ihrem Präfix und Anwendungsnamen benannt, z

dk.castleandersen.dreamteam.grid.plist

Ich erwarte, dass dies auch für das eigentliche Gerät gilt.

Schloss Niels
quelle
Ich mag diese Antwort. Es ist stabil und wird hoffentlich immer funktionieren!
Lucianoenrico
7

Da der Dateiname plist lautet <app-bundle-identifier>.plist, können Sie findden Pfad mit dem Befehl ermitteln. Es dauert jedoch sehr lange, wenn Sie Ihren gesamten Computer durchsuchen. Daher müssen Sie einen guten Bereich auswählen, z. B. ~/Library/Developer/CoreSimulatorfür Xcode 6.

Beispiel:

find ~/Library/Developer/CoreSimulator -type f -name com.awesome.app.plist

Die Ausgabe wird ungefähr so ​​sein ...

/Users/hlung/Library/Developer/CoreSimulator/Devices/B61913F6-7D7C-4E45-AE2F-F45220A71823/data/Containers/Data/Application/E4CC51CF-11E5-4168-8A74-6BAE3B89998F/Library/Preferences/com.awesome.app.plist

Und von dort aus können Sie openBefehl verwenden. Wenn Sie iTerm2 verwenden , klicken Sie einfach mit der Befehlstaste auf den Pfad, um ihn zu öffnen.

Hlung
quelle
7

In Swift 4.0

//func dictionaryRepresentation() -> [String : AnyObject]

weil dictionaryRepresentation von NSUserDefaults.standardUserDefaults () [String: AnyObject] zurückgibt

Wir werfen es in eine NSDictionary. Wenn wir es dann in Klammern '()' umgeben, können wir .allKeys oder .allValues ​​wie in jedem NSDictionary aufrufen

 print((UserDefaults.standard.dictionaryRepresentation() as NSDictionary).allKeys)
RyanTCB
quelle
6

Verwenden Sie den folgenden Code.

NSLog(@"NSUserDefault: %@", [[NSUserDefaults standardUserDefaults] dictionaryRepresentation]);
Mr.Javed Multani
quelle
Brillant! Interessant, wie die besten Antworten normalerweise die kürzesten sind. In seltenen Fällen ist das Navigieren in Verzeichnissen im Terminalmodus erforderlich. Offensichtlich nähern sich die Geeks wie die Hintertür, vielleicht der heimliche Hacker in ihnen?
John
Danke, aber ich kann dich nicht kriegen. Was du sagen willst?
Mr.Javed Multani
5

Für OS X-Anwendungen ist es einfacher, das defaultsBefehlszeilenprogramm zu verwenden, als die Standard-Plist-Datei der Anwendung zu finden .

NAME

 defaults -- access the Mac OS X user defaults system

ZUSAMMENFASSUNG

 defaults [-currentHost | -host hostname] read [domain [key]]

 defaults [-currentHost | -host hostname] read-type domain key

 defaults [-currentHost | -host hostname] write domain { 'plist' | key 'value' }

 defaults [-currentHost | -host hostname] rename domain old_key new_key

 defaults [-currentHost | -host hostname] delete [domain [key]]

 defaults [-currentHost | -host hostname] { domains | find word | help }

BESCHREIBUNG

defaultsErmöglicht Benutzern das Lesen, Schreiben und Löschen von Mac OS X-Benutzerstandards über eine Befehlszeilen-Shell. Mac OS X-Anwendungen und andere Programme verwenden das Standardsystem, um Benutzereinstellungen und andere Informationen aufzuzeichnen, die beibehalten werden müssen, wenn die Anwendungen nicht ausgeführt werden (z. B. Standardschriftart für neue Dokumente oder Position eines Infofensters). Viele dieser Informationen sind über das Einstellungsfeld einer Anwendung zugänglich, einige jedoch nicht, z. B. die Position des Infofelds. Sie können auf diese Informationen mit zugreifendefaults

Beispiel:

$ defaults read com.apple.Safari
{
    AutoplayPolicyWhitelistConfigurationUpdateDate = "2018-08-24 17:33:48 +0000";
    AutoplayQuirksWhitelistConfigurationUpdateDate = "2018-08-24 17:33:48 +0000";
    DefaultBrowserPromptingState2 = 4;
    ...
Rüsselkäfer
quelle
4

Für Xcode 7

NSUserDefaults standardDefaults werden hier gespeichert:

/Users/{USER}/Library/Developer/CoreSimulator/Devices/{UUID}/data/Containers/Data/Application/{UUID}

NSUserDefaults für eine Suite / App-Gruppe werden hier gespeichert:

/Users/{USER}/Library/Developer/CoreSimulator/Devices/{UUID}/data/Containers/Shared/AppGroup/{UUID}/Library/Preferences/{GROUP_NAME}.plist

Ich würde empfehlen, https://github.com/scinfu/NCSimulatorPlugin zu verwenden, da heutzutage alles hinter UUIDs steckt und schwer zu finden ist. Es ermöglicht den einfachen Zugriff auf Ihre Simulator-App-Verzeichnisse.

user1270061
quelle
2

Ich habe diese Methode basierend auf Morions Vorschlag für eine bessere Präsentation erstellt. Verwenden Sie es, indem Sie anrufen[self logAllUserDefaults]

- (void) logAllUserDefaults
{
    NSArray *keys = [[[NSUserDefaults standardUserDefaults] dictionaryRepresentation] allKeys];
    NSArray *values = [[[NSUserDefaults standardUserDefaults] dictionaryRepresentation] allValues];
    for (int i = 0; i < keys.count; i++) {
        NSLog(@"%@: %@", [keys objectAtIndex:i], [values objectAtIndex:i]);
    }
}
Julian F. Weinert
quelle
2
Darf ich vorschlagen, dass Sie diese Funktion "logAllUserDefaults" nennen, da sie die Standardeinstellungen nicht "abruft"?
Markrickert
Richtig, @markrickert. Vielleicht könnte man daraus ein Wörterbuch erstellen und es dann zurückgeben.
Julian F. Weinert
1
Oder einfach .. NSLog(@"%@", [[[NSUserDefaults standardUserDefaults] dictionaryRepresentation] debugDescription]);(Fast wie in der oben am besten
bewerteten
2

Suchen Sie nach der Mac-App namens SimPholders2 . Es befindet sich in der Menüleiste und listet alle von Ihnen verwendeten Simulatoren auf. Anschließend werden alle Ihre Apps angezeigt. Wählen Sie eines aus und Sie erhalten ein neues Finder-Fenster, das bereits im Verzeichnis der App geöffnet ist. Dies macht es super einfach, Ihre App und alle ihre Verzeichnisse zu finden. Das spart viel Zeit (und ich habe dem Autor gerne gespendet).

Jeff
quelle
2

Simulator App

Dieses Shell-Skript sucht nach dem Namen der App, ermittelt die Bundle-ID und öffnet Ordner mit den Plist-Dateien .

#!/bin/bash

appname="$1"
[ -z $appname ] && read -p "Application name : " appname

apppath=$(find ~/Library/Developer/CoreSimulator/Devices/ -name "$appname.app" -print -quit)
if [[ ! -z $apppath ]]; then
    appbundle=$(osascript -e "id of app \"$apppath\"")
    find ~/Library/Developer/CoreSimulator/Devices/ -name "$appbundle.plist" -exec bash -c 'open "$(dirname "$1")"' -- {} \;
else
    echo "No application found by that name: $appname.app"
fi

Erweiterte Skriptversion

Verwendung: iphone-app-folder "My App"

#!/bin/bash
appname="$1"
[ -z "$appname" ] && read -p "Application name : " appname

apppath=$(find ~/Library/Developer/CoreSimulator/Devices -name "$appname.app" -print -quit)
if [[ ! -z $apppath ]]; then
    appbundle=$(osascript -e "id of app \"$apppath\"")
    echo "Found app $appname (${appbundle})"
    echo -e "\033[1;30m$apppath\033[0m"
    plists=$(find ~/Library/Developer/CoreSimulator/Devices -name "$appbundle.plist" -print -quit)
    count=$(echo plists | wc -l | sed "s/ //g")
    if [[ $count -eq 1 ]] && [[ -f "$plists" ]]; then
        echo -e "\033[1;32mUserDefaults found for $appname\033[0m"
        echo -e "\033[1;30m$plists\033[0m"
        plistutil -i "$plists"
        /usr/bin/open $(dirname "$plists")
    elif [[ ${#plists} -gt 0 ]]; then
        echo -e "\033[1;32mUserDefaults found for $appname\033[0m"
        i=1
        while read line; do
            echo "[${i}] ${line} "
            i=$((i+1))
        done < <(echo "$plists")
        echo
        read -p "Select defaults to read: [1-${count}] " choice
        plist=$(echo ${plists} | sed -n "${choice}p")
        plistutil -i "$plist"
        /usr/bin/open $(dirname "$plist")
    else
        echo -e "\033[31mNo UserDefaults plist found for $appname\033[0m"
    fi
else
    echo -e "\033[31mNo application found by that name: $appname.app\033[0m"
fi

Gefundene App Meine App (com.organisation.MyApp) / Benutzer / Organisation / Bibliothek / Entwickler / CoreSimulator / Geräte / 3E4C8DC3-6FF4-428F-A624-B78DBE0B8C83 / Daten / Container / Bundle / Anwendung / 960A5232-219D-4C46-8CA3- 01E259D8DDAD / Meine App.app

UserDefaults für Meine App gefunden

Mac App

defaults read com.bundleid.app
Atika
quelle
1

In Swift 2.2

let path = NSSearchPathForDirectoriesInDomains(.LibraryDirectory, .UserDomainMask, true)
let folder = path[0]
NSLog("Your NSUserDefaults are stored in this folder: \(folder)/Preferences")

druckt den Ordner der plist-Datei von NSUserDefaults in der Xcode-Debug-Konsole aus. Kopieren Sie die Pfadzeichenfolge. Öffnen Sie Ihren Finder, wählen Sie im Menüelement Gehe zu Ordner wechseln und fügen Sie die Pfadzeichenfolge ein. Doppelklicken Sie auf die Plist-Datei. Sie sehen den Inhalt in Ihrem Xcode-Editor.

Arbeiten Sie nur im Simulator

Danke @Niels Castle

charles.cc.hsu
quelle
Dies ist die einzige Lösung, die funktioniert hat, um die Liste der Benutzerstandards im Simulator für xcode 9.4 zu finden
anoo_radha
1

Ich behalte auf meinem Desktop eine Verknüpfung zum Ordner des Simulators, in dem die Apps gespeichert sind, z.

/Users/gary/Library/Application Support/iPhone Simulator/User/Applications

Sortiert nach dem letzten Datum, gehen Sie einfach in den neuesten App-Ordner Bibliothek / Einstellungen und zeigen Sie die Datei im Plist-Editor an.

Progrmr
quelle
1

Swift 3

print(UserDefaults.standard.dictionaryRepresentation())
Ego Slayer
quelle
1

Für MacOS-Apps
Gehen Sie zu: /Users/{User}/Library/Containers/com.{your company}. {Ihre App} / Data / Library / Preferences und öffnen Sie die pList Ihrer App mit Xcode.

Uwe
quelle
1

Swift 5 Xcode 11.2 Lösung

Dies ist der gesamte Pfad, in dem sich Ihre UserDefaults-Schlüsselwerte in einer Plist-Datei befinden. Folgen Sie und finden Sie Ihre .plist-Datei zur App-Bundle-ID.

/ Benutzer / 'Ihr Benutzername' / Bibliothek / Entwickler / CoreSimulator / Geräte / 4176EED3-B9FC-4C77-A25E-ASD201B9FDFG2 / Daten / Container / Daten / Anwendung / 56D7CE31-9A8B-4371-9B0F-9604E239423B0 / Bibliothek / Einstellungen

Hier ist "4176EED3-B9FC-4C77-A25E-ASD201B9FDFG2" Ihre Geräte-ID

und "56D7CE31-9A8B-4371-9B0F-9604E239423B0" ist Ihre Anwendungs-ID

Normalerweise erhalte ich sie, indem ich Ordner nach dem letzten Änderungsdatum im Finder sortiere. Der zuletzt bearbeitete Ordner ist meine Geräte-ID und App-ID.

Genießen!

Sajid Zeb
quelle
0

Sie können jeden von Ihnen festgelegten Wert wie folgt protokollieren:

NSLog(@"%@",[[NSUserDefaults standardDefaults] stringForKey:@"WhateverTheKeyYouSet"]);
Tom Irving
quelle
0

Nachdem ich die akzeptierte Antwort dieser Frage gelesen habe, habe ich dieses einfache Skript zusammengestellt, das die Plist-Dateien öffnet, die vom iOS-Simulator zum Speichern der NSUserDefaultsEinstellungen verwendet werden. Obwohl es ein bestimmtes Setup voraussetzt (passt perfekt zu meinem), kann es als Ausgangspunkt für andere dienen .

$ cat open-prefs-plist.sh
#!/bin/sh

# The project name based on the workspace path, e.g. "MyProject" from "./MyProject.xcworkspace"
WORKSPACE_NAME=$(echo `find . -name *.xcworkspace -type d -exec basename {} \;` | cut -d'.' -f1)
SIMULATOR_PATH="$HOME/Library/Application Support/iPhone Simulator"
# The App's bundle ID taken from its info plist, e.g "com.myproject" from "./MyProject/MyProject-Info.plist"
BUNDLE_ID=`/usr/libexec/PlistBuddy -c Print:CFBundleIdentifier $WORKSPACE_NAME/$WORKSPACE_NAME"-Info.plist"`
# Open all plist files in the simulator path that match the app's bundle ID 
# normally one per iOS version
find "$SIMULATOR_PATH" -name $BUNDLE_ID".plist" -type f -print0 \
    | while IFS= read -r -d '' PLIST; do
    echo $PLIST
    open "$PLIST"
done

Beispielplatzierung:

$ ls -1
MyProject
MyProject Tests
MyProject.xcodeproj
MyProject.xcworkspace
Podfile
open-prefs-plist.sh
Ernesto MB
quelle
Wie esse ich dieses Skript, mit Gabeln oder mit Händen? wo soll ich es hinstellen, meine ich?
Josh
1
@Josh Sie müssen es neben Ihre Projektdateien stellen (in meinem Beispiel heißt das Skript open-prefs-plist.sh). Ich habe dies jedoch nicht mit dem neuesten Xcode getestet. Ich empfehle Ihnen Flex, diese Informationen jetzt zu überprüfen. github.com/Flipboard/FLEX
Ernesto MB
0

Sie können dies verwenden, um den vollständigen Pfad zu Benutzereinstellungen, Cache und vielen anderen Daten abzurufen

print(NSSearchPathForDirectoriesInDomains(.documentDirectory, .userDomainMask, true))

Ahmed M. Hassan
quelle
0

Sie können den Pfad für das Voreinstellungsverzeichnis aus dem application:didFinishLaunchingWithOptions:Rückruf in Ihrem AppDelegate ausdrucken:

func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
    print(FileManager.default.urls(for: .preferencePanesDirectory, in: .userDomainMask).first!)
    return true
}

Dann können Sie direkt in die Plist-Datei schauen, um zu sehen, was dort gespeichert ist.

Myxtic
quelle