【问题标题】:Easy way to see saved NSUserDefaults?查看保存的 NSUserDefaults 的简单方法?
【发布时间】:2010-12-13 05:06:32
【问题描述】:

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

【问题讨论】:

  • 使用它来获取您的应用程序目录的位置: print(NSHomeDirectory()) 从该位置,转到 Library>Preferences> 这将是 NSUserDefaults 保存数据的位置。
  • 在 Catalina UserDefaults.plist 上使用 XCode 12.3 在项目资源中可见,但不包含首选项值。
  • Bobby 建议的文件位于 Finder 不可见的隐藏文件夹中,除非通过单击 cmd-shift-period 显示隐藏项目

标签: ios objective-c macos nsuserdefaults


【解决方案1】:

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

/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"

【讨论】:

    【解决方案2】:

    它将适用于更高版本的 SWIFT 4

    只需将该代码放入 AppDelegate 的 any 方法中并在那里设置断点

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

    当你运行一个项目时,打印“path”,你会得到使用 userdefaults 到达 info.plist 的路径 然后只需转到查找器并粘贴该路径 您已通过该文件联系到您

    【讨论】:

      【解决方案3】:

      Swift 5 Xcode 11.2 解决方案

      这是您的 UserDefaults 键值在 plist 文件中的完整路径。关注并找到您的 app bundle 标识符 .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。

      享受吧!

      【讨论】:

        【解决方案4】:

        您可以从 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文件,看看里面保存了什么。

        【讨论】:

          【解决方案5】:

          您可以使用它来获取用户偏好、缓存和许多其他数据的完整路径

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

          【讨论】:

            【解决方案6】:

            对于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 用户默认设置。苹果 OS X 应用程序和其他程序使用默认系统来记录用户偏好和其他 应用程序未运行时必须维护的信息(例如新字体的默认字体) 文档或信息面板的位置)。大部分信息可通过应用程序访问 cation 的 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;
                ...
            

            【讨论】:

              【解决方案7】:

              对于 MacOS 应用程序
              转到:/Users/{User}/Library/Containers/com.{your company}.{your app}/Data/Library/Preferences 并使用 Xcode 打开您应用的 pList。

              【讨论】:

                【解决方案8】:

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

                【讨论】:

                  【解决方案9】:

                  在 Swift 4.0 中

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

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

                  我们将其转换为 NSDictionary。然后通过将它括在括号'()'中将允许我们调用 .allKeys 或 .allValues 就像在任何 NSDictionary 上一样

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

                  【讨论】:

                    【解决方案10】:

                    模拟器应用

                    此 shell 脚本搜索应用的 名称,获取 bundle id,并打开包含 Plist 文件的文件夹。 p>

                    #!/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/My App.app

                    为我的应用找到用户默认值

                    Mac 应用

                    defaults read com.bundleid.app
                    

                    【讨论】:

                      【解决方案11】:

                      使用下面的代码。

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

                      【讨论】:

                      • 太棒了!有趣的是,最好的答案通常是最短的。很少需要在终端模式下导航目录。看样子,极客喜欢走后门,说不定就是他们里面的秘密黑客?
                      • 谢谢,但无法得到您。你想说什么?
                      【解决方案12】:

                      你可以在模拟器中找到你的应用的pList文件,如果你去:

                      /users/你的用户名/Library/Application Support/iPhone Simulator//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 编辑器中打开它,然后浏览持久化的值,让你心满意足。

                      【讨论】:

                      • 我发现这在更高版本的 XCode 中发生了变化。您现在将在当前 ios 版本号而不是 User 下的目录中找到它 - 例如 /users/您的用户名/Library/Application Support/iPhone Simulator/4.3/Applications
                      • Interesting... 看来,如果您正在使用 NSUserDefaults 进行 OCMock / SenTestingKit 单元测试,那么 NSUserDefaults 不会持久化到 .plist 文件,而是在内存中进行管理: stackoverflow.com/questions/6193597/…
                      • 如何查看已经安装的应用程序?我的客户从应用商店下载了应用程序,但出现了问题。我需要检查 NSUserDefaults 文件
                      • 你的客户——如果你能和他交谈并且他有点精明——可以使用像 PhoneView 这样的工具来访问他的手机文件系统并将文件从手机上复制下来发送给你。跨度>
                      • 路径已更改为:~/Library/Developer/CoreSimulator/Devices
                      【解决方案13】:

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

                      【讨论】:

                        【解决方案14】:

                        斯威夫特 3

                        print(UserDefaults.standard.dictionaryRepresentation())
                        

                        【讨论】:

                          【解决方案15】:

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

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

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

                          【讨论】:

                            【解决方案16】:

                            在模拟器中运行时,我有时会使用下面的 sn -p 打印出我的 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
                            

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

                            【讨论】:

                            • 我喜欢这个回复。它很稳定,并且会一直工作,希望如此!
                            【解决方案17】:

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

                            仅适用于模拟器

                            感谢@尼尔斯城堡

                            【讨论】:

                            • 这是在 xcode 9.4 模拟器上查找 userdefaults plist 的唯一解决方案
                            【解决方案18】:

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

                            【讨论】:

                              【解决方案19】:

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

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

                              【讨论】:

                              • 这在调试器中也可以使用这个命令:(lldb) "po [[[NSUserDefaults standardUserDefaults] dictionaryRepresentation] allKeys]"
                              【解决方案20】:

                              很简单,由于plist文件名为&lt;app-bundle-identifier&gt;.plist,你可以使用find命令找到它的路径。但是如果你搜索你的整个计算机会花费很长时间,所以你必须选择一个好的范围,比如~/Library/Developer/CoreSimulator for 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,只需命令单击路径即可打开它。

                              【讨论】:

                                【解决方案21】:

                                在阅读了这个问题的已接受答案后,我整理了这个简单的脚本,它打开了 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
                                

                                【讨论】:

                                • 我怎么吃这个脚本,用叉子还是用手?我的意思是,我应该把它放在哪里?
                                • @Josh 你必须把它放在你的项目文件旁边(在我的例子中,脚本被命名为 open-prefs-plist.sh)。不过,我还没有使用最新的 Xcode 对此进行测试。我建议您 Flex 现在检查此信息。 github.com/Flipboard/FLEX
                                【解决方案22】:

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

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

                                【讨论】:

                                  【解决方案23】:

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

                                  只是键:

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

                                  键和值:

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

                                  【讨论】:

                                  • THX,这个效率更高~
                                  • Apple 可以为此在 XCode 中制作一个简单的查看器。就像 plist 查看器一样。但是不,他们不想让它变得容易。
                                  【解决方案24】:

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

                                  【讨论】:

                                  • 我是否可以建议您将该函数称为“logAllUserDefaults”,因为它实际上并没有“获取”默认值?
                                  • 对,@markrickert。也许可以从中创建一本字典并返回它。
                                  • 或者简单地说..NSLog(@"%@", [[[NSUserDefaults standardUserDefaults] dictionaryRepresentation] debugDescription]);(几乎和上面投票最多的答案一样。)
                                  猜你喜欢
                                  • 2018-07-06
                                  • 1970-01-01
                                  • 1970-01-01
                                  • 2012-05-24
                                  • 2014-11-09
                                  • 1970-01-01
                                  • 1970-01-01
                                  • 1970-01-01
                                  • 1970-01-01
                                  相关资源
                                  最近更新 更多