มีวิธีดูสิ่งที่ถูกบันทึกไว้NSUserDefaults
โดยตรงหรือไม่ ฉันต้องการดูว่าข้อมูลของฉันถูกบันทึกอย่างถูกต้องหรือไม่
มีวิธีดูสิ่งที่ถูกบันทึกไว้NSUserDefaults
โดยตรงหรือไม่ ฉันต้องการดูว่าข้อมูลของฉันถูกบันทึกอย่างถูกต้องหรือไม่
คำตอบ:
คุณสามารถค้นหาไฟล์ 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 และเรียกดูค่าที่คงอยู่กับเนื้อหาในใจของคุณ
NSUserDefaults
ไฟล์NSUserDefaults
ที่ไม่ถูกยืนยันไปยังไฟล์. plist แต่จัดการในหน่วยความจำค่อนข้าง: stackoverflow.com/questions/6193597/ …
คุณสามารถพิมพ์ NSUserDefaults ปัจจุบันทั้งหมดลงในบันทึก:
ปุ่มเพียง:
NSLog(@"%@", [[[NSUserDefaults standardUserDefaults] dictionaryRepresentation] allKeys]);
กุญแจและค่านิยม:
NSLog(@"%@", [[NSUserDefaults standardUserDefaults] dictionaryRepresentation]);
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))
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 ของคุณจะถูกเก็บไว้ในโฟลเดอร์นี้: / Users / castle / Library / Application Support / iPhone Simulator / ผู้ใช้ / Applications / BC5056A0-F46B-4AF1-A6DC-3A7DAB984960 / Library / Preferences
ไฟล์ NSUserDefaults ของคุณตั้งอยู่ในโฟลเดอร์ preferences และตั้งชื่อตามคำนำหน้าและชื่อแอปพลิเคชันของคุณเช่น
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 สำหรับกลุ่มชุด / แอพจะถูกเก็บไว้ที่นี่:
/Users/{USER}/Library/Developer/CoreSimulator/Devices/{UUID}/data/Containers/Shared/AppGroup/{UUID}/Library/Preferences/{GROUP_NAME}.plist
ฉันอยากจะแนะนำให้ใช้https://github.com/scinfu/NCSimulatorPluginเพราะทุกวันนี้ทุกอย่างอยู่เบื้องหลัง UUID และมีอาการปวดเมื่อย ช่วยให้เข้าถึงไดเรกทอรีแอพจำลองของคุณได้ง่าย
ฉันสร้างวิธีนี้ตามคำแนะนำของ 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]);
}
}
NSLog(@"%@", [[[NSUserDefaults standardUserDefaults] dictionaryRepresentation] debugDescription]);
(เกือบเป็นเหมือนคำตอบที่ได้รับคะแนนสูงสุดข้างต้น)
มองหาแอป Mac เรียกSimPholders2 มันอยู่ในแถบเมนูและแสดงรายการตัวจำลองทั้งหมดที่คุณใช้แล้วแสดงแอพของคุณแต่ละรายการ เลือกหนึ่งหน้าต่างแล้วคุณจะได้หน้าต่าง Finder ใหม่เปิดไดเรกทอรีของแอปแล้ว สิ่งนี้ทำให้ง่ายต่อการค้นหาแอปของคุณและไดเรกทอรีทั้งหมด มันเป็นเวลาที่ประหยัดมาก (และฉันก็บริจาคให้ผู้เขียนอย่างง่ายดาย)
ค้นหาสคริปต์นี้เปลือกสำหรับชื่อของ 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 สำหรับแอพของฉัน
defaults read com.bundleid.app
ใน 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
ฉันเก็บทางลัดบนเดสก์ท็อปของฉันไปยังโฟลเดอร์ของเครื่องมือจำลองที่ใช้เก็บแอพเช่น:
/Users/gary/Library/Application Support/iPhone Simulator/User/Applications
จัดเรียงตามวันที่ล่าสุดจากนั้นไปที่ไลบรารี่แอพโฟลเดอร์ล่าสุด / การตั้งค่าและดูไฟล์ในเครื่องมือแก้ไข plist
สวิฟท์ 3
print(UserDefaults.standard.dictionaryRepresentation())
สำหรับแอป MacOS
ไปที่: /Users/{User}/Library/Containers/com.{your company} {แอปของคุณ} / ข้อมูล / ไลบรารี / การตั้งค่าและเปิด pList ของแอปด้วย Xcode
โซลูชัน 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 อุปกรณ์และรหัสแอพของฉัน
สนุก!
คุณสามารถ NSLog แต่ละค่าที่คุณตั้งค่าเช่น:
NSLog(@"%@",[[NSUserDefaults standardDefaults] stringForKey:@"WhateverTheKeyYouSet"]);
หลังจากอ่านคำตอบที่ได้รับการยอมรับของคำถามนี้ฉันได้รวบรวมสคริปต์ง่าย ๆ ที่เปิดไฟล์ 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
คุณสามารถใช้สิ่งนี้เพื่อรับเส้นทางแบบเต็มตามความต้องการของผู้ใช้แคชและข้อมูลอื่น ๆ อีกมากมาย
print(NSSearchPathForDirectoriesInDomains(.documentDirectory, .userDomainMask, true))
คุณสามารถพิมพ์พา ธ สำหรับไดเร็กทอรีการกำหนดค่าตามความชอบจากการ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 โดยตรงเพื่อดูสิ่งที่บันทึกไว้ในนั้น