Простой способ увидеть сохраненные NSUserDefaults?
Есть ли способ увидеть, что было сохранено в NSUserDefaults
напрямую? Я хотел бы увидеть, правильно ли сохранены мои данные.
24 ответа
Вы можете найти файл 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 в журнал:
Просто ключи:
NSLog(@"%@", [[[NSUserDefaults standardUserDefaults] dictionaryRepresentation] allKeys]);
Ключи и значения:
NSLog(@"%@", [[NSUserDefaults standardUserDefaults] dictionaryRepresentation]);
В 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)
Вы можете проверить значения для каждого ключа в массиве, возвращаемого
[[[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 и найти их очень сложно. Это позволяет легко получить доступ к каталогам приложений вашего симулятора.
Swift 5 Xcode 11.2 Решение
Это полный путь, по которому ваши значения ключей UserDefaults будут находиться в файле plist. Следуйте и найдите файл.plist идентификатора пакета приложений.
/ Users / "Ваше имя пользователя" /Library/Developer/CoreSimulator/Devices/4176EED3-B9FC-4C77-A25E-ASD201B9FDFG2/data/Containers/Data/Application/56D7CE31-9A8B-4371-9B0F-9604E239423B0/Library/Preferences
Здесь "4176EED3-B9FC-4C77-A25E-ASD201B9FDFG2" - идентификатор вашего устройства.
и "56D7CE31-9A8B-4371-9B0F-9604E239423B0" - ваш идентификатор приложения.
Обычно я получаю их, сортируя папки по дате последнего изменения в Finder. И самая последняя редактируемая папка - это мой идентификатор устройства и идентификатор приложения.
Наслаждайтесь!
Я построил этот метод на основе предложения Мориона для лучшей презентации. Используйте его, позвонив [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]);
}
}
В 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
Найдите приложение для 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
Для моего приложения найдены пользовательские значения по умолчанию
Mac App
defaults read com.bundleid.app
Я держу ярлык на рабочем столе в папке симулятора, где хранятся приложения, а именно:
/Users/gary/Library/Application Support/iPhone Simulator/User/Applications
Отсортировано по самой последней дате, затем просто перейдите в самую последнюю папку приложения Library/Preferences и просмотрите файл в редакторе plist.
Вы можете NSLog каждое установленное вами значение, например:
NSLog(@"%@",[[NSUserDefaults standardDefaults] stringForKey:@"WhateverTheKeyYouSet"]);
Для приложений MacOS
Перейдите по адресу: /Users/ndomUser‹/Library/Containers/com. averageyour company}.{Ваше приложение}/Data/Library/Preferences и откройте pList вашего приложения с помощью Xcode.
Свифт 3
print(UserDefaults.standard.dictionaryRepresentation())
Прочитав принятый ответ на этот вопрос, я собрал этот простой скрипт, который открывает файлы 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
Вы можете распечатать путь к каталогу настроек из 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 напрямую, чтобы увидеть, что там сохранено.
Вы можете использовать это, чтобы получить полный путь к пользовательским настройкам, кешу и многим другим данным.
print(NSSearchPathForDirectoriesInDomains(.documentDirectory, .userDomainMask, true))
для пользователей, которые хотят найти новое местоположение для предпочтений, сохраненных в симуляторе. Здесь я нахожу сохраненные значения.
/Users/vikas/Library/Developer/CoreSimulator/Devices/CE5A0444-BD98-4FEE-A839-92728D6E9895/data/Containers/Data/Application/F7430839-ED2C-408A-8A8E-FE7FFAABA8E2/Library/Preferences
поскольку мы видим, что есть большие идентификаторы, которые трудно угадать с помощью терминала, я бы посоветовал поискать их в вашем терминале или поисковике.
имя файла должно заканчиваться на {идентификатор пакета} .plist, например
com.sellerbuddy.online.plist
так что вы можете просто перейти к терминалу и ввести что-то вроде ниже с идентификатором вашего пакета приложений.
find ~/Library/Developer/CoreSimulator/Devices -type f -name "com.sellerbuddy.online.plist"
Он будет работать на более поздней версии SWIFT 4
просто поместите этот код в любой метод AppDelegate и установите там точку останова
**> let path =
> NSSearchPathForDirectoriesInDomains(FileManager.SearchPathDirectory.documentDirectory,
> FileManager.SearchPathDomainMask.userDomainMask, true).first**
когда вы запустите проект, напечатайте "путь", и вы получите путь к info.plist с userdefaults. Затем просто перейдите в поисковик и вставьте этот путь, который вы достигли в этом файле