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


225

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


3
Используйте это, чтобы получить местоположение вашего каталога приложений: распечатайте (NSHomeDirectory ()) из этого местоположения, перейдите в Library> Preferences> <yourAppsBundleName.plist>, где NSUserDefaults сохраняет ваши данные.
Бобби

Ответы:


162

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

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

Этот каталог имеет кучу именованных каталогов 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 и просмотрите сохраненные значения для вашего сердца.


12
Я обнаружил, что это изменилось в более поздних версиях XCode. Теперь вы найдете его в каталоге под текущим номером версии ios вместо пользователя - например, / users / ваше имя пользователя / Library / Application Support / iPhone Simulator / 4.3 / Applications
nevster

Интересно ... Похоже, что если вы выполняете модульное тестирование OCMock / SenTestingKit NSUserDefaults, то NSUserDefaultsони не сохраняются в файле .plist, а управляются в памяти: stackoverflow.com/questions/6193597/…
ma11hew28

Как я могу просмотреть его для уже установленного приложения? Мой клиент скачал приложение из магазина приложений, и что-то не так. Мне нужно проверить файл
NSUserDefaults

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

13
Путь изменился на: ~ / Библиотека / Разработчик / CoreSimulator / Устройства
Brainware

355

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

Просто ключи:

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

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

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

1
THX, этот более эффективный ~
акустический

3
Apple может сделать для этого простой просмотрщик в XCode. Понравился просмотрщик списков. Но нет, они не хотят, чтобы это было легко.
GeneCode

79

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

40

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

[[[NSUserDefaults standardUserDefaults] dictionaryRepresentation] allKeys]

3
Это также работало в отладчике с помощью этой команды: (lldb) "po [[[NSUserDefaults standardUserDefaults] dictionaryRepresentation] allKeys]"
Этан Паркер

21

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

NSArray * path = NSSearchPathForDirectoriesInDomains (
   NSLibraryDirectory, NSUserDomainMask, YES);
NSString * folder = [path objectAtIndex: 0];
NSLog (@ "Ваши NSUserDefaults хранятся в этой папке:% @ / Preferences", папка);

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

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

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

dk.castleandersen.dreamteam.grid.plist

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


мне нравится этот ответ. Он стабильный и всегда будет работать, надеюсь!
Лучаноэнрико

7

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


7

В Swift 4.0

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

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

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

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

6

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

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

Brilliant! Интересно, что лучшие ответы обычно самые короткие. Редко бывает необходимо перемещаться по каталогам в режиме терминала. Очевидно, гики как задняя дверь подходят, может быть, секретный хакер в них?
Джон

Спасибо, но не могу тебя достать. Что ты хочешь сказать?
Мистер Джавед Мултани

5

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

Пример:

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

4

Для Xcode 7

NSUserDefaults standardDefaults хранятся здесь:

/Users/{USER}/Library/Developer/CoreSimulator/Devices/{UUID}/data/Containers/Data/Application/{UUID}

NSUserDefaults для группы suite / app хранятся здесь:

/Users/{USER}/Library/Developer/CoreSimulator/Devices/{UUID}/data/Containers/Shared/AppGroup/{UUID}/Library/Preferences/{GROUP_NAME}.plist

Я бы порекомендовал использовать https://github.com/scinfu/NCSimulatorPlugin, потому что в наши дни все отстает от UUID и найти их очень сложно. Это позволяет легко получить доступ к каталогам приложений вашего симулятора.


2

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

2
Могу я предложить, чтобы вы вызвали эту функцию "logAllUserDefaults", поскольку она на самом деле не "получает" значения по умолчанию?
markrickert

Правильно, @markrickert. Может быть, тогда можно создать словарь и вернуть его.
Джулиан Ф. Вайнерт

1
Или просто .. NSLog(@"%@", [[[NSUserDefaults standardUserDefaults] dictionaryRepresentation] debugDescription]);(Почти как в ответе, получившем
наибольшее количество

2

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


2

Приложение Симулятор

Этот сценарий оболочки выполняет поиск имени приложения, получает идентификатор пакета и открывает папки, содержащие файлы 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 / Устройства / 3E4C8DC3-6FF4-428F-A624-B78DBE0B8C83 / data / Containers / Bundle / Приложение / 960A5232-219D-4C46-8CA3- 01E259D8DDAD / My App.app

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

Mac App

defaults read com.bundleid.app

1

В 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


Это единственное решение, которое сработало для поиска списка пользователей по умолчанию на симуляторе для xcode 9.4
anoo_radha

1

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

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

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



1

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


1

Решение Swift 5 Xcode 11.2

Это полный путь, где ваши значения ключей UserDefaults будут находиться в файле plist. Следуйте и найдите файл идентификатора пакета приложения .plist.

/ Пользователи / 'Ваше имя пользователя' / Библиотека / Разработчик / CoreSimulator / Устройства / 4176EED3-B9FC-4C77-A25E-ASD201B9FDFG2 / данные / Контейнеры / Данные / Приложение / 56D7CE31-9A8B-4371-9B0F-9604E239423B0 / Библиотека / Предпочтения

Здесь «4176EED3-B9FC-4C77-A25E-ASD201B9FDFG2» - это идентификатор вашего устройства

и "56D7CE31-9A8B-4371-9B0F-9604E239423B0" - это идентификатор вашего приложения

Я обычно получаю их, сортируя папки по дате последнего изменения в Finder. И последняя отредактированная папка - это мой идентификатор устройства и идентификатор приложения.

Наслаждайтесь!


0

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

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

0

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

Как мне есть этот сценарий, с вилками или руками? куда я это положу?
Джош

1
@Josh Вы должны положить его вместе с файлами проекта (в моем примере скрипт называется open-prefs-plist.sh). Я не проверял это с последним Xcode, хотя. Я рекомендую вам Flex, чтобы проверить эту информацию сейчас. github.com/Flipboard/FLEX
Ernesto MB

0

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

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


0

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

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.