有没有办法直接查看保存的内容NSUserDefaults
?我想看看我的数据是否正确保存。
24 回答
您可以将所有当前的 NSUserDefaults 打印到日志中:
只是键:
NSLog(@"%@", [[[NSUserDefaults standardUserDefaults] dictionaryRepresentation] allKeys]);
键和值:
NSLog(@"%@", [[NSUserDefaults standardUserDefaults] dictionaryRepresentation]);
如果您转到以下位置,您可以在模拟器中找到您的应用程序的 pList 文件:
/users/你的用户名/Library/Application Support/iPhone Simulator/<Sim Version>/Applications
这个目录有一堆 GUID 命名的目录。如果您正在开发一些应用程序,那么其中就会有一些。所以你需要找到你的应用程序二进制文件:
find . -name foo.app
./1BAB4C83-8E7E-4671-AC36-6043F8A9BFA7/foo.app
然后转到 GUID 目录中的 Library/Preferences 目录。所以:
cd 1BAB4C83-8E7E-4671-AC35-6043F8A9BFA7/Library/Preferences
您应该找到一个如下所示的文件:
<Bundle Identifier>.foo.pList
在 pList 编辑器中打开它,然后根据您的需要浏览持久值。
在 Swift 中,我们可以使用以下内容:-
斯威夫特 3.x 和 4.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 数组中每个元素的完整继承层次结构。如果需要有关对象的更多信息,则使用转储,否则继续使用正常的打印语句。
// dump(Array(UserDefaults.standard.dictionaryRepresentation().values))
print(Array(UserDefaults.standard.dictionaryRepresentation().values))
斯威夫特 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,是); NSString *folder = [path objectAtIndex:0]; NSLog(@"您的 NSUserDefaults 存储在此文件夹中:%@/Preferences", folder);
它产生首选项文件夹的路径
您的 NSUserDefaults 存储在此文件夹中:/Users/castle/Library/Application Support/iPhone Simulator/User/Applications/BC5056A0-F46B-4AF1-A6DC-3A7DAB984960/Library/Preferences
您的 NSUserDefaults 文件位于首选项文件夹中,并根据您的前缀和应用程序名称命名,例如
dk.castleandersen.dreamteam.grid.plist
我希望实际设备也是如此。
很简单,因为 plist 文件名是<app-bundle-identifier>.plist
,所以你可以使用find
命令找到它的路径。但是如果你搜索整台计算机会花费很长时间,所以你必须选择一个好的范围,比如~/Library/Developer/CoreSimulator
Xcode 6。
例子:
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,只需命令单击路径即可打开它。
在 Swift 4.0 中
//func dictionaryRepresentation() -> [String : AnyObject]
因为 NSUserDefaults.standardUserDefaults() 的 dictionaryRepresentation 返回[String : AnyObject]
我们将其转换为NSDictionary
. 然后通过将它括在括号'()'中将允许我们像在任何 NSDictionary 上一样调用 .allKeys 或 .allValues
print((UserDefaults.standard.dictionaryRepresentation() as NSDictionary).allKeys)
使用下面的代码。
NSLog(@"NSUserDefault: %@", [[NSUserDefaults standardUserDefaults] dictionaryRepresentation]);
对于OS X 应用程序,与其查找应用程序的默认 plist 文件,不如使用defaults
命令行实用程序更简单。
姓名
defaults -- access the Mac OS X user defaults system
概要
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 }
描述
defaults
允许用户从命令行 shell 读取、写入和删除 Mac OS X 用户默认设置。Mac OS X 应用程序和其他程序使用默认系统来记录用户偏好和其他在应用程序未运行时必须维护的信息(例如新文档的默认字体或信息面板的位置)。大部分信息可以通过应用程序的 Preferences 面板访问,但有些则不是,例如 Info 面板的位置。您可以通过以下方式访问此信息defaults
例子:
$ defaults read com.apple.Safari
{
AutoplayPolicyWhitelistConfigurationUpdateDate = "2018-08-24 17:33:48 +0000";
AutoplayQuirksWhitelistConfigurationUpdateDate = "2018-08-24 17:33:48 +0000";
DefaultBrowserPromptingState2 = 4;
...
对于 Xcode 7
NSUserDefaults标准默认值存储在这里:
/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
我建议使用https://github.com/scinfu/NCSimulatorPlugin,因为现在一切都在 UUID 之后,而且很难找到。它允许轻松访问您的模拟器应用程序目录。
我根据 Morion 的建议构建了这个方法,以便更好地展示。通过调用使用它[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]);
}
}
查找名为SimPholders2的 Mac 应用程序。它位于菜单栏中,列出您使用过的所有模拟器,然后显示您的每个应用程序。选择一个,您将获得一个新的 Finder 窗口,该窗口已打开到应用程序的目录。这使得查找您的应用程序及其所有目录变得非常容易。这是一个巨大的节省时间(我很乐意捐赠给作者)。
模拟器应用
这个 shell 脚本搜索应用程序的名称,获取包 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
找到应用程序我的应用程序(com.organisation.MyApp)/Users/organisation/Library/Developer/CoreSimulator/Devices/3E4C8DC3-6FF4-428F-A624-B78DBE0B8C83/data/Containers/Bundle/Application/960A5232-219D-4C46-8CA3- 01E259D8DDAD/我的应用程序.app
为我的应用找到 UserDefaults
Mac 应用程序
defaults read com.bundleid.app
在斯威夫特 2.2
let path = NSSearchPathForDirectoriesInDomains(.LibraryDirectory, .UserDomainMask, true)
let folder = path[0]
NSLog("Your NSUserDefaults are stored in this folder: \(folder)/Preferences")
将在 Xcode 调试控制台中打印出 NSUserDefaults 的 plist 文件夹位置。复制路径字符串。打开 Finder,在 Go 菜单项中选择 Go to Folder,粘贴路径字符串。双击 plist 文件。您将在 Xcode 编辑器中看到内容。
仅在模拟器中工作
谢谢@尼尔斯城堡
Swift 5 Xcode 11.2 解决方案
这是您的 UserDefaults 键值将在 plist 文件中的整个路径。关注并找到您的应用程序包标识符 .plist 文件。
/Users/'你的用户名'/Library/Developer/CoreSimulator/Devices/4176EED3-B9FC-4C77-A25E-ASD201B9FDFG2/data/Containers/Data/Application/56D7CE31-9A8B-4371-9B0F-9604E239423B0/Library/Preferences
这里“4176EED3-B9FC-4C77-A25E-ASD201B9FDFG2”是您的设备 ID
“56D7CE31-9A8B-4371-9B0F-9604E239423B0”是您的应用程序 ID
我通常通过在 Finder 中按最后修改日期对文件夹进行排序来获取它们。最近编辑的文件夹是我的设备 ID 和 App ID。
享受!
我在桌面上保留了一个指向模拟器文件夹的快捷方式,它保存了应用程序,即:
/Users/gary/Library/Application Support/iPhone Simulator/User/Applications
按最近日期排序,然后只需进入最近的应用程序文件夹 Library/Preferences 并在 plist 编辑器中查看文件。
斯威夫特 3
print(UserDefaults.standard.dictionaryRepresentation())
对于 MacOS 应用程序
转到:/Users/{User}/Library/Containers/com.{your company}.{your app}/Data/Library/Preferences 并使用 Xcode 打开应用程序的 pList。
您可以 NSLog 您设置的每个值,例如:
NSLog(@"%@",[[NSUserDefaults standardDefaults] stringForKey:@"WhateverTheKeyYouSet"]);
在阅读了这个问题的已接受答案后,我整理了这个简单的脚本,它打开了 iOS 模拟器用来存储NSUserDefaults
首选项的 plist 文件,虽然它假设了某种设置(非常适合我的设置),但它可以作为其他人的起点.
$ 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
示例放置:
$ ls -1
MyProject
MyProject Tests
MyProject.xcodeproj
MyProject.xcworkspace
Podfile
open-prefs-plist.sh
您可以使用它来获取用户首选项、缓存和许多其他数据的完整路径
print(NSSearchPathForDirectoriesInDomains(.documentDirectory, .userDomainMask, true))
application:didFinishLaunchingWithOptions:
您可以从AppDelegate 中的回调打印出首选项目录的路径:
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
print(FileManager.default.urls(for: .preferencePanesDirectory, in: .userDomainMask).first!)
return true
}
然后您可以直接查看 plist 文件以查看其中保存的内容。
它适用于更高版本的 SWIFT 4
只需将该代码放在 AppDelegate 的 any 方法中并在那里设置断点
**> let path =
> NSSearchPathForDirectoriesInDomains(FileManager.SearchPathDirectory.documentDirectory,
> FileManager.SearchPathDomainMask.userDomainMask, true).first**
当您运行项目时,打印“路径”,您将获得使用 userdefaults 到达 info.plist 的路径然后只需转到 finder 并将您到达的路径粘贴到该文件上
对于希望找到存储在模拟器中的偏好的新位置的用户。这是我找到存储的值的地方。
/Users/vikas/Library/Developer/CoreSimulator/Devices/CE5A0444-BD98-4FEE-A839-92728D6E9895/data/Containers/Data/Application/F7430839-ED2C-408A-8A8E-FE7FFAABA8E2/Library/Preferences
因为我们可以看到有一些很难从终端中猜到的大标识符,所以我建议在您的终端或查找器中搜索它们。
例如,文件名应以{bundle id}.plistcom.sellerbuddy.online.plist
结尾,这样您就可以前往终端并使用您的应用程序包标识符按如下所示输入。
find ~/Library/Developer/CoreSimulator/Devices -type f -name "com.sellerbuddy.online.plist"