วิธีง่ายๆในการดู NSUserDefaults ที่บันทึกไว้?


225

มีวิธีดูสิ่งที่ถูกบันทึกไว้NSUserDefaultsโดยตรงหรือไม่ ฉันต้องการดูว่าข้อมูลของฉันถูกบันทึกอย่างถูกต้องหรือไม่


3
ใช้สิ่งนี้เพื่อรับตำแหน่งของไดเรกทอรีแอพของคุณ: print (NSHomeDirectory ()) จากตำแหน่งนั้นไปที่ Library> Preferences> <yourAppsBundleName.plist> นี่จะเป็นที่ที่ NSUserDefaults บันทึกข้อมูลของคุณ
Bobby

คำตอบ:


162

คุณสามารถค้นหาไฟล์ pList สำหรับแอปของคุณได้ในโปรแกรมจำลองหากคุณไปที่:

/ users / ชื่อผู้ใช้ของคุณ / Library / Application Application / 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 และเรียกดูค่าที่คงอยู่กับเนื้อหาในใจของคุณ


12
ฉันพบสิ่งนี้มีการเปลี่ยนแปลงในรุ่น XCode ในภายหลัง ตอนนี้คุณจะพบมันในไดเรกทอรีภายใต้หมายเลขรุ่น iOS ปัจจุบันแทนผู้ใช้ - เช่น / ผู้ใช้ / ชื่อผู้ใช้ของคุณ / ห้องสมุด / การสนับสนุนแอปพลิเคชัน / iPhone Simulator / 4.3 / แอปพลิเคชัน
nevster

น่าสนใจ ... ดูเหมือนว่าหากคุณทำการทดสอบหน่วย OCMock / SenTestingKit ด้วยNSUserDefaultsไฟล์NSUserDefaultsที่ไม่ถูกยืนยันไปยังไฟล์. plist แต่จัดการในหน่วยความจำค่อนข้าง: stackoverflow.com/questions/6193597/ …
ma11hew28

ฉันจะดูแอพพลิเคชั่นที่ติดตั้งไว้แล้วได้อย่างไร? ลูกค้าของฉันดาวน์โหลดแอปพลิเคชันจาก appstore และมีบางอย่างผิดปกติ ฉันต้องตรวจสอบไฟล์ NSUserDefaults
Dejell

ลูกค้าของคุณ - หากคุณสามารถพูดคุยกับเขาและเขาค่อนข้างเข้าใจ - สามารถใช้เครื่องมือเช่น PhoneView เพื่อเข้าถึงระบบไฟล์โทรศัพท์ของเขาและคัดลอกไฟล์จากโทรศัพท์เพื่อส่งให้คุณ
Daniel Schneller

13
เส้นทางได้เปลี่ยนเป็น: ~ / Library / Developer / CoreSimulator / Devices
Brainware

355

คุณสามารถพิมพ์ NSUserDefaults ปัจจุบันทั้งหมดลงในบันทึก:

ปุ่มเพียง:

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

กุญแจและค่านิยม:

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

1
ขอบคุณ, อันนี้มีประสิทธิภาพมากขึ้น ~
อะคูสติก

3
Apple สามารถสร้างโปรแกรมดูอย่างง่ายใน XCode สำหรับเรื่องนี้ เช่นเดียวกับโปรแกรมดู Plist แต่ไม่พวกเขาไม่ต้องการทำให้ง่าย
GeneCode

78

ใน 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(Array(UserDefaults.standard.dictionaryRepresentation().values))
print(Array(UserDefaults.standard.dictionaryRepresentation().values))

สวิฟท์ 2.x

สำหรับการดึงข้อมูลการแทนค่าพจนานุกรมทั้งหมดของค่าเริ่มต้นของผู้ใช้:

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

สำหรับการรับกุญแจ:

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

สำหรับดึงค่า:

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

40

คุณสามารถตรวจสอบค่าสำหรับแต่ละคีย์ในอาร์เรย์ที่ส่งคืนโดย

[[[NSUserDefaults standardUserDefaults] dictionaryRepresentation] allKeys]

3
สิ่งนี้ทำงานในดีบักเกอร์ด้วยโดยใช้คำสั่งนี้: (lldb) "po [[[NSUserDefaults มาตรฐานUserDefaults] dictionaryRepresentation] allKeys]"
Ethan Parker

21

บางครั้งฉันใช้ตัวอย่างต่อไปนี้เพื่อพิมพ์ตำแหน่งของไฟล์ NSUserDefaults ของฉันเมื่อทำงานในโปรแกรมจำลอง

NSArray * path = NSSearchPathForDirectoriesInDomains (
   NSLibraryDirectory, NSUserDomainMask, YES);
NSString * folder = [path objectAtIndex: 0];
NSLog (@ "NSUserDefaults ของคุณถูกเก็บไว้ในโฟลเดอร์นี้:% @ / Preferences", โฟลเดอร์);

มันทำให้เส้นทางไปยังโฟลเดอร์การตั้งค่า

NSUserDefaults ของคุณจะถูกเก็บไว้ในโฟลเดอร์นี้: / Users / castle / Library / Application Support / iPhone Simulator / ผู้ใช้ / Applications / BC5056A0-F46B-4AF1-A6DC-3A7DAB984960 / Library / Preferences

ไฟล์ NSUserDefaults ของคุณตั้งอยู่ในโฟลเดอร์ preferences และตั้งชื่อตามคำนำหน้าและชื่อแอปพลิเคชันของคุณเช่น

dk.castleandersen.dreamteam.grid.plist

ฉันคาดหวังเหมือนกันว่าจะเป็นจริงสำหรับอุปกรณ์จริง


ฉันชอบคำตอบนี้ มันมีเสถียรภาพและจะทำงานเสมอหวังว่า!
lucianoenrico

7

ง่ายเนื่องจากชื่อไฟล์ 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เพียงแค่คลิกคำสั่งบนพา ธ เพื่อเปิด


7

ใน Swift 4.0

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

เนื่องจาก dictionaryRepresentation ของ NSUserDefaults.standardUserDefaults () ส่งคืน[String: AnyObject]

NSDictionaryเราโยนมันลงไป จากนั้นโดยรอบในวงเล็บ '()' จะช่วยให้เราสามารถเรียก. allKeys หรือ. allValues ​​เช่นเดียวกับที่คุณทำกับ NSDictionary ใด ๆ

 print((UserDefaults.standard.dictionaryRepresentation() as NSDictionary).allKeys)

6

ใช้รหัสด้านล่าง

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

ยอดเยี่ยม! น่าสนใจว่าคำตอบที่ดีที่สุดมักสั้นที่สุด ไม่ค่อยมีการนำทางไดเรกทอรีในโหมดเทอร์มินัลที่จำเป็น เห็นได้ชัดว่าพวก geeks เหมือนกับประตูหลังอาจเป็นแฮ็คเกอร์ลับในพวกเขา
John

ขอบคุณ แต่ไม่สามารถรับคุณได้ คุณต้องการจะพูดอะไร?
Mr.Javed Multani

5

สำหรับแอปพลิเคชัน 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;
    ...

4

สำหรับ 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 และมีอาการปวดเมื่อย ช่วยให้เข้าถึงไดเรกทอรีแอพจำลองของคุณได้ง่าย


2

ฉันสร้างวิธีนี้ตามคำแนะนำของ 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]);
    }
}

2
ฉันขอแนะนำให้คุณเรียกใช้ฟังก์ชัน "logAllUserDefaults" ได้หรือไม่เพราะ "ไม่ได้" เป็นค่าเริ่มต้น
markrickert

ถูกต้อง @markrickert อาจมีใครสามารถสร้างพจนานุกรมจากมันและกลับมาแล้ว
Julian F. Weinert

1
หรือเพียงแค่ .. NSLog(@"%@", [[[NSUserDefaults standardUserDefaults] dictionaryRepresentation] debugDescription]);(เกือบเป็นเหมือนคำตอบที่ได้รับคะแนนสูงสุดข้างต้น)
matsr

2

มองหาแอป Mac เรียกSimPholders2 มันอยู่ในแถบเมนูและแสดงรายการตัวจำลองทั้งหมดที่คุณใช้แล้วแสดงแอพของคุณแต่ละรายการ เลือกหนึ่งหน้าต่างแล้วคุณจะได้หน้าต่าง Finder ใหม่เปิดไดเรกทอรีของแอปแล้ว สิ่งนี้ทำให้ง่ายต่อการค้นหาแอปของคุณและไดเรกทอรีทั้งหมด มันเป็นเวลาที่ประหยัดมาก (และฉันก็บริจาคให้ผู้เขียนอย่างง่ายดาย)


2

แอพ Simulator

ค้นหาสคริปต์นี้เปลือกสำหรับชื่อของ app ขอรับรหัสชุดและเปิดโฟลเดอร์ที่มีไฟล์ 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

พบแอพของฉันแอพ (com.organisation.MyApp) / ผู้ใช้ / องค์กร / ห้องสมุด / นักพัฒนา / CoreSimulator / อุปกรณ์ / 3E4C8DC3-6FF4-428F-A624-B78DBE0B8C83 / ข้อมูล / บรรจุภัณฑ์ / แอปพลิเคชัน / 960A5232-219D-4C46-8CA3- 01E259D8DDAD / My App.app

พบ UserDefaults สำหรับแอพของฉัน

แอพ Mac

defaults read com.bundleid.app

1

ใน 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


นี่เป็นทางออกเดียวที่ทำงานสำหรับการค้นหาผู้ใช้เริ่มต้น plist บนตัวจำลองสำหรับ xcode 9.4
anoo_radha

1

ฉันเก็บทางลัดบนเดสก์ท็อปของฉันไปยังโฟลเดอร์ของเครื่องมือจำลองที่ใช้เก็บแอพเช่น:

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

จัดเรียงตามวันที่ล่าสุดจากนั้นไปที่ไลบรารี่แอพโฟลเดอร์ล่าสุด / การตั้งค่าและดูไฟล์ในเครื่องมือแก้ไข plist



1

สำหรับแอป MacOS
ไปที่: /Users/{User}/Library/Containers/com.{your company} {แอปของคุณ} / ข้อมูล / ไลบรารี / การตั้งค่าและเปิด pList ของแอปด้วย Xcode


1

โซลูชัน Swift 5 Xcode 11.2

นี่คือเส้นทางทั้งหมดที่ค่าคีย์ UserDefaults ของคุณจะอยู่ในไฟล์ plist ติดตามและค้นหาไฟล์. plist identifier ของแอปของคุณ

/ ผู้ใช้ / 'ชื่อผู้ใช้ของคุณ' / ห้องสมุด / ผู้พัฒนา / CoreSimulator / อุปกรณ์ / 4176EED3-B9FC-4C77-A25E-ASD201B9FDFG2 / ข้อมูล / คอนเทนเนอร์ / ข้อมูล / แอปพลิเคชัน / 56D7CE31-9A8B-4371-9B0F-9604E239423B0

ที่นี่ "4176EED3-B9FC-4C77-A25E-ASD201B9FDFG2" คือ ID อุปกรณ์ของคุณ

และ "56D7CE31-9A8B-4371-9B0F-9604E239423B0" เป็นรหัสแอปพลิเคชันของคุณ

ปกติแล้วฉันจะได้รับมันโดยเรียงลำดับโฟลเดอร์ตามวันที่แก้ไขล่าสุดใน Finder และโฟลเดอร์ที่แก้ไขล่าสุดคือ ID อุปกรณ์และรหัสแอพของฉัน

สนุก!



0

หลังจากอ่านคำตอบที่ได้รับการยอมรับของคำถามนี้ฉันได้รวบรวมสคริปต์ง่าย ๆ ที่เปิดไฟล์ 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

ฉันจะกินสคริปต์นี้ด้วยส้อมหรือมือได้อย่างไร ฉันจะใส่ที่ไหนฉันหมายถึงอะไร
Josh

1
@ Josh คุณต้องวางมันไว้ข้างๆไฟล์โปรเจคของคุณ (ในตัวอย่างของฉันสคริปต์มีชื่อว่า open-prefs-plist.sh) ฉันยังไม่ได้ทดสอบสิ่งนี้ด้วย Xcode ล่าสุด ฉันขอแนะนำให้คุณ Flex ตรวจสอบข้อมูลนี้ทันที github.com/Flipboard/FLEX
Ernesto MB

0

คุณสามารถใช้สิ่งนี้เพื่อรับเส้นทางแบบเต็มตามความต้องการของผู้ใช้แคชและข้อมูลอื่น ๆ อีกมากมาย

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


0

คุณสามารถพิมพ์พา ธ สำหรับไดเร็กทอรีการกำหนดค่าตามความชอบจากการ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 โดยตรงเพื่อดูสิ่งที่บันทึกไว้ในนั้น

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.