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

是否有一种方法可以直接查看保存到NSUserDefaults中的内容?我想看看我的数据保存是否正确。

105540 次浏览

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

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

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

[[[NSUserDefaults standardUserDefaults] dictionaryRepresentation] allKeys]

你可以在模拟器中找到你的应用的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编辑器中打开它,并浏览您想要的持久值。

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

NSArray *path = NSSearchPathForDirectoriesInDomains(
NSLibraryDirectory, NSUserDomainMask, YES);
NSString *folder = [path objectAtIndex:0];
NSLog(@"Your NSUserDefaults are stored in this folder: %@/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

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

我在桌面上保留了模拟器文件夹的快捷方式,在那里保存应用程序,即:

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

按最近的日期排序,然后进入最近的应用程序文件夹库/首选项,并在plist编辑器中查看文件。

你可以打印当前所有的NSUserDefaults到日志:

键:

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

键和值:

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

我根据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]);
}
}

在阅读了这个问题的公认答案后,我把这个简单的脚本放在一起,打开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

在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,否则使用正常的print语句。

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

快2.倍

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

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

检索密钥:

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

检索值:

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

很简单,因为plist文件名是<app-bundle-identifier>.plist,你可以使用find命令来找到它的路径。但如果你搜索整台计算机,这将花费很长时间,所以你必须选择一个好的范围,比如Xcode 6的~/Library/Developer/CoreSimulator

例子:

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

输出将是这样的…

< p > <代码> /用户/ hlung /图书馆/开发/ CoreSimulator /设备/ B61913F6-7D7C-4E45-AE2F-F45220A71823 /数据/集装箱/数据/应用程序/ e4cc51cf - 11 - e5 - 4168 - 8 a74 - 6 - bae3b89998f /图书馆/ / com.awesome.app.plist偏好 < /代码> < / p >

从那里你可以使用open命令。或者如果你使用iTerm2,只需命令-点击路径打开它。

寻找名为SimPholders2的Mac应用程序。它位于菜单栏中,列出你使用过的所有模拟器,然后显示每个应用程序。选择一个,你会得到一个新的Finder窗口,已经打开到应用程序的目录。这使得它超级容易找到你的应用程序和所有的目录。它是非常节省时间(并且我乐于捐赠给作者)。

在Swift 4.0中

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

因为NSUserDefaults.standardUserDefaults()返回[字符串:AnyObject]

我们将它转换为NSDictionary类型。然后用括号'()'把它括起来将允许我们调用。allkeys或。allvalues就像你在任何NSDictionary上一样

 print((UserDefaults.standard.dictionaryRepresentation() as NSDictionary).allKeys)

模拟器应用程序

这个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

发现应用My app (com.organisation.MyApp) /用户/组织/图书馆/开发/ CoreSimulator /设备/ 3 e4c8dc3 - 6 - ff4 - 428 f - a624 b78dbe0b8c83 /数据/集装箱/包/应用程序/ 960 a5232 - 219 d - 4 - c46 - 8 - ca3 - 01 e259d8ddad /我App.app < / p >

为我的应用程序找到UserDefaults

Mac应用程序

defaults read com.bundleid.app

在Swift 2.2中

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

将打印出NSUserDefaults在Xcode调试控制台的plist文件夹位置。复制路径字符串。打开Finder,选择Go菜单项中的“转到文件夹”,粘贴路径字符串。双击plist文件。你会在Xcode编辑器中看到内容。

只能在模拟器中工作

谢谢@Niels Castle

斯威夫特3

print(UserDefaults.standard.dictionaryRepresentation())

使用下面的代码。

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

对于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

我建议使用https://github.com/scinfu/NCSimulatorPlugin,因为现在所有东西都在uuid后面,很难找到。它允许轻松访问您的模拟器应用程序目录。

< p > MacOS应用 < br > 进入:/Users/{User}/Library/Containers/com。{你的公司}。{your app}/Data/Library/Preferences,然后用Xcode打开你的app的pList

对于OS X应用程序,使用defaults命令行实用程序更简单,而不是寻找应用程序的默认plist文件。

的名字

 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应用程序和其他程序使用默认系统来记录用户的首选项和其他 应用程序未运行时必须维护的信息(例如new的默认字体) 文档,或信息面板的位置)。大部分信息都可以通过应用程序访问 阳离子的首选项面板,但有些不是,如信息面板的位置。你可以 使用defaults

访问此信息

例子:

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

您可以使用它来获得用户首选项、缓存和许多其他数据的完整路径

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

你可以从AppDelegate中的application:didFinishLaunchingWithOptions:回调中打印出preferences目录的路径:

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

然后你可以直接查看plist文件,看看里面保存了什么。

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

我通常通过在查找器中根据最近修改的日期对文件夹进行排序来获得它们。最近编辑的文件夹是我的设备ID和应用ID。

享受吧!

它将在更高版本的SWIFT 4上工作

只需要把代码放在AppDelegate的any方法中,并在那里设置断点

**> let path =
> NSSearchPathForDirectoriesInDomains(FileManager.SearchPathDirectory.documentDirectory,
> FileManager.SearchPathDomainMask.userDomainMask, true).first**

当你运行一个项目,打印"路径"你会得到到达信息的路径。使用userdefaults进行Plist 然后到finder,粘贴这个路径 您可以访问文件

对于希望找到存储在模拟器中的首选项的新位置的用户。 这是我找到值存储的地方

/Users/vikas/Library/Developer/CoreSimulator/Devices/CE5A0444-BD98-4FEE-A839-92728D6E9895/data/Containers/Data/Application/F7430839-ED2C-408A-8A8E-FE7FFAABA8E2/Library/Preferences

因为我们可以看到有很大的标识符,很难从终端猜出来,所以我建议在终端或finder中搜索它们。

文件名应该以{包id} .plist结尾,例如com.sellerbuddy.online.plist,这样你就可以直接进入终端,输入如下所示的应用程序包标识符。

find ~/Library/Developer/CoreSimulator/Devices -type f -name "com.sellerbuddy.online.plist"

enter image description here