Чи є спосіб побачити, на що безпосередньо було збережено NSUserDefaults
? Я хотів би дізнатися, чи правильно зберігаються мої дані.
Чи є спосіб побачити, на що безпосередньо було збережено NSUserDefaults
? Я хотів би дізнатися, чи правильно зберігаються мої дані.
Відповіді:
Ви можете знайти файл 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
Відкрийте це в редакторі списку і перегляньте збережені значення до вмісту вашого серця.
NSUserDefaults
, то NSUserDefaults
не зберігаються в файл .plist а управляється в пам'яті: stackoverflow.com/questions/6193597 / ...
Ви можете надрукувати в журнал усі поточні параметри NSUserDefault:
Просто клавіші:
NSLog(@"%@", [[[NSUserDefaults standardUserDefaults] dictionaryRepresentation] allKeys]);
Ключі та значення:
NSLog(@"%@", [[NSUserDefaults standardUserDefaults] dictionaryRepresentation]);
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))
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 (@ "Ваші NSUserDefaults зберігаються в цій папці:% @ / Preferences", папка);
Це дає шлях до папки налаштувань
Ваші NSUserDefaults зберігаються в цій папці: / Користувачі / замок / Бібліотека / Підтримка програм / iPhone Simulator / Користувач / Програми / BC5056A0-F46B-4AF1-A6DC-3A7DAB984960 / Бібліотека / Налаштування
Ваш файл NSUserDefaults знаходиться в папці налаштувань і називається відповідно до вашого префікса та назви програми, наприклад
dk.castleandersen.dreamteam.grid.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 , просто натисніть команду, щоб відкрити його.
У Swift 4.0
//func dictionaryRepresentation() -> [String : AnyObject]
тому що DictionaryRepresentation NSUserDefaults.standardUserDefaults () повертає [String: AnyObject]
Ми кидаємо його на NSDictionary
. Тоді оточення його в дужках "()" дозволить нам викликати .allKeys або .allValues так само, як і в будь-якому NSD Dictionary
print((UserDefaults.standard.dictionaryRepresentation() as NSDictionary).allKeys)
Використовуйте код нижче.
NSLog(@"NSUserDefault: %@", [[NSUserDefaults standardUserDefaults] dictionaryRepresentation]);
Для додатків 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;
...
Для 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 і болісно знайти. Це дозволяє легко отримати доступ до каталогів додатків вашого симулятора.
Я побудував цей метод на основі пропозиції Моріона щодо кращого представлення. Використовуйте його, зателефонувавши[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]);
}
}
NSLog(@"%@", [[[NSUserDefaults standardUserDefaults] dictionaryRepresentation] debugDescription]);
(Майже як у вищезгаданій відповіді вище).
Знайдіть додаток для Mac під назвою SimPholders2 . Він знаходиться в рядку меню і перераховує всі використовувані вами тренажери, а потім показує кожен із ваших програм. Виберіть його, і ви отримаєте нове вікно Finder, яке вже відкрите до каталогу програми. Це дозволяє легко знайти додаток і всі його каталоги. Це величезна економія часу (і я охоче пожертвував автору).
Цей скрипт оболонки шукає ім’я програми, отримує ідентифікатор пакета та відкриває папки, що містять файли 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
Знайдені параметри користувача для мого додатка
defaults read com.bundleid.app
У 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
Я зберігаю ярлик на робочому столі в папці симулятора, де він зберігає програми, тобто:
/Users/gary/Library/Application Support/iPhone Simulator/User/Applications
Відсортуйте за найновішою датою, тоді просто зайдіть у найновішу папку бібліотеки / Налаштування та перегляньте файл у редакторі списку.
Швидкий 3
print(UserDefaults.standard.dictionaryRepresentation())
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. І найновіша редагована папка - це мій ідентифікатор пристрою та ідентифікатор додатка.
Насолоджуйтесь!
Ви можете NSLog кожне задане вами значення, наприклад:
NSLog(@"%@",[[NSUserDefaults standardDefaults] stringForKey:@"WhateverTheKeyYouSet"]);
Прочитавши прийняту відповідь на це запитання, я зібрав цей простий скрипт, який відкриває файли плістів, які використовує симулятор 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
Ви можете користуватися цим, щоб отримати повний шлях щодо налаштувань користувача, кешу та багатьох інших даних
print(NSSearchPathForDirectoriesInDomains(.documentDirectory, .userDomainMask, true))
Ви можете роздрукувати шлях до каталогу налаштувань із 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 безпосередньо, щоб побачити, що там збережено.