Existe uma maneira de ver o que foi salvo NSUserDefaults
diretamente? Gostaria de ver se meus dados foram salvos corretamente.
Existe uma maneira de ver o que foi salvo NSUserDefaults
diretamente? Gostaria de ver se meus dados foram salvos corretamente.
Respostas:
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.
NSUserDefaults
, ele NSUserDefaults
não será persistido em um arquivo .plist, mas sim gerenciado na memória: stackoverflow.com/questions/6193597/…
Você pode imprimir todos os atuais NSUserDefaults no log:
Apenas teclas:
NSLog(@"%@", [[[NSUserDefaults standardUserDefaults] dictionaryRepresentation] allKeys]);
Chaves e valores:
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))
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))
print(NSUserDefaults.standardUserDefaults().dictionaryRepresentation())
print(NSUserDefaults.standardUserDefaults().dictionaryRepresentation().keys.array)
print(NSUserDefaults.standardUserDefaults().dictionaryRepresentation().values.array)
Você pode verificar os valores para cada chave na matriz, retornados por
[[[NSUserDefaults standardUserDefaults] dictionaryRepresentation] allKeys]
À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.
Fácil, como o nome do arquivo plist é <app-bundle-identifier>.plist
, você pode usar o find
comando 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/CoreSimulator
para 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 open
comando. Ou, se você usa o iTerm2 , basta clicar com o comando no caminho para abri-lo.
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)
Use o código abaixo.
NSLog(@"NSUserDefault: %@", [[NSUserDefaults standardUserDefaults] dictionaryRepresentation]);
Para aplicativos OS X , em vez de encontrar o arquivo plist de padrões do aplicativo, é mais simples usar o defaults
utilitá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
defaults
permite 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;
...
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.
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]);
}
}
NSLog(@"%@", [[[NSUserDefaults standardUserDefaults] dictionaryRepresentation] debugDescription]);
(Quase como na resposta mais votada acima).
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).
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
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
defaults read com.bundleid.app
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
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.
Swift 3
print(UserDefaults.standard.dictionaryRepresentation())
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!
Você pode NSLog cada valor definido, como:
NSLog(@"%@",[[NSUserDefaults standardDefaults] stringForKey:@"WhateverTheKeyYouSet"]);
Depois de ler a resposta aceita desta pergunta, montei esse script simples que abre os arquivos plist usados pelo simulador iOS para armazenar as NSUserDefaults
preferê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
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))
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á.