简单的方法来看看保存NSUserDefaults?

有没有办法看到什么直接保存到NSUserDefaults ? 我想看看我的数据是否正确保存。

你可以在模拟器中find你的应用程序的pList文件,如果你去:

/ users / 你的用户名 / Library / Application Support / iPhone Simulator / <Sim Version> / Applications

这个目录有一大堆GUID命名的目录。 如果你正在使用几个应用程序,那么会有一些应用程序。 所以你需要find你的应用二进制文件:

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

然后转到GUID目录中的Library / Preferences目录。 所以:

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

你应该find一个如下所示的文件:

 <Bundle Identifier>.foo.pList 

在pList编辑器中打开它并浏览保存的值到你的内容。

您可以将所有当前的NSUserDefaults打印到日志中:

只是键:

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

键和值:

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

在Swift中,我们可以使用以下内容:

Swift 3.x

获取所有的键和值:

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

为了检索值:

我们也可以在这里使用dump,但是这将返回values数组中每个元素的完整inheritance层次结构。 如果需要关于对象的更多信息,那么使用dump,否则继续使用正常的打印语句。

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

Swift 2.x

为了检索用户默认的完整字典表示:

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

为了检索密钥:

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

为了检索值:

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

您可以检查数组中每个键的值,并返回

 [[[NSUserDefaults standardUserDefaults] dictionaryRepresentation] allKeys] 

我有时使用下面的代码片段在模拟器中运行时打印出我的NSUserDefaults文件的位置

 NSArray * path = NSSearchPathForDirectoriesInDomains(
    NSLibraryDirectory,NSUserDomainMask,YES);
 NSString * folder = [path objectAtIndex:0];
 NSLog(@“你的NSUserDefaults存储在这个文件夹中:%@ / Preferences”,文件夹);

它生成首选项文件夹的path

您的NSUserDefaults存储在以下文件夹中:/ Users / castle / Library / Application Support / iPhone Simulator / User / Applications / BC5056A0-F46B-4AF1-A6DC-3A7DAB984960 / Library / Preferences

您的NSUserDefaults文件位于首选项文件夹中,并根据您的前缀和应用程序名称进行命名

 dk.castleandersen.dreamteam.grid.plist 

我希望实际的设备也是如此。

在Swift 2.0中

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

因为NSUserDefaults.standardUserDefaults()的dictionaryRepresentation返回[String:AnyObject]

我们把它转换成一个NSDictionary 。 然后通过围绕在括号'()'将允许我们调用.allKeys或.allValues就像你在任何NSDictionary

  print((NSUserDefaults.standardUserDefaults().dictionaryRepresentation() as NSDictionary).allKeys) 

很简单,因为plist文件名是<app-bundle-identifier>.plist ,所以可以使用find命令查找它的path。 但是如果您search整个计算机,则需要很长时间,所以您必须select一个好的范围,比如Xcode 6的~/Library/Developer/CoreSimulator

例:

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

输出将是这样的…

/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

从那里你可以使用open命令。 或者如果您使用iTerm2 ,只需单击该path以打开它。

对于Xcode 7

NSUserDefaults standardDefaults存储在这里:

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

套件/应用程序组的 NSUserDefaults存储在这里:

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

我会build议使用https://github.com/scinfu/NCSimulatorPlugin,因为这些日子一切都落后于UUIDs,很难find。; 它允许轻松访问您的模拟器应用程序目录。

我根据Morion的build议来build立这个方法,以便更好地呈现。 通过调用[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]); } } 

你可以NSLoglogging你设置的每个值,比如:

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

find名为SimPholders2的Mac应用程序。 它位于菜单栏中,并列出您使用的所有模拟器,然后显示您的每个应用程序。 select一个,你会得到一个新的Finder窗口,已经打开到应用程序的目录。 这使得它很容易find你的应用程序和所有的目录。 这是一个巨大的节省时间 (我很容易捐给作者)。

使用下面的代码。

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

我在桌面上保留一个快捷方式到模拟器的文件夹中,它保存应用程序,即:

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

按最近的datesorting,然后进入最近的应用程序文件夹Library / Preferences,并在plist编辑器中查看该文件。

Swift 3

 print(UserDefaults.standard.dictionaryRepresentation()) 

模拟器应用程序

该shell脚本search应用程序的名称 ,获取包ID ,并打开包含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 

扩展的脚本版本

用法: 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 

find我的应用程序(com.organisation.MyApp)/ Users / organization / Library / Developer / CoreSimulator / Devices / 3E4C8DC3-6FF4-428F-A624-B78DBE0B8C83 / data / Containers / Bundle / Application / 960A5232-219D-4C46-8CA3- 01E259D8DDAD /我的App.app

UserDefaultsfind我的应用程序

Mac App

 defaults read com.bundleid.app 

在阅读这个问题的答案之后,我把这个简单的脚本放在一起,这个脚本打开了iOS模拟器用来存储NSUserDefaults首选项的plist文件,当它假定一个特定的设置(完全符合我的)时,它可能成为一个起点其他。

 $ cat open-prefs-plist.sh #!/bin/sh # The project name based on the workspace path, eg "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, eg "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 

示例布局:

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

在Swift 2.2中

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

将在Xcodedebugging控制台中打印NSUserDefaults的plist文件夹位置。 复制pathstring。 打开你的Finder,select转到菜单项中的转到文件夹,粘贴pathstring。 双击plist文件。 你会看到你的Xcode编辑器中的内容。

只能在模拟器中工作

谢谢@Niels城堡