轻松查看已保存的NSUserDefaults?

时间:2009-11-04 21:57:33

标签: ios objective-c macos nsuserdefaults

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

23 个答案:

答案 0 :(得分:348)

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

只需按键:

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

键和值:

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

答案 1 :(得分:157)

如果您转到:

,您可以在模拟器中找到适用于您的应用的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编辑器中打开它,并将持久值浏览到心脏的内容。

答案 2 :(得分:74)

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

Swift 3.x&amp; 4.x的

获取所有按键&amp;值:

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

Swift 2.x

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

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

用于检索密钥:

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

用于检索值:

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

答案 3 :(得分:39)

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

返回
[[[NSUserDefaults standardUserDefaults] dictionaryRepresentation] allKeys]

答案 4 :(得分:21)

我有时会使用以下代码段在模拟器中运行时打印出我的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

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

答案 5 :(得分:6)

在Swift 4.0中

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

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

我们将其投射到NSDictionary。然后通过在括号'()'中包围它将允许我们像在任何NSDictionary上一样调用.allKeys或.allValues

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

答案 6 :(得分:6)

使用以下代码。

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

答案 7 :(得分:4)

很简单,因为plist文件名是<app-bundle-identifier>.plist,您可以使用find命令查找其路径。但是如果你搜索你的整个计算机需要很长时间,所以你必须选择一个好的范围,比如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 ,只需按住命令单击路径即可将其打开。

答案 8 :(得分:3)

对于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背后,很难找到。它允许轻松访问您的模拟器应用程序目录。

答案 9 :(得分:3)

对于 OS X应用程序,与其查找应用程序的默认plist文件,不如使用defaults命令行实用程序。

  

NAME

 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允许用户从命令行外壳读取,写入和删除Mac OS X用户默认设置。苹果电脑   OS X应用程序和其他程序使用默认系统记录用户首选项和其他   应用程序不运行时必须维护的信息(例如,新字体的默认字体)   文档或“信息”面板的位置)。这些信息中的大部分可通过应用程序访问   阳离子的“首选项”面板,但有些不是,例如“信息”面板的位置。您可以   使用defaults

访问此信息

示例:

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

答案 10 :(得分:2)

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

答案 11 :(得分:2)

查找名为 SimPholders2 的Mac应用。它位于菜单栏中,列出了您使用过的所有模拟器,然后显示了每个应用程序。选择一个,您将获得一个新的Finder窗口,该窗口已打开到应用程序的目录。这使您可以非常轻松地找到您的应用程序及其所有目录。这是一个节省大量时间(我很乐意捐赠给作者)。

答案 12 :(得分:2)

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 /偏好设置

“ 4176EED3-B9FC-4C77-A25E-ASD201B9FDFG2”是您的设备ID

和“ 56D7CE31-9A8B-4371-9B0F-9604E239423B0”是您的应用程序ID

我通常通过按Finder中最后修改的日期对文件夹进行排序来获取它们。最近编辑的文件夹是我的设备ID和应用ID。

享受!

答案 13 :(得分:1)

您可以NSLog设置您设置的每个值,例如:

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

答案 14 :(得分:1)

模拟器应用程序

此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 / organization / Library / Developer / CoreSimulator / Devices / 3E4C8DC3-6FF4-428F-A624-B78DBE0B8C83 / data / Containers / Bundle / Application / 960A5232-219D-4C46-8CA3-01E259D8DDAD / My App.app

     

为我的应用程序找到UserDefaults

Mac App

defaults read com.bundleid.app

答案 15 :(得分:1)

在Swift 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编辑器中看到内容。

仅适用于模拟器

谢谢@Niels Castle

答案 16 :(得分:1)

Swift 3

print(UserDefaults.standard.dictionaryRepresentation())

答案 17 :(得分:1)

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

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

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

答案 18 :(得分:0)

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

答案 19 :(得分:0)

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

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

答案 20 :(得分:0)

您可以在AppDelegate的application:didFinishLaunchingWithOptions:回调中打印首选项目录的路径:

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

然后,您可以直接查看plist文件,以查看其中保存的内容。

答案 21 :(得分:0)

它将在更高版本的SWIFT 4上运行

只需将代码放在AppDelegate的any方法中,然后在其中设置断点即可

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

在运行项目时,打印“路径”,您将获得使用userdefaults到达info.plist的路径 然后只需转到查找器并粘贴该路径 在该文件上已找到您

答案 22 :(得分:0)

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

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

因为我们可以看到有一些很难从终端猜测的大标识符,所以我建议在您的终端或查找器中搜索它们。

文件名应以 {bundle id}.plist 结尾,例如 com.sellerbuddy.online.plist,这样您就可以直接前往终端并使用您的应用程序包标识符输入如下内容。 >

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

enter image description here