Простий спосіб побачити збережені NSUserDefaults?


225

Чи є спосіб побачити, на що безпосередньо було збережено NSUserDefaults? Я хотів би дізнатися, чи правильно зберігаються мої дані.


3
Використовуйте це, щоб отримати розташування каталогу ваших додатків: print (NSHomeDirectory ()) з цього місця, перейдіть до Бібліотеки> Налаштування> <yourAppsBundleName.plist> тут буде зберігати ваші дані NSUserDefaults.
Боббі

Відповіді:


162

Ви можете знайти файл pList для своєї програми в тренажері, якщо перейти до:

/ користувачів / ваше ім’я користувача / Бібліотека / Підтримка програм / iPhone Simulator / <Sim-версія> / Програми

У цьому каталозі є купа каталогів з іменем GUID. Якщо ви працюєте над декількома додатками, їх буде кілька. Тому вам потрібно знайти свій додаток:

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

Потім перейдіть до каталогу Бібліотека / Налаштування в каталозі GUID. Так:

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

Ви повинні знайти файл, який виглядає так:

<Bundle Identifier>.foo.pList

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


12
Я виявив, що це змінилося в пізніших версіях XCode. Тепер ви знайдете його в каталозі під поточним номером версії ios замість Користувача - наприклад, / користувачів / ваше ім’я користувача / Бібліотека / Підтримка програм / iPhone Simulator / 4.3 / Програми
nevster

Цікаво ... Здається , що якщо ви робите модульне тестування OCMock / SenTestingKit з NSUserDefaults, то NSUserDefaultsне зберігаються в файл .plist а управляється в пам'яті: stackoverflow.com/questions/6193597 / ...
ma11hew28

Як я можу переглянути його для вже встановленої програми? Мій клієнт завантажив програму з програми, і щось не так. Мені потрібно перевірити файл
NSUserDefaults

Ваш клієнт - якщо ви можете поговорити з ним, і він дещо кмітливий - може скористатися таким інструментом, як PhoneView, щоб отримати доступ до його файлової системи телефонів і скопіювати файл з телефону, щоб надіслати його вам.
Даніель Шнеллер

13
Шлях змінився на: ~ / Бібліотека / Розробник / CoreSimulator / Пристрої
Brainware

355

Ви можете надрукувати в журнал усі поточні параметри NSUserDefault:

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

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

Ключі та значення:

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

1
THX, цей більш ефективний ~
акустичний

3
Apple може зробити для цього простий переглядач у XCode. Як і глядач-пліст. Але ні, вони не хочуть робити це легко.
GeneCode

78

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

40

Ви можете перевірити значення для кожного ключа в масиві, повернутий

[[[NSUserDefaults standardUserDefaults] dictionaryRepresentation] allKeys]

3
Це також спрацювало у відладчику, використовуючи цю команду: (lldb) "po [[[NSUserDefaults standardUserDefaults] словникРепрезентація] 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

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


мені подобається ця відповідь. Це стабільно і завжди працюватиме, сподіваємось!
lucianoenrico

7

Легко, оскільки ім'я файлу плісту є <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 ​​так само, як і в будь-якому NSD Dictionary

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

6

Використовуйте код нижче.

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

Блискуче! Цікаво, як найкращі відповіді, як правило, найкоротші. Рідко потрібна навігація по каталогах у термінальному режимі. Очевидно, що вундики на кшталт під'їзду задніх дверей, можливо, таємний хакер у них?
Іван

Дякую, але не можу тебе отримати. Що ти хочеш сказати?
Містер Джевед Мултані

5

Для додатків OS X замість пошуку файлу плісту за замовчуванням програми простіше використовувати 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: параметри за замовчуванням зберігаються тут:

/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 і болісно знайти. Це дозволяє легко отримати доступ до каталогів додатків вашого симулятора.


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]);(Майже як у вищезгаданій відповіді вище).
1313

2

Знайдіть додаток для Mac під назвою SimPholders2 . Він знаходиться в рядку меню і перераховує всі використовувані вами тренажери, а потім показує кожен із ваших програм. Виберіть його, і ви отримаєте нове вікно 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 / дані / Контейнери / Комплект / Приклад / 960A5232-219D-4C46-8CA3 01E259D8DDAD / My App.app

Знайдені параметри користувача для мого додатка

Додаток для Mac

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

роздрукує розташування папки файлів плістів NSUserDefaults в консолі налагодження Xcode. Скопіюйте рядок шляху. Відкрийте Finder, виберіть Перейти до папки в пункті меню Go, вставте рядок шляху. Двічі клацніть файл плісту. Ви побачите вміст у своєму редакторі Xcode.

Робота лише в Simulator

Дякуємо @Niels Castle


Це єдине рішення, яке працювало на пошук списку користувачів за замовчуванням на симуляторі для xcode 9.4
anoo_radha

1

Я зберігаю ярлик на робочому столі в папці симулятора, де він зберігає програми, тобто:

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

Відсортуйте за найновішою датою, тоді просто зайдіть у найновішу папку бібліотеки / Налаштування та перегляньте файл у редакторі списку.



1

Для додатків MacOS
Перейдіть за посиланням: /Users/{User}/Library/Containers/com.{your company}. {Your app} / Дані / Бібліотека / Налаштування та відкрийте список додатків із Xcode.


1

Swift 5 Xcode 11.2 Рішення

Це весь шлях, де ваші ключові значення UserDefaults будуть знаходитись у файлі плісту. Дотримуйтесь і знайдіть .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

Прочитавши прийняту відповідь на це запитання, я зібрав цей простий скрипт, який відкриває файли плістів, які використовує симулятор 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.