Простой способ увидеть сохраненные NSUserDefaults?

есть ли способ увидеть, что было сохранено в NSUserDefaults напрямую? Я хотел бы посмотреть, правильно ли сохранены мои данные.

19 ответов


вы можете найти файл pList для вашего приложения в симуляторе, если вы перейдете к:

/пользователи/имя пользователя / библиотека / поддержка приложений / iPhone Simulator / / приложения

этот каталог имеет кучу GUID именованных каталогов. Если вы работаете над несколькими приложениями, их будет несколько. Таким образом, вам нужно найти приложение binary:

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

затем перейдите в каталог Library / Preferences в каталоге GUID. Итак:

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

вам необходимо найти файл, который выглядит так:

<Bundle Identifier>.foo.pList

Откройте это в Редакторе pList и просмотрите сохраненные значения к содержанию вашего сердца.


вы можете распечатать все текущие NSUserDefaults в журнале:

просто клавиши:

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

ключи и значения:

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

в Swift мы можем использовать следующее:-

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 здесь, но это вернет полную иерархию наследования каждого элемента в массиве значений. Если больше требуется информация об объектах, затем используйте дамп, иначе продолжайте обычную инструкцию 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)

вы можете проверить значения для каждого ключа в массив, возвращаемый

[[[NSUserDefaults standardUserDefaults] dictionaryRepresentation] allKeys]

иногда я использую следующий фрагмент, чтобы распечатать местоположение моего файла NSUserDefaults при запуске в симуляторе

NSArray *path = NSSearchPathForDirectoriesInDomains(
   NSLibraryDirectory, NSUserDomainMask, YES);
NSString *folder = [path objectAtIndex:0];
NSLog(@"Your NSUserDefaults are stored in this folder: %@/Preferences", folder);

Он дает путь к папке настроек

ваши NSUserDefaults хранятся в этой папке: / пользователи / замок / библиотека / поддержка приложений / iPhone Simulator / пользователь / приложения/BC5056A0-F46B-4AF1-A6DC-3A7DAB984960/библиотека / настройки

ваш файл NSUserDefaults находится в папке настроек и назван в соответствии с вашим префиксом и именем приложения, например

dk.castleandersen.dreamteam.grid.plist

Я ожидаю, что то же самое будет верно для фактического устройства.


использовать ниже код.

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

В Swift 4.0

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

потому что dictionaryRepresentation NSUserDefaults.standardUserDefaults() возвращает [Строка: AnyObject]

мы бросили его в NSDictionary. Тогда окружив его в скобках '() ' позволит нам позвонить .allKeys или .allValues так же, как и на любом NSDictionary

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

легко, так как имя файла 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

и оттуда вы можете использовать


Для 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 потому что в эти дни все позади UUIDs и больно найти. Это позволяет легко получить доступ к каталогам приложений simulator.


Я построил этот метод, основанный на предложении Мориона для лучшей презентации. Используйте его, позвонив [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]);
    }
}

ищите приложение Mac под названием SimPholders2. Он живет в строке меню и перечисляет все используемые вами симуляторы, а затем показывает каждое из ваших приложений. Выберите один, и вы получите новое окно Finder, уже открытое в каталоге приложения. Это позволяет очень легко найти ваше приложение и все его каталоги. Это огромная экономия времени (и я охотно пожертвовал автору).


Приложение

этот скрипт оболочки ищет имя приложения, получить идентификатор пакета и открыть папки, содержащие файлы Plist.

#!/bin/bash

appname=""
[ -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 "")"' -- {} \;
else
    echo "No application found by that name: $appname.app"
fi

Расширенная версия скрипта

использование: iphone-app-folder "My App"

#!/bin/bash
appname=""
[ -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 "3[1;30m$apppath3[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 "3[1;32mUserDefaults found for $appname3[0m"
        echo -e "3[1;30m$plists3[0m"
        plistutil -i "$plists"
        /usr/bin/open $(dirname "$plists")
    elif [[ ${#plists} -gt 0 ]]; then
        echo -e "3[1;32mUserDefaults found for $appname3[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 "3[31mNo UserDefaults plist found for $appname3[0m"
    fi
else
    echo -e "3[31mNo application found by that name: $appname.app3[0m"
fi

найдено приложение мое приложение (com.организация.MyApp) /Users/organisation/Library/Developer/CoreSimulator/Devices/3E4C8DC3-6FF4-428F-A624-B78DBE0B8C83/data/Containers/Bundle/Application/960A5232-219D-4C46-8CA3-01E259D8DDAD/мое приложение.app

UserDefaults найдено для моего приложения

Mac App

defaults read com.bundleid.app

вы можете NSLog каждое значение, которое вы установили, например:

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

В Swift 2.2

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

распечатает расположение папки plist файла NSUserDefaults в консоли отладки Xcode. Скопируйте строку пути. Откройте Finder, выберите пункт Перейти в папку в меню перейти, вставьте строку пути. Дважды щелкните файл plist. Вы увидите содержимое в Редакторе Xcode.

работает только в симуляторе

Спасибо @Niels Castle


Я храню ярлык на рабочем столе в папке симулятора, где он хранит приложения, т. е.:

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

сортируется по последней дате, затем просто зайдите в самую последнюю библиотеку папок приложения/Настройки и просмотрите файл в Редакторе plist.


Swift 3

print(UserDefaults.standard.dictionaryRepresentation())

для приложений MacOS
Перейдите к: / Users / {User} / Library/Containers / com.{ваша компания.}{ваше приложение} / данные / библиотека / настройки и откройте pList вашего приложения с помощью Xcode.


после прочтения принятого ответа на этот вопрос я собрал этот простой скрипт, который открывает файлы plist, используемые симулятором iOS для хранения NSUserDefaults предпочтения, и хотя он предполагает определенную настройку (идеально подходит для моей), он может работать в качестве отправной точки для других.

$ 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

на 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 позволяет пользователям читать,писать и удалять значения по умолчанию для Mac OS X из командной строки. Мак Приложения 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;
    ...