Есть ли способ увидеть, что было сохранено NSUserDefaults
напрямую? Я хотел бы посмотреть, правильно ли сохранены мои данные.
Есть ли способ увидеть, что было сохранено NSUserDefaults
напрямую? Я хотел бы посмотреть, правильно ли сохранены мои данные.
Ответы:
Вы можете найти файл 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 и просмотрите сохраненные значения для вашего сердца.
NSUserDefaults
, то NSUserDefaults
они не сохраняются в файле .plist, а управляются в памяти: stackoverflow.com/questions/6193597/…
Вы можете распечатать все текущие NSUserDefaults в журнал:
Просто ключи:
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, но это вернет полную иерархию наследования каждого элемента в массиве значений. Если требуется больше информации об объектах, тогда используйте dump, иначе продолжайте с обычным оператором печати.
// 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
Я ожидаю, что то же самое будет верно для фактического устройства.
Легко, так как имя файла 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 так же, как и в любом NSDictionary.
print((UserDefaults.standard.dictionaryRepresentation() as NSDictionary).allKeys)
Используйте код ниже.
NSLog(@"NSUserDefault: %@", [[NSUserDefaults standardUserDefaults] dictionaryRepresentation]);
Для приложений 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;
...
Для 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 и найти их очень сложно. Это позволяет легко получить доступ к каталогам приложений вашего симулятора.
Я построил этот метод на основе предложения Мориона для лучшей презентации. Используйте его, позвонив[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 под названием SimPholder2 . Он находится в строке меню и перечисляет все симуляторы, которые вы использовали, а затем показывает каждое из ваших приложений. Выберите один, и вы получите новое окно 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 / data / Containers / Bundle / Приложение / 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")
распечатает расположение папки файла plist NSUserDefaults в консоли отладки Xcode. Скопируйте строку пути. Откройте Finder, выберите пункт «Перейти к папке в меню« Перейти », вставьте строку пути. Дважды щелкните файл plist. Вы увидите содержимое в вашем редакторе Xcode.
Работаю только в симуляторе
Спасибо @ Niels Castle
Я держу ярлык на рабочем столе в папке симулятора, где хранятся приложения, а именно:
/Users/gary/Library/Application Support/iPhone Simulator/User/Applications
Сортировка по самой последней дате, затем просто перейдите в самую последнюю папку приложения Library / Preferences и просмотрите файл в редакторе plist.
Свифт 3
print(UserDefaults.standard.dictionaryRepresentation())
Решение 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. И последняя отредактированная папка - это мой идентификатор устройства и идентификатор приложения.
Наслаждайтесь!
Вы можете NSLog каждое установленное вами значение, например:
NSLog(@"%@",[[NSUserDefaults standardDefaults] stringForKey:@"WhateverTheKeyYouSet"]);
Прочитав принятый ответ на этот вопрос, я собрал этот простой сценарий, который открывает файлы 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
Вы можете использовать это, чтобы получить полный путь к пользовательским настройкам, кешу и многим другим данным.
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 напрямую, чтобы увидеть, что там сохранено.