Maneira fácil de ver os NSUserDefaults salvos?

225

Existe uma maneira de ver o que foi salvo NSUserDefaultsdiretamente? Gostaria de ver se meus dados foram salvos corretamente.

Ethan
fonte
3
Use isso para obter o local do diretório de aplicativos: print (NSHomeDirectory ()) a partir desse local, vá para Biblioteca> Preferências> <yourAppsBundleName.plist> e será onde o NSUserDefaults está salvando seus dados.
Bobby

Respostas:

162

Você pode encontrar o arquivo pList para o seu aplicativo no simulador se for para:

/ users / seu nome de usuário / Library / Application Support / iPhone Simulator / <Sim Version> / Applications

Este diretório possui vários diretórios denominados GUID. Se você estiver trabalhando em alguns aplicativos, haverá alguns deles. Então, você precisa encontrar o seu aplicativo binário:

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

Em seguida, vá para o diretório Library / Preferences no diretório GUID. Assim:

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

Você deve encontrar um arquivo parecido com:

<Bundle Identifier>.foo.pList

Abra isso no editor pList e procure valores persistentes no conteúdo do seu coração.

RedBlueThing
fonte
12
Descobri que isso mudou nas versões posteriores do XCode. Agora você vai encontrá-lo em um diretório sob o número atual versão do IOS em vez do usuário - por exemplo, / Users / seu nome de usuário / Library / Application Support / iPhone Simulator / 4,3 / Applications
nevster
Interessante ... Parece que se você estiver testando a unidade OCMock / SenTestingKit NSUserDefaults, ele NSUserDefaultsnão será persistido em um arquivo .plist, mas sim gerenciado na memória: stackoverflow.com/questions/6193597/…
ma11hew28
Como posso visualizá-lo para um aplicativo já instalado? Meu cliente baixou o aplicativo da appstore e algo está errado. Preciso verificar o arquivo
NSUserDefaults
Seu cliente - se você puder falar com ele e ele um pouco mais experiente - pode usar uma ferramenta como o PhoneView para obter acesso ao sistema de arquivos do telefone e copiar o arquivo do telefone para enviá-lo a você.
precisa
13
O caminho foi alterado para: ~ / Library / Developer / CoreSimulator / Devices
Brainware
355

Você pode imprimir todos os atuais NSUserDefaults no log:

Apenas teclas:

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

Chaves e valores:

NSLog(@"%@", [[NSUserDefaults standardUserDefaults] dictionaryRepresentation]);
Marshn
fonte
1
THX, este é mais eficiente ~
acústico
3
A Apple poderia criar um visualizador simples no XCode para isso. Como o espectador. Mas não, eles não querem facilitar.
GeneCode 01/09/16
78

No Swift, podemos usar o seguinte: -

Swift 3.x e 4.x

Para obter todas as chaves e valores:

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

Para recuperar a representação completa do dicionário dos padrões do usuário:

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

Para recuperar as chaves:

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

Para recuperar os valores:

Também podemos usar o dump aqui, mas isso retornará a hierarquia de herança completa de cada elemento na matriz de valores. Se forem necessárias mais informações sobre os objetos, use dump, ou siga a instrução de impressão normal.

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

Swift 2.x

Para recuperar a representação completa do dicionário dos padrões do usuário:

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

Para recuperar as chaves:

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

Para recuperar os valores:

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

Você pode verificar os valores para cada chave na matriz, retornados por

[[[NSUserDefaults standardUserDefaults] dictionaryRepresentation] allKeys]
Morion
fonte
3
Isso também funcionou no depurador usando este comando: (lldb) "po [[[NSUserDefaults standardUserDefaults] dictionaryRepresentation] allKeys]"
Ethan Parker
21

Às vezes, uso o seguinte trecho para imprimir o local do meu arquivo NSUserDefaults ao executar no simulador

NSArray * caminho = NSSearchPathForDirectoriesInDomains (
   NSLibraryDirectory, NSUserDomainMask, YES);
Pasta NSString * = [caminho objectAtIndex: 0];
NSLog (@ "Seus padrões de NSUserDefault estão armazenados nesta pasta:% @ / Preferences", pasta);

Ele gera o caminho para a pasta de preferências

Os padrões do NSUserDefault estão armazenados nesta pasta: / Usuários / castelo / Biblioteca / Suporte a aplicativos / iPhone Simulator / Usuário / Aplicativos / BC5056A0-F46B-4AF1-A6DC-3A7DAB984960 / Biblioteca / Preferências

Seu arquivo NSUserDefaults está localizado na pasta de preferências e é nomeado de acordo com o seu prefixo e nome do aplicativo, por exemplo

dk.castleandersen.dreamteam.grid.plist

Espero que o mesmo seja verdade para o dispositivo real.

Castelo de Niels
fonte
Eu gosto desta resposta. É estável e sempre funcionará, espero!
lucianoenrico 14/03
7

Fácil, como o nome do arquivo plist é <app-bundle-identifier>.plist, você pode usar o findcomando para encontrar seu caminho. Mas levará muito tempo se você pesquisar em todo o computador, portanto, é necessário escolher um bom escopo, como ~/Library/Developer/CoreSimulatorpara o Xcode 6.

exemplo:

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

a saída será algo como isto ...

/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 a partir daí você pode usar o opencomando. Ou, se você usa o iTerm2 , basta clicar com o comando no caminho para abri-lo.

Hlung
fonte
7

No Swift 4.0

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

porque dictionaryRepresentation de NSUserDefaults.standardUserDefaults () retorna [String: AnyObject]

Nós o lançamos em um NSDictionary. Então, colocando-o entre parênteses '()' nos permitirá chamar .allKeys ou .allValues, como faria em qualquer NSDictionary

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

Use o código abaixo.

NSLog(@"NSUserDefault: %@", [[NSUserDefaults standardUserDefaults] dictionaryRepresentation]);
Mr.Javed Multani
fonte
Brilhante! Interessante como as melhores respostas são geralmente as mais curtas. Raramente é necessário navegar nos diretórios no modo de terminal. Evidentemente, os geeks como a porta dos fundos se aproximam, talvez o hacker secreto neles?
John
Obrigado, mas não posso te pegar. O que você quer dizer?
Mr.Javed Multani
5

Para aplicativos OS X , em vez de encontrar o arquivo plist de padrões do aplicativo, é mais simples usar o defaultsutilitário de linha de comando.

NOME

 defaults -- access the Mac OS X user defaults system

SINOPSE

 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 }

DESCRIÇÃO

defaultspermite que os usuários leiam, gravem e excluam os padrões de usuário do Mac OS X em um shell de linha de comando. Os aplicativos Mac OS X e outros programas usam o sistema de padrões para registrar as preferências do usuário e outras informações que devem ser mantidas quando os aplicativos não estiverem em execução (como fonte padrão para novos documentos ou a posição de um painel Informações). Muitas dessas informações são acessíveis através do painel Preferências de um aplicativo, mas algumas não, como a posição do painel Informações. Você pode acessar essas informações comdefaults

Exemplo:

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

Para o Xcode 7

Os NSUserDefaults standardDefaults são armazenados aqui:

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

Os padrões NSUserD para um conjunto de aplicativos / suítes são armazenados aqui:

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

Eu recomendaria usar https://github.com/scinfu/NCSimulatorPlugin porque hoje em dia tudo está por trás dos UUIDs e é difícil encontrá-los. Permite fácil acesso aos diretórios de aplicativos do simulador.

user1270061
fonte
2

Criei esse método com base na sugestão de Morion para uma melhor apresentação. Use chamando[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
fonte
2
Posso sugerir que você chame essa função de "logAllUserDefaults", pois na verdade não "obtém" os padrões?
markrickert
Certo, @markrickert. Talvez alguém possa criar um dicionário a partir dele e devolvê-lo, então.
Julian F. Weinert
1
Ou simplesmente .. NSLog(@"%@", [[[NSUserDefaults standardUserDefaults] dictionaryRepresentation] debugDescription]);(Quase como na resposta mais votada acima).
matsr 5/12/13
2

Procure o aplicativo para Mac chamado SimPholders2 . Ele fica na barra de menus, lista todos os simuladores que você usou e mostra cada um dos seus aplicativos. Selecione uma e você obterá uma nova janela do Finder, já aberta no diretório do aplicativo. Isso facilita a localização do aplicativo e de todos os diretórios. É uma enorme economia de tempo (e eu doei prontamente para o autor).

Jeff
fonte
2

Simulator App

Esse script de shell pesquisa o nome do aplicativo, obtém o ID do pacote e abre pastas que contêm os arquivos 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

Versão de script estendida

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

Aplicativo encontrado Meu aplicativo (com.organisation.MyApp) / Usuários / organização / Biblioteca / Desenvolvedor / CoreSimulator / Devices / 3E4C8DC3-6FF4-428F-A624-B78DBE0B8C83 / data / Containers / Bundle / Application / 960A5232-219D-4C46-8CA3- 01E259D8DDAD / My App.app

Padrões de usuário encontrados para Meu aplicativo

Mac App

defaults read com.bundleid.app
Atika
fonte
1

No Swift 2.2

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

imprimirá o local da pasta de arquivos do NSUserDefaults no console de depuração do Xcode. Copie a sequência do caminho. Abra o Finder, selecione Ir para a pasta no item de menu Ir, cole a sequência de caracteres do caminho. Clique duas vezes no arquivo plist. Você verá o conteúdo no seu editor do Xcode.

Trabalhar apenas no simulador

Obrigado @Niels Castle

charles.cc.hsu
fonte
Esta é a única solução que funcionou para encontrar as userdefaults Plist no simulador para Xcode 9.4
anoo_radha
1

Eu mantenho um atalho na minha área de trabalho na pasta do simulador onde ele mantém os aplicativos, ou seja:

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

Classificado pela data mais recente, basta ir para a pasta mais recente do aplicativo Library / Preferences e visualizar o arquivo no editor plist.

progrmr
fonte
1

Swift 3

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

Para aplicativos MacOS,
acesse: /Users/{User}/Library/Containers/com.{your company}. {Seu aplicativo} / Dados / Biblioteca / Preferências e abra a lista de aplicativos com o Xcode.

Uwe
fonte
1

Solução Swift 5 Xcode 11.2

Esse é o caminho inteiro em que os valores das chaves UserDefaults estarão em um arquivo plist. Siga e encontre o arquivo .plist do identificador de pacote de aplicativos.

/ Usuários / 'Seu nome de usuário' / Biblioteca / Desenvolvedor / CoreSimulator / Devices / 4176EED3-B9FC-4C77-A25E-ASD201B9FDFG2 / data / Containers / Data / Application / 56D7CE31-9A8B-4371-9B0F-9604E239423B0 / Biblioteca / Preferences

Aqui "4176EED3-B9FC-4C77-A25E-ASD201B9FDFG2" é o seu ID do dispositivo

e "56D7CE31-9A8B-4371-9B0F-9604E239423B0" é o seu ID do aplicativo

Normalmente, eu os obtenho classificando as pastas pela última data de modificação no Finder. E a pasta editada mais recente é meu ID do dispositivo e ID do aplicativo.

Aproveitar!

Sajid Zeb
fonte
0

Você pode NSLog cada valor definido, como:

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

Depois de ler a resposta aceita desta pergunta, montei esse script simples que abre os arquivos plist usados ​​pelo simulador iOS para armazenar as NSUserDefaultspreferências e, embora assuma uma determinada configuração (se encaixa perfeitamente na minha), pode funcionar como ponto de partida para outros .

$ 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

Posicionamento de exemplo:

$ ls -1
MyProject
MyProject Tests
MyProject.xcodeproj
MyProject.xcworkspace
Podfile
open-prefs-plist.sh
Ernesto MB
fonte
Como como esse script, com garfos ou mãos? onde eu coloco, quero dizer?
Josh
1
@ Josh Você deve colocá-lo ao lado dos arquivos do seu projeto (no meu exemplo, o script se chama open-prefs-plist.sh). Eu não testei isso com o Xcode mais recente. Eu recomendo que você Flex para inspecionar essas informações agora. github.com/Flipboard/FLEX
Ernesto MB
0

Você pode usar isso para obter o caminho completo das preferências do usuário, cache e muitos outros dados

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

Ahmed M. Hassan
fonte
0

Você pode imprimir o caminho para o diretório de preferências a partir do application:didFinishLaunchingWithOptions:retorno de chamada no AppDelegate:

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

Então você pode olhar diretamente para o arquivo plist para ver o que está salvo lá.

Myxtic
fonte