Cara mudah untuk melihat NSUserDefaults yang disimpan?

225

Apakah ada cara untuk melihat apa yang telah disimpan NSUserDefaultssecara langsung? Saya ingin melihat apakah data saya disimpan dengan benar.

Ethan
sumber
3
Gunakan ini untuk mendapatkan lokasi direktori aplikasi Anda: cetak (NSHomeDirectory ()) dari lokasi itu, buka Library> Preferences> <yourAppsBundleName.plist> ini akan menjadi tempat NSUserDefaults menyimpan data Anda.
Bobby

Jawaban:

162

Anda dapat menemukan file pList untuk aplikasi Anda di simulator jika Anda masuk ke:

/ pengguna / nama pengguna Anda / Perpustakaan / Dukungan Aplikasi / iPhone Simulator / <Versi Sim> / Aplikasi

Direktori ini memiliki banyak direktori bernama GUID. Jika Anda mengerjakan beberapa aplikasi, akan ada beberapa aplikasi. Jadi, Anda perlu menemukan biner aplikasi Anda:

find . -name foo.app
./1BAB4C83-8E7E-4671-AC36-6043F8A9BFA7/foo.app

Kemudian pergi ke direktori Library / Preferences di direktori GUID. Begitu:

cd 1BAB4C83-8E7E-4671-AC35-6043F8A9BFA7/Library/Preferences

Anda harus menemukan file yang terlihat seperti:

<Bundle Identifier>.foo.pList

Buka ini di editor pList dan ramban nilai yang ada untuk isi hati Anda.

RedBlueThing
sumber
12
Saya menemukan ini telah berubah di versi XCode selanjutnya. Anda sekarang akan menemukannya di direktori di bawah nomor versi ios saat ini, bukan Pengguna - misalnya / pengguna / nama pengguna Anda / Perpustakaan / Dukungan Aplikasi / iPhone Simulator / 4.3 / Aplikasi
nevster
Menarik ... Tampaknya jika Anda melakukan pengujian unit OCMock / SenTestingKit NSUserDefaults, maka file NSUserDefaultstersebut tidak bertahan pada file .plist melainkan dikelola dalam memori: stackoverflow.com/questions/6193597/…
ma11hew28
Bagaimana saya bisa melihatnya untuk aplikasi yang sudah diinstal? Klien saya mengunduh aplikasi dari appstore, dan ada sesuatu yang salah. Saya perlu memeriksa file NSUserDefaults
Dejell
Klien Anda - jika Anda dapat berbicara dengannya dan dia agak paham - dapat menggunakan alat seperti PhoneView untuk mendapatkan akses ke sistem file ponselnya dan menyalin file dari ponsel untuk mengirimkannya kepada Anda.
Daniel Schneller
13
Path telah berubah menjadi: ~ / Library / Developer / CoreSimulator / Devices
Brainware
355

Anda dapat mencetak semua NSUserDefaults saat ini ke log:

Hanya kunci:

NSLog(@"%@", [[[NSUserDefaults standardUserDefaults] dictionaryRepresentation] allKeys]);

Kunci dan nilai:

NSLog(@"%@", [[NSUserDefaults standardUserDefaults] dictionaryRepresentation]);
marshn
sumber
1
THX, yang ini lebih efisien ~
akustik
3
Apple dapat membuat penampil sederhana di XCode untuk ini. Seperti penampil plist. Tapi tidak, mereka tidak ingin membuatnya mudah.
GeneCode
78

Di Swift kita dapat menggunakan yang berikut: -

Swift 3.x & 4.x

Untuk mendapatkan semua kunci & nilai:

for (key, value) in UserDefaults.standard.dictionaryRepresentation() {
    print("\(key) = \(value) \n")
}

Untuk mengambil perwakilan kamus dari default pengguna:

print(Array(UserDefaults.standard.dictionaryRepresentation()))

Untuk mengambil kunci:

// Using dump since the keys are an array of strings.
dump(Array(UserDefaults.standard.dictionaryRepresentation().keys))

Untuk mengambil nilai:

Kita bisa menggunakan dump di sini juga, tetapi itu akan mengembalikan hierarki warisan lengkap dari setiap elemen dalam array nilai. Jika informasi lebih lanjut tentang objek diperlukan, maka gunakan dump, kalau tidak pergi dengan pernyataan cetak normal.

// dump(Array(UserDefaults.standard.dictionaryRepresentation().values))
print(Array(UserDefaults.standard.dictionaryRepresentation().values))

Swift 2.x

Untuk mengambil perwakilan kamus dari default pengguna:

print(NSUserDefaults.standardUserDefaults().dictionaryRepresentation())

Untuk mengambil kunci:

print(NSUserDefaults.standardUserDefaults().dictionaryRepresentation().keys.array)

Untuk mengambil nilai:

print(NSUserDefaults.standardUserDefaults().dictionaryRepresentation().values.array)
footyapps27
sumber
40

Anda dapat memeriksa nilai untuk setiap kunci dalam array, dikembalikan oleh

[[[NSUserDefaults standardUserDefaults] dictionaryRepresentation] allKeys]
Morion
sumber
3
Ini juga berfungsi di debugger dengan menggunakan perintah ini: (lldb) "po [[[NSUserDefaults standardUserDefaults] dictionaryRepresentation] allKeys]"
Ethan Parker
21

Saya kadang-kadang menggunakan cuplikan berikut untuk mencetak lokasi file NSUserDefaults saya saat berjalan di simulator

NSArray * path = NSSearchPathForDirectoriesInDomains (
   NSLibraryDirectory, NSUserDomainMask, YES);
NSString * folder = [path objectAtIndex: 0];
NSLog (@ "NSUserDefaults Anda disimpan di folder ini:% @ / Preferensi", folder);

Ini menghasilkan jalur ke folder preferensi

NSUserDefaults Anda disimpan dalam folder ini: / Pengguna / benteng / Perpustakaan / Dukungan Aplikasi / iPhone Simulator / Pengguna / Aplikasi / BC5056A0-F46B-4AF1-A6DC-3A7DAB984960 / Perpustakaan / Preferensi

File NSUserDefaults Anda terletak di folder preferensi dan dinamai sesuai dengan awalan dan nama aplikasi Anda, mis

dk.castleandersen.dreamteam.grid.plist

Saya berharap hal yang sama berlaku untuk perangkat yang sebenarnya.

Kastil Niels
sumber
Saya suka tanggapan ini. Mudah-mudahan stabil dan akan selalu berhasil!
lucianoenrico
7

Mudah, karena nama file plist adalah <app-bundle-identifier>.plist, Anda dapat menggunakan findperintah untuk menemukan jalurnya. Tetapi akan sangat lama jika Anda mencari seluruh komputer Anda, jadi Anda harus memilih ruang lingkup yang baik, seperti~/Library/Developer/CoreSimulator untuk Xcode 6.

contoh:

find ~/Library/Developer/CoreSimulator -type f -name com.awesome.app.plist

output akan menjadi seperti ini ...

/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

Dan dari sana Anda bisa menggunakan openperintah. Atau jika Anda menggunakan iTerm2 , cukup klik perintah pada jalur untuk membukanya.

Hung
sumber
7

Dalam Swift 4.0

//func dictionaryRepresentation() -> [String : AnyObject]

karena dictionaryRepresentation of NSUserDefaults.standardUserDefaults () mengembalikan [String: AnyObject]

Kami melemparkannya ke dalam NSDictionary. Maka dengan mengelilinginya dalam tanda kurung '()' akan memungkinkan kami untuk memanggil .allKeys atau .allValues ​​seperti yang Anda lakukan pada NSDictionary apa pun

 print((UserDefaults.standard.dictionaryRepresentation() as NSDictionary).allKeys)
RyanTCB
sumber
6

Gunakan kode di bawah ini.

NSLog(@"NSUserDefault: %@", [[NSUserDefaults standardUserDefaults] dictionaryRepresentation]);
Mr.Javed Multani
sumber
Cemerlang! Menarik bagaimana jawaban terbaik biasanya yang terpendek. Jarang menavigasi direktori dalam mode terminal yang diperlukan. Jelas, para Geeks menyukai pendekatan pintu belakang, mungkin hacker rahasia di dalamnya?
Yohanes
Terima kasih, Tapi kamu tidak bisa. Apa yang ingin kamu katakan?
Mr.Javed Multani
5

Untuk aplikasi OS X , alih-alih menemukan file plist default aplikasi, lebih mudah menggunakan defaultsutilitas baris perintah.

NAMA

 defaults -- access the Mac OS X user defaults system

RINGKASAN

 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 }

DESKRIPSI

defaultsmemungkinkan pengguna untuk membaca, menulis, dan menghapus default pengguna Mac OS X dari shell baris perintah. Aplikasi Mac OS X dan program lain menggunakan sistem default untuk merekam preferensi pengguna dan informasi lain yang harus dipertahankan ketika aplikasi tidak berjalan (seperti font default untuk dokumen baru, atau posisi panel Info). Sebagian besar informasi ini dapat diakses melalui panel Preferensi aplikasi, tetapi beberapa di antaranya tidak, seperti posisi panel Info. Anda dapat mengakses informasi ini dengandefaults

Contoh:

$ defaults read com.apple.Safari
{
    AutoplayPolicyWhitelistConfigurationUpdateDate = "2018-08-24 17:33:48 +0000";
    AutoplayQuirksWhitelistConfigurationUpdateDate = "2018-08-24 17:33:48 +0000";
    DefaultBrowserPromptingState2 = 4;
    ...
weevilgenius
sumber
4

Untuk Xcode 7

NSUserDefaults standardDefault disimpan di sini:

/Users/{USER}/Library/Developer/CoreSimulator/Devices/{UUID}/data/Containers/Data/Application/{UUID}

NSUserDefaults untuk grup suite / aplikasi disimpan di sini:

/Users/{USER}/Library/Developer/CoreSimulator/Devices/{UUID}/data/Containers/Shared/AppGroup/{UUID}/Library/Preferences/{GROUP_NAME}.plist

Saya akan merekomendasikan menggunakan https://github.com/scinfu/NCSimulatorPlugin karena hari ini semuanya berada di belakang UUID dan sulit ditemukan. Ini memungkinkan akses mudah ke direktori aplikasi simulator Anda.

pengguna1270061
sumber
2

Saya membangun metode ini berdasarkan saran Morion untuk presentasi yang lebih baik. Gunakan dengan menelepon[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]);
    }
}
Julian F. Weinert
sumber
2
Bolehkah saya menyarankan Anda memanggil fungsi itu "logAllUserDefaults" karena sebenarnya tidak "mendapatkan" default?
markrickert
Benar, @markrickert. Mungkin orang bisa membuat kamus dan mengembalikannya.
Julian F. Weinert
1
Atau sederhananya NSLog(@"%@", [[[NSUserDefaults standardUserDefaults] dictionaryRepresentation] debugDescription]);(Hampir seperti dalam jawaban pilihan terbanyak di atas.)
Matr
2

Cari aplikasi Mac yang disebut SimPholder2 . Itu tinggal di bilah menu, dan mencantumkan semua simulator yang Anda gunakan, dan kemudian menunjukkan masing-masing aplikasi Anda. Pilih satu dan Anda mendapatkan jendela Finder baru, sudah terbuka ke direktori aplikasi. Ini membuatnya sangat mudah untuk menemukan aplikasi Anda dan semua direktori itu. Ini adalah penghemat waktu yang sangat besar (dan saya siap menyumbang ke penulis).

Jeff
sumber
2

Aplikasi Simulator

Script shell ini mencari nama aplikasi, mendapatkan bundel id , dan membuka folder yang berisi file 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

Versi skrip diperpanjang

Pemakaian: 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

Menemukan aplikasi Aplikasi Saya (com.organisation.MyApp) / Pengguna / organisasi / Perpustakaan / Pengembang / CoreSimulator / Perangkat / 3E4C8DC3-6FF4-428F-A624-B78DBE0B8C83 / data / Wadah / Bundel / Aplikasi / 960A5232-219D-4C46-8CA3- 01E259D8DDAD / My App.app

UserDefaults ditemukan untuk Aplikasi Saya

Aplikasi Mac

defaults read com.bundleid.app
Atika
sumber
1

Dalam Swift 2.2

let path = NSSearchPathForDirectoriesInDomains(.LibraryDirectory, .UserDomainMask, true)
let folder = path[0]
NSLog("Your NSUserDefaults are stored in this folder: \(folder)/Preferences")

akan mencetak lokasi folder file plist NSUserDefaults di konsol debug Xcode. Salin string path. Buka Finder Anda, pilih Go to Folder in Go menu item, Tempelkan string path. Klik dua kali file plist. Anda akan melihat konten di editor Xcode Anda.

Hanya bekerja di Simulator

Terima kasih @Niels Castle

charles.cc.hsu
sumber
Ini adalah satu-satunya solusi yang bekerja untuk menemukan pelat userdefaults pada simulator untuk xcode 9.4
anoo_radha
1

Saya menyimpan pintasan di desktop saya ke folder simulator tempat ia menyimpan aplikasi, yaitu:

/Users/gary/Library/Application Support/iPhone Simulator/User/Applications

Diurutkan berdasarkan tanggal terkini, lalu masuk ke folder aplikasi Perpustakaan / Preferensi dan lihat file di editor plist.

program
sumber
1

Cepat 3

print(UserDefaults.standard.dictionaryRepresentation())
Ego Slayer
sumber
1

Untuk aplikasi MacOS
Buka: / Pengguna /{User}/Library/Containers/com.{perusahaan Anda}. {Aplikasi Anda} / Data / Perpustakaan / Preferensi dan buka daftar aplikasi Anda dengan Xcode.

Uwe
sumber
1

Swift 5 Xcode 11.2 Solusi

Ini adalah keseluruhan path tempat nilai kunci UserDefaults Anda akan berada dalam file plist. Ikuti dan temukan file .plist pengidentifikasi bundel aplikasi Anda.

/ Pengguna / 'Nama Pengguna Anda' / Perpustakaan / Pengembang / CoreSimulator / Perangkat / 4176EED3-B9FC-4C77-A25E-ASD201B9FDFG2 / data / Wadah / Data / Aplikasi / 56D7CE31-9A8B-4371-9B0F-9604E239423B0 / Perpustakaan / Preferensi

Di sini "4176EED3-B9FC-4C77-A25E-ASD201B9FDFG2" adalah Device ID Anda

dan "56D7CE31-9A8B-4371-9B0F-9604E239423B0" adalah ID Aplikasi Anda

Saya biasanya mendapatkannya dengan menyortir folder berdasarkan Tanggal terakhir Dimodifikasi dalam Finder. Dan folder yang diedit terbaru adalah ID perangkat dan ID Aplikasi saya.

Nikmati!

Sajid Zeb
sumber
0

Anda dapat NSLog setiap nilai yang Anda tetapkan, seperti:

NSLog(@"%@",[[NSUserDefaults standardDefaults] stringForKey:@"WhateverTheKeyYouSet"]);
Tom Irving
sumber
0

Setelah membaca jawaban yang diterima pertanyaan ini, saya mengumpulkan skrip sederhana ini yang membuka file plist yang digunakan oleh simulator iOS untuk menyimpan NSUserDefaultspreferensi, dan sementara mengasumsikan pengaturan tertentu (sangat cocok dengan saya), ini mungkin berfungsi sebagai titik awal untuk orang lain .

$ 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

Contoh penempatan:

$ ls -1
MyProject
MyProject Tests
MyProject.xcodeproj
MyProject.xcworkspace
Podfile
open-prefs-plist.sh
Ernesto MB
sumber
Bagaimana saya makan skrip ini, dengan garpu atau dengan tangan? di mana saya meletakkannya, maksud saya?
Josh
1
@Josh Anda harus meletakkannya di samping file proyek Anda (dalam contoh saya skrip ini bernama open-prefs-plist.sh). Saya belum menguji ini dengan Xcode terbaru. Saya sarankan Anda Flex untuk memeriksa info ini sekarang. github.com/Flipboard/FLEX
Ernesto MB
0

Anda dapat menggunakan ini untuk mendapatkan path lengkap tentang preferensi pengguna, cache dan banyak data lainnya

print(NSSearchPathForDirectoriesInDomains(.documentDirectory, .userDomainMask, true))

Ahmed M. Hassan
sumber
0

Anda dapat mencetak jalur untuk direktori preferensi dari application:didFinishLaunchingWithOptions:callback di AppDelegate Anda:

func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
    print(FileManager.default.urls(for: .preferencePanesDirectory, in: .userDomainMask).first!)
    return true
}

Kemudian Anda dapat melihat file plist secara langsung untuk melihat apa yang tersimpan di sana.

Myxtic
sumber