Есть ли способ увидеть, что было сохранено в 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 напрямую, чтобы увидеть, что там сохранено.