Có cách nào để xem những gì đã được lưu NSUserDefaults
trực tiếp không? Tôi muốn xem liệu dữ liệu của tôi được lưu chính xác.
Có cách nào để xem những gì đã được lưu NSUserDefaults
trực tiếp không? Tôi muốn xem liệu dữ liệu của tôi được lưu chính xác.
Câu trả lời:
Bạn có thể tìm thấy tệp pList cho ứng dụng của mình trong trình giả lập nếu bạn truy cập:
/ người dùng / tên người dùng của bạn / Thư viện / Hỗ trợ ứng dụng / Trình mô phỏng iPhone / <Phiên bản Sim> / Ứng dụng
Thư mục này có một loạt các thư mục có tên GUID. Nếu bạn đang làm việc trên một vài ứng dụng, sẽ có một vài trong số đó. Vì vậy, bạn cần tìm ứng dụng nhị phân của mình:
find . -name foo.app
./1BAB4C83-8E7E-4671-AC36-6043F8A9BFA7/foo.app
Sau đó vào thư mục Thư viện / Tùy chọn trong thư mục GUID. Vì thế:
cd 1BAB4C83-8E7E-4671-AC35-6043F8A9BFA7/Library/Preferences
Bạn sẽ tìm thấy một tập tin trông giống như:
<Bundle Identifier>.foo.pList
Mở cái này trong trình soạn thảo pList và duyệt các giá trị bền vững cho nội dung trái tim của bạn.
NSUserDefaults
, thì NSUserDefaults
không tồn vào một tập tin plist nhưng thay vì được quản lý trong bộ nhớ: stackoverflow.com/questions/6193597/...
Bạn có thể in tất cả NSUserDefaults hiện tại vào nhật ký:
Chỉ cần chìa khóa:
NSLog(@"%@", [[[NSUserDefaults standardUserDefaults] dictionaryRepresentation] allKeys]);
Khóa và giá trị:
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))
Chúng ta cũng có thể sử dụng kết xuất ở đây, nhưng điều đó sẽ trả về hệ thống phân cấp thừa kế hoàn chỉnh của từng thành phần trong mảng giá trị. Nếu cần thêm thông tin về các đối tượng, sau đó sử dụng kết xuất, khác đi trước với câu lệnh in bình thường.
// 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)
Bạn có thể kiểm tra các giá trị cho từng khóa trong mảng, được trả về bởi
[[[NSUserDefaults standardUserDefaults] dictionaryRepresentation] allKeys]
Thỉnh thoảng tôi sử dụng đoạn mã sau để in vị trí tệp NSUserDefaults của mình khi chạy trong trình giả lập
NSArray * path = NSSearchPathForDirectoriesInDomains ( NSL LibraryDirectory, NSUserDomainMask, CÓ); NSString * thư mục = [đường dẫn objectAt Index: 0]; NSLog (@ "NSUserDefaults của bạn được lưu trong thư mục này:% @ / Preferences", thư mục);
Nó mang lại đường dẫn đến thư mục Preferences
NSUserDefaults của bạn được lưu trong thư mục này: / Users / Castle / Library / Application Support / iPhone Simulator / User / Application / BC5056A0-F46B-4AF1-A6DC-3A7DAB984960 / Library / Preferences
Tệp NSUserDefaults của bạn được đặt trong thư mục tùy chọn và được đặt tên theo tên tiền tố và tên vỗ tay của bạn, vd
dk.castleandersen.dreamteam.grid.plist
Tôi hy vọng điều tương tự cũng đúng với thiết bị thực tế.
Thật dễ dàng, vì tên tệp plist là <app-bundle-identifier>.plist
, bạn có thể sử dụng find
lệnh để tìm đường dẫn của nó. Nhưng sẽ mất rất nhiều thời gian nếu bạn tìm kiếm toàn bộ máy tính của mình, vì vậy bạn phải chọn một phạm vi tốt, như~/Library/Developer/CoreSimulator
cho Xcode 6.
thí dụ:
find ~/Library/Developer/CoreSimulator -type f -name com.awesome.app.plist
đầu ra sẽ giống như thế này ...
/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
Và từ đó bạn có thể sử dụng open
lệnh. Hoặc nếu bạn sử dụng iTerm2 , chỉ cần nhấp chuột vào đường dẫn để mở nó.
Trong Swift 4.0
//func dictionaryRepresentation() -> [String : AnyObject]
bởi vì từ điển Xuất hiện của NSUserDefaults.st ChuẩnUserDefaults () trả về [Chuỗi: AnyObject]
Chúng tôi đúc nó thành một NSDictionary
. Sau đó, bằng cách bao quanh nó trong ngoặc đơn '()' sẽ cho phép chúng ta gọi .allKeys hoặc .allValues giống như bạn làm trên bất kỳ NSDipedia nào
print((UserDefaults.standard.dictionaryRepresentation() as NSDictionary).allKeys)
Sử dụng mã dưới đây.
NSLog(@"NSUserDefault: %@", [[NSUserDefaults standardUserDefaults] dictionaryRepresentation]);
Đối với các ứng dụng OS X , thay vì tìm tệp mặc định của ứng dụng, việc sử dụng defaults
tiện ích dòng lệnh sẽ đơn giản hơn .
TÊN
defaults -- access the Mac OS X user defaults system
TÓM TẮC
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 }
SỰ MIÊU TẢ
defaults
cho phép người dùng đọc, viết và xóa mặc định của người dùng Mac OS X khỏi trình vỏ dòng lệnh. Các ứng dụng Mac OS X và các chương trình khác sử dụng hệ thống mặc định để ghi lại các tùy chọn của người dùng và các thông tin khác phải được duy trì khi các ứng dụng không chạy (như phông chữ mặc định cho các tài liệu mới hoặc vị trí của bảng Thông tin). Phần lớn thông tin này có thể truy cập được thông qua bảng Tùy chọn của ứng dụng, nhưng một số thông tin thì không, chẳng hạn như vị trí của bảng Thông tin. Bạn có thể truy cập thông tin này vớidefaults
Thí dụ:
$ defaults read com.apple.Safari
{
AutoplayPolicyWhitelistConfigurationUpdateDate = "2018-08-24 17:33:48 +0000";
AutoplayQuirksWhitelistConfigurationUpdateDate = "2018-08-24 17:33:48 +0000";
DefaultBrowserPromptingState2 = 4;
...
Đối với Xcode 7
NSUserDefaults standardDefaults được lưu trữ tại đây:
/Users/{USER}/Library/Developer/CoreSimulator/Devices/{UUID}/data/Containers/Data/Application/{UUID}
NSUserDefaults cho một bộ ứng dụng / nhóm ứng dụng được lưu trữ tại đây:
/Users/{USER}/Library/Developer/CoreSimulator/Devices/{UUID}/data/Containers/Shared/AppGroup/{UUID}/Library/Preferences/{GROUP_NAME}.plist
Tôi khuyên bạn nên sử dụng https://github.com/scinfu/NCSimulatorPlugin vì những ngày này mọi thứ đều đứng sau UUID và là một nỗi đau để tìm. Nó cho phép dễ dàng truy cập vào các thư mục ứng dụng giả lập của bạn.
Tôi đã xây dựng phương pháp này dựa trên đề xuất của Morion để trình bày tốt hơn. Sử dụng nó bằng cách gọi[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]);
(Gần như trong câu trả lời được bình chọn hàng đầu ở trên.)
Hãy tìm ứng dụng Mac có tên SimPholder2 . Nó nằm trong thanh menu và liệt kê tất cả các trình giả lập bạn đã sử dụng và sau đó hiển thị từng ứng dụng của bạn. Chọn một và bạn nhận được một cửa sổ Finder mới, đã mở vào thư mục của ứng dụng. Điều này giúp dễ dàng tìm thấy ứng dụng của bạn và tất cả các thư mục của nó. Đó là một trình tiết kiệm thời gian khổng lồ (và tôi sẵn sàng tặng cho tác giả).
Tập lệnh shell này tìm kiếm tên của ứng dụng, lấy id gói và mở các thư mục chứa tệp 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
Sử dụng: 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
Ứng dụng đã tìm thấy Ứng dụng của tôi (com. Tổ chức 01E259D8DDAD / Ứng dụng của tôi.app
UserDefaults được tìm thấy cho Ứng dụng của tôi
defaults read com.bundleid.app
Trong Swift 2.2
let path = NSSearchPathForDirectoriesInDomains(.LibraryDirectory, .UserDomainMask, true)
let folder = path[0]
NSLog("Your NSUserDefaults are stored in this folder: \(folder)/Preferences")
sẽ in ra vị trí thư mục tệp plist của NSUserDefaults trong bảng điều khiển gỡ lỗi Xcode. Sao chép chuỗi đường dẫn. Mở Finder của bạn, chọn Chuyển đến Thư mục trong mục menu Go, Dán chuỗi đường dẫn. Nhấp đúp chuột vào tập tin plist. Bạn sẽ thấy nội dung trong trình soạn thảo Xcode của bạn.
Chỉ hoạt động trong Trình mô phỏng
Cảm ơn lâu đài @Niels
Tôi giữ một lối tắt trên màn hình của mình đến thư mục của trình giả lập, nơi nó giữ các ứng dụng, tức là:
/Users/gary/Library/Application Support/iPhone Simulator/User/Applications
Sắp xếp theo ngày gần đây nhất, sau đó chỉ cần vào thư mục ứng dụng gần đây nhất Thư viện / Tùy chọn và xem tệp trong trình chỉnh sửa plist.
Swift 3
print(UserDefaults.standard.dictionaryRepresentation())
Giải pháp Swift 5 Xcode 11.2
Đây là toàn bộ đường dẫn mà các giá trị khóa UserDefaults của bạn sẽ nằm trong một tệp plist. Theo dõi và tìm tập tin .plist gói ứng dụng của bạn.
/ Người dùng / 'Tên người dùng của bạn' / Thư viện / Nhà phát triển / CoreSimulator / Thiết bị / 4176EED3-B9FC-4C77-A25E-ASD201B9FDFG2 / data / Container / Dữ liệu / Ứng dụng / 56D7CE31-9A8B-4371-9B0F
Ở đây "4176EED3-B9FC-4C77-A25E-ASD201B9FDFG2" là ID thiết bị của bạn
và "56D7CE31-9A8B-4371-9B0F-9604E239423B0" là ID ứng dụng của bạn
Tôi thường lấy chúng bằng cách sắp xếp các thư mục theo Ngày cuối cùng được Sửa đổi trong Finder. Và thư mục được chỉnh sửa gần đây nhất là ID thiết bị và ID ứng dụng của tôi.
Thưởng thức!
Bạn có thể NSLog từng giá trị bạn đặt, như:
NSLog(@"%@",[[NSUserDefaults standardDefaults] stringForKey:@"WhateverTheKeyYouSet"]);
Sau khi đọc câu trả lời được chấp nhận của câu hỏi này, tôi kết hợp tập lệnh đơn giản này để mở các tệp plist được sử dụng bởi trình giả lập iOS để lưu trữ các NSUserDefaults
tùy chọn và trong khi nó giả định một thiết lập nhất định (hoàn toàn phù hợp với tôi), nó có thể hoạt động như một điểm khởi đầu cho những người khác .
$ 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
Vị trí ví dụ:
$ ls -1
MyProject
MyProject Tests
MyProject.xcodeproj
MyProject.xcworkspace
Podfile
open-prefs-plist.sh
Bạn có thể sử dụng điều này để có được đường dẫn đầy đủ về tùy chọn người dùng, bộ đệm và nhiều dữ liệu khác
print(NSSearchPathForDirectoriesInDomains(.documentDirectory, .userDomainMask, true))
Bạn có thể in đường dẫn cho thư mục tùy chọn từ application:didFinishLaunchingWithOptions:
cuộc gọi lại trong AppDelegate của bạn:
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
print(FileManager.default.urls(for: .preferencePanesDirectory, in: .userDomainMask).first!)
return true
}
Sau đó, bạn có thể nhìn vào tệp plist trực tiếp để xem những gì được lưu trong đó.