Modo semplice per visualizzare i NSUserDefaults salvati?


225

C'è un modo per vedere cosa è stato salvato NSUserDefaultsdirettamente? Vorrei vedere se i miei dati sono stati salvati correttamente.


3
Usa questo per ottenere la posizione della directory delle tue app: stampa (NSHomeDirectory ()) da quella posizione, vai su Libreria> Preferenze> <yourAppsBundleName.plist> questo sarà dove NSUserDefaults sta salvando i tuoi dati.
Bobby,

Risposte:


162

Puoi trovare il file pList per la tua app nel simulatore se vai a:

/ utenti / il tuo nome utente / Libreria / Supporto applicazioni / Simulatore iPhone / <Versione Sim> / Applicazioni

Questa directory ha un sacco di directory denominate GUID. Se stai lavorando su alcune app ce ne saranno alcune. Quindi devi trovare la tua app binaria:

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

Quindi vai alla directory Libreria / Preferenze nella directory GUID. Così:

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

Dovresti trovare un file simile a:

<Bundle Identifier>.foo.pList

Apri questo nell'editor pList e sfoglia i valori persistenti al contenuto del tuo cuore.


12
Ho scoperto che questo è cambiato nelle versioni successive di XCode. Ora lo troverai in una directory sotto l'attuale numero di versione iOS invece di Utente - ad es. / Utenti / il tuo nome utente / Libreria / Supporto applicazioni / iPhone Simulator / 4.3 / Applicazioni
nevster,

Interessante ... Sembra che se si sta facendo OCMock / SenTestingKit unit testing con NSUserDefaults, allora il NSUserDefaultsnon sono persistito in un file .plist ma gestito in memoria: stackoverflow.com/questions/6193597/...
ma11hew28

Come posso visualizzarlo per un'applicazione già installata? Il mio client ha scaricato l'applicazione dall'app store e qualcosa non va. Devo controllare il file
NSUserDefaults

Il tuo cliente - se puoi parlargli e in qualche modo esperto - potrebbe usare uno strumento come PhoneView per ottenere l'accesso al suo filesystem del telefono e copiare il file dal telefono per inviarlo a te.
Daniel Schneller,

13
Il percorso è stato modificato in: ~ / Library / Developer / CoreSimulator / Devices
Brainware

355

È possibile stampare tutti gli NSUserDefaults correnti nel registro:

Solo chiavi:

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

Chiavi e valori:

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

1
THX, questo è più efficiente ~
acustico il

3
Per questo, Apple potrebbe creare un semplice visualizzatore in XCode. Come il visualizzatore di plist. Ma no, non vogliono renderlo facile.
GeneCode

78

In Swift possiamo usare quanto segue: -

Swift 3.xe 4.x

Per ottenere tutte le chiavi e i valori:

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

Per recuperare la rappresentazione completa del dizionario delle impostazioni predefinite dell'utente:

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

Per recuperare le chiavi:

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

Per recuperare i valori:

Possiamo usare anche dump qui, ma ciò restituirà la gerarchia di ereditarietà completa di ciascun elemento nella matrice dei valori. Se sono necessarie ulteriori informazioni sugli oggetti, utilizzare il dump, altrimenti procedere con la normale istruzione di stampa.

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

Swift 2.x

Per recuperare la rappresentazione completa del dizionario delle impostazioni predefinite dell'utente:

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

Per recuperare le chiavi:

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

Per recuperare i valori:

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

40

È possibile verificare i valori per ciascuna chiave dell'array, restituiti da

[[[NSUserDefaults standardUserDefaults] dictionaryRepresentation] allKeys]

3
Questo ha funzionato anche nel debugger usando questo comando: (lldb) "po [[[[NSUserDefaults standardUserDefaults] DictionaryRepresentation] allKeys]"
Ethan Parker

21

A volte utilizzo il frammento seguente per stampare la posizione del mio file NSUserDefaults quando eseguo nel simulatore

NSArray * path = NSSearchPathForDirectoriesInDomains (
   NSLibraryDirectory, NSUserDomainMask, YES);
NSString * folder = [percorso objectAtIndex: 0];
NSLog (@ "I tuoi NSUserDefaults sono memorizzati in questa cartella:% @ / Preferenze", cartella);

Produce il percorso della cartella delle preferenze

I valori predefiniti di NSU sono memorizzati in questa cartella: / Utenti / castello / Libreria / Supporto applicazioni / Simulatore iPhone / Utente / Applicazioni / BC5056A0-F46B-4AF1-A6DC-3A7DAB984960 / Libreria / Preferenze

Il file NSUserDefaults si trova nella cartella delle preferenze e denominato in base al prefisso e al nome dell'applicazione, ad es.

dk.castleandersen.dreamteam.grid.plist

Mi aspetto che lo stesso sia vero per il dispositivo reale.


mi piace questa risposta. È stabile e funzionerà sempre, si spera!
lucianoenrico,

7

Facile, poiché il nome del file plist è <app-bundle-identifier>.plist, è possibile utilizzare il findcomando per trovare il suo percorso. Ma ci vorrà molto tempo se cerchi l'intero computer, quindi devi scegliere un buon ambito, come ~/Library/Developer/CoreSimulatorper Xcode 6.

esempio:

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

l'output sarà qualcosa del genere ...

/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

E da lì puoi usare il opencomando. Oppure, se usi iTerm2 , fai semplicemente clic sul percorso per aprirlo.


7

In Swift 4.0

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

perché DictionaryRepresentation di NSUserDefaults.standardUserDefaults () restituisce [String: AnyObject]

Lo abbiamo inserito in un NSDictionary. Quindi racchiudendolo tra parentesi '()' ci permetterà di chiamare .allKeys o .allValues ​​come faresti su qualsiasi NSDictionary

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

6

Usa sotto il codice.

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

Brillante! Interessante come le risposte migliori siano in genere le più brevi. Raramente è necessario navigare tra le directory in modalità terminale. Evidentemente, ai geek piace l'approccio backdoor, forse l'hacker segreto in loro?
Giovanni,

Grazie, ma non riesco a prenderti. Cosa vuoi dire?
Mr.Javed Multani,

5

Per le applicazioni OS X , invece di trovare il file plist delle impostazioni predefinite dell'applicazione, è più semplice utilizzare l' defaultsutilità della riga di comando.

NOME

 defaults -- access the Mac OS X user defaults system

SINOSSI

 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 }

DESCRIZIONE

defaultsconsente agli utenti di leggere, scrivere ed eliminare le impostazioni predefinite dell'utente di Mac OS X da una shell della riga di comando. Le applicazioni Mac OS X e altri programmi utilizzano il sistema predefinito per registrare le preferenze dell'utente e altre informazioni che devono essere mantenute quando le applicazioni non sono in esecuzione (come il carattere predefinito per i nuovi documenti o la posizione di un pannello Informazioni). Molte di queste informazioni sono accessibili tramite il pannello Preferenze di un'applicazione, ma alcune non lo sono, come la posizione del pannello Informazioni. Puoi accedere a queste informazioni condefaults

Esempio:

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

4

Per Xcode 7

NSUserDefaults standardI default sono memorizzati qui:

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

I valori predefiniti di NSUser per un gruppo suite / app sono memorizzati qui:

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

Consiglierei di utilizzare https://github.com/scinfu/NCSimulatorPlugin perché in questi giorni tutto è alla base degli UUID e sono un dolore da trovare. Consente un facile accesso alle directory delle app del simulatore.


2

Ho costruito questo metodo basato sul suggerimento di Morion per una migliore presentazione. Usalo chiamando[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
Posso suggerire di chiamare quella funzione "logAllUserDefaults" poiché in realtà non "ottiene" le impostazioni predefinite?
markrickert,

Bene, @markrickert. Forse uno potrebbe creare un dizionario da esso e restituirlo, quindi.
Julian F. Weinert,

1
O semplicemente .. NSLog(@"%@", [[[NSUserDefaults standardUserDefaults] dictionaryRepresentation] debugDescription]);(Quasi come nella risposta più votata sopra.)
matsr,

2

Cerca l'app per Mac chiamata SimPholders2 . Vive nella barra dei menu ed elenca tutti i simulatori che hai utilizzato, quindi mostra ciascuna delle tue app. Selezionane uno e otterrai una nuova finestra del Finder, già aperta nella directory dell'app. Questo rende semplicissimo trovare la tua app e tutte le sue directory. È un enorme risparmio di tempo (e ho prontamente donato all'autore).


2

App simulatore

Questo script shell cerca il nome dell'app, ottiene l' id del bundle e apre le cartelle contenenti i file 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

Versione script estesa

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

App trovata La mia app (com.organisation.MyApp) / Utenti / organizzazione / Libreria / Sviluppatore / CoreSimulator / Devices / 3E4C8DC3-6FF4-428F-A624-B78DBE0B8C83 / data / Containers / Bundle / Application / 960A5232-219D-4C46-8CA3- 01E259D8DDAD / La mia app.app

Default utente trovati per La mia app

App per Mac

defaults read com.bundleid.app

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")

stamperà la posizione della cartella del file plist di NSUserDefaults nella console di debug di Xcode. Copia la stringa del percorso. Apri il tuo Finder, seleziona Vai alla cartella nella voce di menu Vai, incolla la stringa del percorso. Fare doppio clic sul file plist. Vedrai i contenuti nel tuo editor Xcode.

Funziona solo in Simulator

Grazie @Niels Castle


Questa è l'unica soluzione che ha funzionato per trovare il plist di default dell'utente sul simulatore per xcode 9.4
anoo_radha

1

Tengo un collegamento sul mio desktop alla cartella del simulatore in cui si trovano le app, ovvero:

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

Ordinati per data più recente, quindi vai nella cartella app / Preferenze più recente e visualizza il file nell'editor plist.


1

Swift 3

print(UserDefaults.standard.dictionaryRepresentation())

1

Per le app MacOS
Vai a: /Users/{User}/Library/Containers/com.{your company}. {La tua app} / Dati / Libreria / Preferenze e apri la lista della tua app con Xcode.


1

Soluzione Swift 5 Xcode 11.2

Questo è l'intero percorso in cui i valori della chiave UserDefaults saranno in un file plist. Segui e trova il file .plist dell'identificatore del bundle dell'app.

/ Utenti / 'Nome utente' / Libreria / Sviluppatore / CoreSimulator / Devices / 4176EED3-B9FC-4C77-A25E-ASD201B9FDFG2 / data / Containers / Data / Application / 56D7CE31-9A8B-4371-9B0F-9604E239423B0 / Libreria / Preferenze

Qui "4176EED3-B9FC-4C77-A25E-ASD201B9FDFG2" è il tuo ID dispositivo

e "56D7CE31-9A8B-4371-9B0F-9604E239423B0" è l'ID applicazione

Normalmente li ottengo ordinando le cartelle in base all'ultima data modificata nel Finder. E la cartella modificata più recente è il mio ID dispositivo e ID app.

Godere!


0

Puoi NSLog ogni valore impostato, come:

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

0

Dopo aver letto la risposta accettata di questa domanda, ho messo insieme questo semplice script che apre i file plist utilizzati dal simulatore iOS per memorizzare le NSUserDefaultspreferenze e, sebbene presupponga una certa configurazione (si adatta perfettamente alla mia), potrebbe funzionare come punto di partenza per altri .

$ 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

Esempio di posizionamento:

$ ls -1
MyProject
MyProject Tests
MyProject.xcodeproj
MyProject.xcworkspace
Podfile
open-prefs-plist.sh

Come mangio questa sceneggiatura, con le forchette o con le mani? dove lo metto, intendo?
Josh

1
@Josh Devi metterlo accanto ai file del tuo progetto (nel mio esempio lo script si chiama open-prefs-plist.sh). Non ho provato questo con l'ultimo Xcode però. Ti consiglio Flex di ispezionare queste informazioni ora. github.com/Flipboard/FLEX
Ernesto MB

0

Puoi utilizzarlo per ottenere il percorso completo su preferenze utente, cache e molti altri dati

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


0

Puoi stampare il percorso per la directory delle preferenze dal application:didFinishLaunchingWithOptions:callback nel tuo AppDelegate:

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

Quindi puoi guardare direttamente il file plist per vedere cosa è salvato lì dentro.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.