C'è un modo per vedere cosa è stato salvato NSUserDefaults
direttamente? Vorrei vedere se i miei dati sono stati salvati correttamente.
C'è un modo per vedere cosa è stato salvato NSUserDefaults
direttamente? Vorrei vedere se i miei dati sono stati salvati correttamente.
Risposte:
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.
NSUserDefaults
, allora il NSUserDefaults
non sono persistito in un file .plist ma gestito in memoria: stackoverflow.com/questions/6193597/...
È possibile stampare tutti gli NSUserDefaults correnti nel registro:
Solo chiavi:
NSLog(@"%@", [[[NSUserDefaults standardUserDefaults] dictionaryRepresentation] allKeys]);
Chiavi e valori:
NSLog(@"%@", [[NSUserDefaults standardUserDefaults] dictionaryRepresentation]);
for (key, value) in UserDefaults.standard.dictionaryRepresentation() {
print("\(key) = \(value) \n")
}
print(Array(UserDefaults.standard.dictionaryRepresentation()))
// Using dump since the keys are an array of strings.
dump(Array(UserDefaults.standard.dictionaryRepresentation().keys))
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))
print(NSUserDefaults.standardUserDefaults().dictionaryRepresentation())
print(NSUserDefaults.standardUserDefaults().dictionaryRepresentation().keys.array)
print(NSUserDefaults.standardUserDefaults().dictionaryRepresentation().values.array)
È possibile verificare i valori per ciascuna chiave dell'array, restituiti da
[[[NSUserDefaults standardUserDefaults] dictionaryRepresentation] allKeys]
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.
Facile, poiché il nome del file plist è <app-bundle-identifier>.plist
, è possibile utilizzare il find
comando per trovare il suo percorso. Ma ci vorrà molto tempo se cerchi l'intero computer, quindi devi scegliere un buon ambito, come ~/Library/Developer/CoreSimulator
per 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 open
comando. Oppure, se usi iTerm2 , fai semplicemente clic sul percorso per aprirlo.
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)
Usa sotto il codice.
NSLog(@"NSUserDefault: %@", [[NSUserDefaults standardUserDefaults] dictionaryRepresentation]);
Per le applicazioni OS X , invece di trovare il file plist delle impostazioni predefinite dell'applicazione, è più semplice utilizzare l' defaults
utilità 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
defaults
consente 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;
...
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.
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]);
}
}
NSLog(@"%@", [[[NSUserDefaults standardUserDefaults] dictionaryRepresentation] debugDescription]);
(Quasi come nella risposta più votata sopra.)
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).
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
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
defaults read com.bundleid.app
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
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.
Swift 3
print(UserDefaults.standard.dictionaryRepresentation())
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!
Puoi NSLog ogni valore impostato, come:
NSLog(@"%@",[[NSUserDefaults standardDefaults] stringForKey:@"WhateverTheKeyYouSet"]);
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 NSUserDefaults
preferenze 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
Puoi utilizzarlo per ottenere il percorso completo su preferenze utente, cache e molti altri dati
print(NSSearchPathForDirectoriesInDomains(.documentDirectory, .userDomainMask, true))
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.