Łatwy sposób, aby zobaczyć zapisane NSUserDefaults?


225

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


3
Użyj tego, aby uzyskać lokalizację katalogu aplikacji: wydrukuj (NSHomeDirectory ()) z tej lokalizacji, przejdź do Biblioteka> Preferencje> <yourAppsBundleName.plist> to miejsce, w którym NSUserDefaults zapisuje twoje dane.
Bobby

Odpowiedzi:


162

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

/ users / twoja nazwa użytkownika / Library / Application Support / iPhone Simulator / <Sim Version> / Applications

Ten katalog ma kilka katalogów o nazwie GUID. Jeśli pracujesz nad kilkoma aplikacjami, będzie ich kilka. Musisz znaleźć binarną aplikację:

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 następująco:

<Bundle Identifier>.foo.pList

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


12
Odkryłem, że to się zmieniło w późniejszych wersjach XCode. Teraz znajdziesz go w katalogu pod bieżącym numerem wersji iOS zamiast User - np. /
Users

Ciekawe ... Wygląda na to, że jeśli wykonujesz testy jednostkowe OCMock / SenTestingKit NSUserDefaults, NSUserDefaultsto nie są one utrwalane w pliku .plist, ale raczej zarządzane w pamięci: stackoverflow.com/questions/6193597/...
ma11hew28

Jak mogę go wyświetlić dla już zainstalowanej aplikacji? Mój klient pobrał aplikację ze sklepu i coś jest nie tak. Muszę sprawdzić plik
NSUserDefaults

Twój klient - jeśli możesz z nim porozmawiać, a on jest nieco bystry - może użyć narzędzia takiego jak PhoneView, aby uzyskać dostęp do systemu plików swojego telefonu i skopiować plik z telefonu, aby wysłać go do Ciebie.
Daniel Schneller,

13
Ścieżka zmieniła się na: ~ / Library / Developer / CoreSimulator / Devices
Brainware 16.06.16

355

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

Tylko klucze:

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

Klucze i wartości:

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

1
Dzięki, ten jest bardziej wydajny ~
akustyczny

3
Apple może w tym celu stworzyć prostą przeglądarkę w XCode. Podobnie jak przeglądarka plist. Ale nie, nie chcą tego ułatwić.
GeneCode

78

W Swift możemy użyć następujących opcji:

Swift 3.x i 4.x

Aby uzyskać wszystkie klucze i wartości:

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

Aby pobrać pełną reprezentację słownikową domyślnych ustawień użytkownika:

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

Aby odzyskać klucze:

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

Aby pobrać wartości:

Możemy również użyć zrzutu, ale to zwróci pełną hierarchię dziedziczenia każdego elementu w tablicy wartości. Jeśli wymagane są dodatkowe informacje o obiektach, użyj zrzutu, w przeciwnym razie przejdź do normalnej instrukcji print.

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

Swift 2.x

Aby pobrać pełną reprezentację słownikową domyślnych ustawień użytkownika:

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

Aby odzyskać klucze:

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

Aby pobrać wartości:

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

40

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

[[[NSUserDefaults standardUserDefaults] dictionaryRepresentation] allKeys]

3
Działa to również w debuggerze przy użyciu następującego polecenia: (lldb) „po [[[[NSUserDefaults standardUserDefaults] dictionaryRepresentation] allKeys]”
Ethan Parker

21

Czasami używam następującego fragmentu kodu, aby wydrukować lokalizację mojego pliku NSUserDefaults podczas działania w symulatorze

Ścieżka NSArray * = NSSearchPathForDirectoriesInDomains (
   NSLibraryDirectory, NSUserDomainMask, YES);
NSString * folder = [ścieżka objectAtIndex: 0];
NSLog (@ „Twoje NSUserDefault są przechowywane w tym folderze:% @ / Preferences”, folder);

Daje ścieżkę do folderu preferencji

Twoje NSUserDefaults są przechowywane w tym folderze: / Users / castle / Library / Application Support / iPhone Simulator / User / Applications / BC5056A0-F46B-4AF1-A6DC-3A7DAB984960 / Library / Preferences

Twój plik NSUserDefaults znajduje się w folderze preferencji i nazywa się go zgodnie z prefiksem i nazwą aplikacji, np.

dk.castleandersen.dreamteam.grid.plist

Oczekuję, że to samo będzie prawdziwe w przypadku rzeczywistego urządzenia.


podoba mi się ta odpowiedź. Jest stabilny i zawsze będzie działał, mam nadzieję, że!
lucianoenrico

7

Łatwo, ponieważ nazwa pliku plist to <app-bundle-identifier>.plist, możesz użyć findpolecenia, aby znaleźć jego ścieżkę. Ale zajmie to dużo czasu, jeśli przeszukasz cały komputer, więc musisz wybrać dobry zakres, jak w ~/Library/Developer/CoreSimulatorprzypadku Xcode 6.

przykład:

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

wynik będzie taki jak ten ...

/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ć openpolecenia. Lub jeśli korzystasz z iTerm2 , po prostu kliknij ścieżkę, aby ją otworzyć.


7

W Swift 4.0

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

ponieważ DictionaryRepresentation z NSUserDefaults.standardUserDefaults () zwraca [String: AnyObject]

Rzucamy to na NSDictionary. Następnie, otaczając go w nawiasach, „()” pozwoli nam wywołać .allKeys lub .allValues, tak jak w przypadku dowolnego NSDictionary

 print((UserDefaults.standard.dictionaryRepresentation() as NSDictionary).allKeys)

6

Użyj poniższego kodu.

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

Znakomity! Ciekawe, jak najlepsze odpowiedzi są zwykle najkrótsze. Rzadko konieczne jest poruszanie się po katalogach w trybie terminalowym. Najwyraźniej maniacy lubią tylne drzwi, a może ukryty w nich haker?
Jan

Dzięki, ale nie mogę cię zdobyć. Co chcesz powiedzieć?
Mr.Javed Multani,

5

W przypadku aplikacji OS X zamiast znajdować domyślny plik listy aplikacji, łatwiej jest użyć defaultsnarzędzia wiersza poleceń.

IMIĘ

 defaults -- access the Mac OS X user defaults system

STRESZCZENIE

 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

defaultspozwala użytkownikom odczytywać, zapisywać i usuwać ustawienia domyślne użytkownika Mac OS X z powłoki wiersza poleceń. Aplikacje Mac OS X i inne programy używają systemu domyślnego do rejestrowania preferencji użytkownika i innych informacji, które należy zachować, gdy aplikacje nie są uruchomione (takie jak domyślna czcionka dla nowych dokumentów lub pozycja panelu informacyjnego). Wiele z tych informacji jest dostępnych za pośrednictwem panelu Preferencji aplikacji, ale niektóre z nich nie są dostępne, na przykład pozycja panelu Informacje. Możesz uzyskać 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;
    ...

4

Dla Xcode 7

NSUserDefault standardDefaults są tutaj przechowywane:

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

NSUserDefaults dla pakietu / grupy aplikacji są przechowywane tutaj:

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

Polecam korzystanie z https://github.com/scinfu/NCSimulatorPlugin, ponieważ w dzisiejszych czasach wszystko stoi za identyfikatorami UUID i znalezienie ich jest bardzo trudne. Umożliwia łatwy dostęp do katalogów aplikacji symulatora.


2

Zbudowałem tę metodę w oparciu o sugestię Moriona dla lepszej prezentacji. Użyj go dzwoniąc[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
Czy mogę zasugerować, aby wywołać tę funkcję „logAllUserDefaults”, ponieważ tak naprawdę nie „przyjmuje” ona wartości domyślnych?
markrickert

Racja, @markrickert. Może więc można z niego utworzyć słownik i zwrócić go.
Julian F. Weinert,

1
Lub po prostu .. NSLog(@"%@", [[[NSUserDefaults standardUserDefaults] dictionaryRepresentation] debugDescription]);(Prawie jak w wyżej głosowanej odpowiedzi powyżej).
matsr

2

Wyszukaj aplikację Mac o nazwie SimPholder2 . Znajduje się na pasku menu i zawiera listę wszystkich używanych symulatorów, a następnie pokazuje każdą z Twoich aplikacji. Wybierz jedno, a pojawi się nowe okno Findera, otwarte już w katalogu aplikacji. Dzięki temu znalezienie aplikacji i wszystkich jej katalogów jest bardzo łatwe. To ogromna oszczędność czasu (i chętnie przekazałem autorowi).


2

Symulator aplikacji

Ten skrypt powłoki wyszukuje nazwę aplikacji, uzyskuje identyfikator pakietu i 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

Stosowanie: 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

Znaleziono aplikację Moja aplikacja (com.organisation.MyApp) / Użytkownicy / organizacja / Biblioteka / Twórca / CoreSimulator / Urządzenia / 3E4C8DC3-6FF4-428F-A624-B78DBE0B8C83 / data / Containers / Bundle / Application / 960A5232-219D-4C46-8CA3- 01E259D8DDAD / My App.app

Znaleziono UserDefault dla mojej aplikacji

Aplikacja na Maca

defaults read com.bundleid.app

1

W Swift 2.2

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

wydrukuje lokalizację folderu pliku plist NSUserDefaults w konsoli debugowania Xcode. Skopiuj ciąg ścieżki. Otwórz Finder, wybierz Idź do folderu w menu Idź, Wklej ciąg ścieżki. Kliknij dwukrotnie plik Plist. Zobaczysz zawartość w swoim edytorze Xcode.

Działa tylko w Symulatorze

Dzięki @Niels Castle


Jest to jedyne rozwiązanie, które działało w celu znalezienia listy błędów użytkownika na symulatorze dla xcode 9.4
anoo_radha

1

Na pulpicie trzymam skrót do folderu symulatora, w którym znajdują się aplikacje, tj .:

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

Posortowane według najnowszej daty, a następnie przejdź do najnowszego folderu aplikacji Biblioteka / Preferencje i wyświetl plik w edytorze list.



1

Aplikacje MacOS
Przejdź do: /Users/{User}/Library/Containers/com.{your company}. {Twoja aplikacja} / Data / Library / Preferences i otwórz listę aplikacji w Xcode.


1

Rozwiązanie Swift 5 Xcode 11.2

Jest to cała ścieżka, w której wartości kluczy UserDefaults będą znajdować się w pliku plist. Śledź i znajdź plik .plist identyfikatora pakietu aplikacji.

/ Users / 'Your User Name' / Library / Developer / CoreSimulator / Devices / 4176EED3-B9FC-4C77-A25E-ASD201B9FDFG2 / data / Containers / Data / Application / 56D7CE31-9A8B-4371-9B0F-9604E239423B0 / Library / Preferences

Tutaj „4176EED3-B9FC-4C77-A25E-ASD201B9FDFG2” to Twój identyfikator urządzenia

a „56D7CE31-9A8B-4371-9B0F-9604E239423B0” to identyfikator aplikacji

Zwykle otrzymuję je, sortując foldery według daty ostatniej modyfikacji w Finderze. Ostatnio edytowanym folderem jest mój identyfikator urządzenia i identyfikator aplikacji.

Cieszyć się!


0

Możesz NSLog każdą ustawioną wartość, na przykład:

NSLog(@"%@",[[NSUserDefaults standardDefaults] stringForKey:@"WhateverTheKeyYouSet"]);

0

Po przeczytaniu zaakceptowanej odpowiedzi na to pytanie, stworzyłem ten prosty skrypt, który otwiera pliki Plist używane przez symulator iOS do przechowywania NSUserDefaultspreferencji, i chociaż zakłada pewną konfigurację (idealnie pasuje 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

Jak zjeść ten skrypt za pomocą widelca lub rąk? gdzie to położyć?
Josh

1
@Josh Musisz umieścić go obok plików projektu (w moim przykładzie skrypt nazywa się open-prefs-plist.sh). Jednak nie testowałem tego z najnowszym Xcode. Polecam Flexowi sprawdzenie tej informacji już teraz. github.com/Flipboard/FLEX
Ernesto MB

0

Możesz użyć tego, aby uzyskać pełną ścieżkę preferencji użytkownika, pamięci podręcznej i wielu innych danych

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


0

Możesz wydrukować ścieżkę do katalogu preferencji z application:didFinishLaunchingWithOptions:wywołania zwrotnego w AppDelegate:

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

Następnie możesz spojrzeć bezpośrednio na plik plist, aby zobaczyć, co tam jest zapisane.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.