Łatwy sposób na zobaczenie zapisanych NSUserDefaults?

Czy istnieje sposób, aby zobaczyć, co zostało zapisane NSUserDefaults bezpośrednio? Chciałbym sprawdzić, czy moje dane są poprawnie zapisane.

Author: Leo Dabus, 2009-11-05

19 answers

Możesz znaleźć plik pList dla swojej aplikacji w symulatorze, jeśli przejdziesz do:

/ użytkownicy / Twoja nazwa użytkownika / Biblioteka / Obsługa aplikacji / symulator iPhone ' a / / Aplikacje

Ten katalog ma kilka katalogów nazwanych GUID. Jeśli pracujesz nad kilkoma aplikacjami, będzie ich kilka. Więc musisz znaleźć swój plik binarny aplikacji:

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

Następnie przejdź do katalogu Library / Preferences w katalogu GUID. Więc:

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

Powinieneś znaleźć plik, który wygląda jak:

<Bundle Identifier>.foo.pList

Otwórz to w edytorze pList i przeglądaj wartości do treści twojego serca.

 153
Author: RedBlueThing,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-12-24 15:53:04

Możesz wydrukować wszystkie bieżące NSUserDefaults do dziennika:

Tylko klucze:

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

Klucze i wartości:

NSLog(@"%@", [[NSUserDefaults standardUserDefaults] dictionaryRepresentation]);
 341
Author: marshn,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-08-25 15:12:41

W języku Swift możemy użyć:-

Swift 3.x i 4.x

Aby uzyskać wszystkie klucze i wartości:

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

Do pobrania pełnej reprezentacji słownikowej domyślnych wartości użytkownika:

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

Do pobierania kluczy:

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

Do pobierania wartości:

Możemy również użyć dump, ale zwróci to kompletną hierarchię dziedziczenia każdego elementu w tablicy wartości. Jeżeli wymagane jest więcej informacji o obiektach, należy użyć dump, w przeciwnym razie wykonaj normalną instrukcję print.

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

Swift 2.x

Do pobrania pełnej reprezentacji słownikowej domyślnych wartości użytkownika:

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

Do pobierania kluczy:

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

Do pobierania wartości:

print(NSUserDefaults.standardUserDefaults().dictionaryRepresentation().values.array)
 66
Author: footyapps27,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-01-26 01:58:21

Możesz sprawdzić wartości dla każdego klucza w tablicy, zwracanego przez

[[[NSUserDefaults standardUserDefaults] dictionaryRepresentation] allKeys]
 36
Author: Morion,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-08-20 02:52:53

Czasami używam poniższego fragmentu, aby wydrukować lokalizację mojego pliku NSUserDefaults podczas uruchamiania w symulatorze

NSArray *path = NSSearchPathForDirectoriesInDomains(
   NSLibraryDirectory, NSUserDomainMask, YES);
NSString *folder = [path objectAtIndex:0];
NSLog(@"Your NSUserDefaults are stored in this folder: %@/Preferences", folder);

Daje ścieżkę do folderu preferencji

W tym folderze znajdują się: /Users/castle/Library/Application Support/iPhone Simulator/User/Applications/BC5056A0-F46B-4AF1-A6DC-3a7dab984960/Library/Preferences

Twój plik NSUserDefaults znajduje się w folderze preferences i jest nazwany zgodnie z Twoim przedrostek i nazwa aplikacji, np.

dk.castleandersen.dreamteam.grid.plist

Spodziewam się, że to samo będzie prawdziwe dla rzeczywistego urządzenia.

 21
Author: Niels Castle,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-04-12 07:33:35

Użyj poniższego kodu.

NSLog(@"NSUserDefault: %@", [[NSUserDefaults standardUserDefaults] dictionaryRepresentation]);
 6
Author: Mr.Javed Multani,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-01-05 07:12:32

W Swift 4.0

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

Ponieważ dictionaryreprezentacja NSUserDefaults.standardUserDefaults () zwraca [String: AnyObject]

Wrzucamy go do NSDictionary. Następnie otaczając go w nawiasie '() ' pozwoli nam na wywołanie .allKeys or .allValues tak jak na każdym NSDictionary

 print((UserDefaults.standard.dictionaryRepresentation() as NSDictionary).allKeys)
 5
Author: RyanTCB,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-12-16 11:31:24

Łatwe, ponieważ nazwa pliku plist to <app-bundle-identifier>.plist, możesz użyć polecenia find, aby znaleźć jego ścieżkę. Ale zajmie to bardzo długo, jeśli przeszukasz cały komputer, więc musisz wybrać dobry zakres, jak {[2] } dla Xcode 6.

Przykład:

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

Wyjście będzie mniej więcej takie...

/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

I stamtąd możesz użyć komendy open. Lub jeśli używasz iTerm2 , po prostu kliknij polecenie na ścieżce, aby ją otworzyć.

 4
Author: Hlung,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-08-01 12:03:54

Dla Xcode 7

NSUserDefaults standardDefaults są przechowywane tutaj:

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

NSUserDefaults dla a suite / app group są przechowywane tutaj:

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

Polecam użycie https://github.com/scinfu/NCSimulatorPlugin ponieważ w dzisiejszych czasach wszystko jest za UUIDs i są ból do znalezienia. Umożliwia łatwy dostęp do katalogów aplikacji symulatora.

 3
Author: user1270061,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-11-03 21:06:52

Zbudowałem tę metodę w oparciu o sugestię Moriona dla lepszej prezentacji. Użyj go przez wywołanie [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]);
    }
}
 2
Author: Julian F. Weinert,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-07-11 10:46:23

Poszukaj aplikacji na Maca o nazwie SimPholders2 . Znajduje się na pasku menu i zawiera listę wszystkich używanych symulatorów, a następnie pokazuje każdą z Twoich aplikacji. Wybierz jeden, a otrzymasz nowe okno Findera, już otwarte do katalogu aplikacji. To sprawia, że bardzo łatwo znaleźć aplikację i wszystkie jego katalogi. Jest to ogromna oszczędność czasu (i chętnie ofiarowałem autorowi).

 2
Author: Jeff,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-09-19 05:54:58

Simulator App

Ten skrypt powłoki wyszukuje nazwęaplikacji, uzyskuje identyfikator pakietui otwiera foldery zawierające pliki Plist.

#!/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

Rozszerzona wersja skryptu

Użycie: 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

Found app My App (com.organizacja.MyApp) /Users/organisation/Library/Developer/CoreSimulator/Devices/3E4C8DC3-6FF4-428F-A624-B78DBE0B8C83/data/Containers/Bundle/Application/960A5232-219D-4C46-8CA3-01E259D8DDAD/Moja aplikacja.app

UserDefaults found for My App

Mac App

defaults read com.bundleid.app
 2
Author: Atika,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-11-09 14:20:21

Możesz zapisać każdą ustawioną wartość, np.:

NSLog(@"%@",[[NSUserDefaults standardDefaults] stringForKey:@"WhateverTheKeyYouSet"]);
 1
Author: Tom Irving,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-04-02 10:35:26

W Swift 2.2

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

Wyświetli lokalizację folderu plist pliku NSUserDefaults w konsoli debugowania Xcode. Skopiuj łańcuch ścieżki. Otwórz Finder, wybierz Przejdź do folderu w menu Przejdź, Wklej ciąg ścieżki. Kliknij dwukrotnie plik plist. Zobaczysz zawartość w edytorze Xcode.

Działa tylko w symulatorze

Thanks @ Niels Castle

 1
Author: charles.cc.hsu,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-04-05 09:16:08

Trzymam skrót na pulpicie do folderu symulatora, gdzie przechowuje aplikacje, czyli:

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

Posortowane według najnowszej daty, a następnie przejdź do najnowszej Biblioteki folderów aplikacji / preferencji i zobacz plik w edytorze plist.

 1
Author: progrmr,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-04-12 07:33:45

Swift 3

print(UserDefaults.standard.dictionaryRepresentation())
 1
Author: Ego Slayer,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-10-09 18:02:05

Dla aplikacji MacOS
Przejdź do: / Users / {User} / Library / Containers / com.{Twoja firma}.{Twoja aplikacja} / Dane / Biblioteka / preferencje i otwórz pList aplikacji za pomocą Xcode.

 1
Author: Uwe,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-02-25 11:48:36

Po przeczytaniu zaakceptowanej odpowiedzi na to pytanie, ułożyłem ten prosty skrypt, który otwiera pliki plist używane przez symulator iOS do przechowywania preferencji NSUserDefaults, i chociaż zakłada pewną konfigurację (pasuje idealnie do mojej), może działać jako punkt wyjścia dla innych.

$ 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

Przykładowe umieszczenie:

$ ls -1
MyProject
MyProject Tests
MyProject.xcodeproj
MyProject.xcworkspace
Podfile
open-prefs-plist.sh
 0
Author: Ernesto MB,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-09-02 06:44:24

Dla aplikacji OS X zamiast znajdować domyślny plik plist aplikacji, prostsze jest użycie narzędzia linii poleceń defaults.

Nazwa

 defaults -- access the Mac OS X user defaults system

SYNOPSIS

 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 }

Opis

defaults umożliwia użytkownikom Odczyt, Zapis i usuwanie domyślnych ustawień użytkownika systemu Mac OS X z powłoki wiersza poleceń. Mac Aplikacje OS X i inne programy używają domyślnego systemu do rejestrowania preferencji użytkownika i innych informacje, które muszą być zachowane, gdy aplikacje nie są uruchomione (takie jak domyślna czcionka dla new dokumenty, lub Położenie panelu informacyjnego). Wiele z tych informacji jest dostępnych za pośrednictwem aplikacji- panel preferencji cation, ale niektóre z nich nie są, np. Położenie panelu Info. Możesz dostęp do tych informacji za pomocą defaults

Przykład:

$ defaults read com.apple.Safari
{
    AutoplayPolicyWhitelistConfigurationUpdateDate = "2018-08-24 17:33:48 +0000";
    AutoplayQuirksWhitelistConfigurationUpdateDate = "2018-08-24 17:33:48 +0000";
    DefaultBrowserPromptingState2 = 4;
    ...
 0
Author: weevilgenius,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-09-06 20:55:44