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

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

Ответ 1

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

/users/ваше имя пользователя/Library/Поддержка приложений /iPhone Simulator/< Sim Version > /Applications

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

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 и просмотрите сохраненные значения в своем сердечном содержимом.

Ответ 2

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

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

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

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

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

Ответ 3

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

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

Ответ 4

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

[[[NSUserDefaults standardUserDefaults] dictionaryRepresentation] allKeys]

Ответ 5

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

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

Он выводит путь к папке с настройками

Ваши NSUserDefault хранятся в этой папке:/Users/castle/Library/Application Support/iPhone Simulator/User/Applications/BC5056A0-F46B-4AF1-A6DC-3A7DAB984960/Library/Preferences

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

dk.castleandersen.dreamteam.grid.plist

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

Ответ 6

В Swift 4.0

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

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

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

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

Ответ 7

Используйте код ниже.

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

Ответ 8

Легко, так как имя файла 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, просто нажмите на ссылку, чтобы открыть его.

Ответ 9

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

Ответ 10

Для приложений 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 из командной строки. Приложения Mac OS X и другие программы используют систему значений по умолчанию для записи пользовательских настроек и другой информации, которая должна сохраняться, когда приложения не запущены (например, шрифт по умолчанию для новых документов или положение информационной панели). Большая часть этой информации доступна через панель предпочтений катиона appli-, но некоторая ее часть отсутствует, например, положение панели "Информация". Вы можете получить доступ к этой информации по defaults

Пример:

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

Ответ 11

Я построил этот метод на основе предложения 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]);
    }
}

Ответ 12

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

Ответ 13

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

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

Ответ 14

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

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

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

Ответ 15

Приложение для симулятора

В этой оболочке script найдите имя приложения, получите идентификатор пакета и открыть папки, содержащие файлы 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

Расширенная script версия

Использование: 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) /Пользователи/организация/Library/Разработчик/CoreSimulator/Devices/3E4C8DC3-6FF4-428F-A624-B78DBE0B8C83/data/Контейнеры/Пакет/Приложение/960A5232-219D-4C46-8CA3-01E259D8DDAD/My App.app

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

Mac App

defaults read com.bundleid.app

Ответ 16

В Swift 2.2

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

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

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

Спасибо за замок @Niels

Ответ 17

Swift 3

print(UserDefaults.standard.dictionaryRepresentation())

Ответ 18

Для приложений MacOS
Перейдите по адресу: /Users/ndomUser automotive/Library/Containers/com. enjyour company}. {Ваше приложение}/Data/Library/Preferences и откройте свой список pList с помощью Xcode.

Ответ 19

После прочтения ответа на этот вопрос я собрал этот простой script, который открывает файлы 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 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 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

Ответ 20

Вы можете использовать это, чтобы получить полный путь к пользовательским настройкам, кешу и многим другим данным.

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

Ответ 21

Вы можете распечатать путь к каталогу настроек из обратного вызова 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 напрямую, чтобы увидеть, что там сохранено.