Простой способ увидеть сохраненные 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. Затем просто перейдите в поисковик и вставьте этот путь, который вы достигли в этом файле

Другие вопросы по тегам