Есть ли способ увидеть, что было сохранено в NSUserDefaults напрямую? Я бы хотел, чтобы мои данные были сохранены правильно.
Легкий способ увидеть сохраненные NSUserDefaults?
Ответ 1
Вы можете найти файл pList для своего приложения в симуляторе, если вы перейдете к:
/users/ваше имя пользователя/Library/Поддержка приложений /iPhone Simulator/< Sim Version > /Applications
В этом каталоге есть куча 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 и просмотрите сохраненные значения в своем сердечном содержимом.
Ответ 2
Вы можете распечатать все текущие NSUserDefaults в журнале:
Просто клавиши:
NSLog(@"%@", [[[NSUserDefaults standardUserDefaults] dictionaryRepresentation] allKeys]);
Ключи и значения:
NSLog(@"%@", [[NSUserDefaults standardUserDefaults] dictionaryRepresentation]);
Ответ 3
В 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)
Ответ 4
Вы можете проверить значения для каждой клавиши в массиве, возвращенные
[[[NSUserDefaults standardUserDefaults] dictionaryRepresentation] allKeys]
Ответ 5
Я иногда использую следующий фрагмент, чтобы распечатать местоположение моего файла NSUserDefaults при работе в симуляторе
NSArray *path = NSSearchPathForDirectoriesInDomains( NSLibraryDirectory, NSUserDomainMask, YES); NSString *folder = [path objectAtIndex:0]; NSLog(@"Your NSUserDefaults are stored in this folder: %@/Preferences", folder);
Он выводит путь к папке с настройками
Ваши NSUserDefault хранятся в этой папке:/Users/castle/Library/Application Support/iPhone Simulator/User/Applications/BC5056A0-F46B-4AF1-A6DC-3A7DAB984960/Library/Preferences
Ваш файл NSUserDefaults находится в папке настроек и назван в соответствии с вашим префиксом и именем приложения, например.
dk.castleandersen.dreamteam.grid.plist
Я ожидаю, что то же самое верно для реального устройства.
Ответ 6
В Swift 4.0
//func dictionaryRepresentation() -> [String : AnyObject]
потому что dictionaryRepresentation NSUserDefaults.standardUserDefaults() возвращает [String: AnyObject]
Мы бросили это в NSDictionary. Затем, заключив его в круглые скобки, '()' позволит нам вызывать .allKeys или .allValues так же, как и в любом NSDictionary.
print((UserDefaults.standard.dictionaryRepresentation() as NSDictionary).allKeys)
Ответ 7
Используйте код ниже.
NSLog(@"NSUserDefault: %@", [[NSUserDefaults standardUserDefaults] dictionaryRepresentation]);
Ответ 8
Легко, так как имя файла 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, просто нажмите на ссылку, чтобы открыть его.
Ответ 9
Для Xcode 7
NSUserDefaults standardDefaults хранятся здесь:
/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, и это боль, чтобы найти. Это позволяет легко получить доступ к каталогам приложений для симуляторов.
Ответ 10
Для приложений 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 и другие программы используют систему значений по умолчанию для записи пользовательских настроек и другой информации, которая должна сохраняться, когда приложения не запущены (например, шрифт по умолчанию для новых документов или положение информационной панели). Большая часть этой информации доступна через панель предпочтений катиона appli-, но некоторая ее часть отсутствует, например, положение панели "Информация". Вы можете получить доступ к этой информации поdefaults
Пример:
$ defaults read com.apple.Safari
{
AutoplayPolicyWhitelistConfigurationUpdateDate = "2018-08-24 17:33:48 +0000";
AutoplayQuirksWhitelistConfigurationUpdateDate = "2018-08-24 17:33:48 +0000";
DefaultBrowserPromptingState2 = 4;
...
Ответ 11
Я построил этот метод на основе предложения Morion для лучшего представления. Используйте его, позвонив [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]);
}
}
Ответ 12
Найдите приложение Mac под названием SimPholders2. Он живет в строке меню и перечисляет все используемые вами имитаторы, а затем показывает каждое из ваших приложений. Выберите один, и вы получите новое окно Finder, уже открытое для каталога приложения. Это упрощает поиск вашего приложения и всех его каталогов. Это огромная экономия времени (и я охотно пожертвовал автору).
Ответ 13
Вы можете NSLog установить каждое значение, например:
NSLog(@"%@",[[NSUserDefaults standardDefaults] stringForKey:@"WhateverTheKeyYouSet"]);
Ответ 14
Я держу ярлык на своем рабочем столе в папке симулятора, где он хранит приложения, а именно:
/Users/gary/Library/Application Support/iPhone Simulator/User/Applications
Отсортировано по самой последней дате, а затем просто зайдите в самую последнюю библиотеку приложений/Предпочтения и просмотрите файл в редакторе plist.
Ответ 15
Приложение для симулятора
В этой оболочке script найдите имя приложения, получите идентификатор пакета и открыть папки, содержащие файлы 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
Расширенная script версия
Использование: 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
Найдено приложение Мое приложение (com.organisation.MyApp) /Пользователи/организация/Library/Разработчик/CoreSimulator/Devices/3E4C8DC3-6FF4-428F-A624-B78DBE0B8C83/data/Контейнеры/Пакет/Приложение/960A5232-219D-4C46-8CA3-01E259D8DDAD/My App.app
UserDefaults, найденные для моего приложения
Mac App
defaults read com.bundleid.app
Ответ 16
В Swift 2.2
let path = NSSearchPathForDirectoriesInDomains(.LibraryDirectory, .UserDomainMask, true)
let folder = path[0]
NSLog("Your NSUserDefaults are stored in this folder: \(folder)/Preferences")
распечатает папку NSUserDefaults plist в папке отладки Xcode. Скопируйте строку пути. Откройте Finder, выберите "Перейти в папку" в меню "Перейти", "Вставить строку пути". Дважды щелкните файл plist. Вы увидите содержимое в редакторе Xcode.
Работает только в симуляторе
Спасибо за замок @Niels
Ответ 17
Swift 3
print(UserDefaults.standard.dictionaryRepresentation())
Ответ 18
Для приложений MacOS
Перейдите по адресу: /Users/ndomUser automotive/Library/Containers/com. enjyour company}. {Ваше приложение}/Data/Library/Preferences и откройте свой список pList с помощью Xcode.
Ответ 19
После прочтения ответа на этот вопрос я собрал этот простой script, который открывает файлы 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 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 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
Ответ 20
Вы можете использовать это, чтобы получить полный путь к пользовательским настройкам, кешу и многим другим данным.
print(NSSearchPathForDirectoriesInDomains(.documentDirectory,.userDomainMask, true))
Ответ 21
Вы можете распечатать путь к каталогу настроек из обратного вызова 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 напрямую, чтобы увидеть, что там сохранено.