Cách dễ dàng để xem NSUserDefaults đã lưu?


225

Có cách nào để xem những gì đã được lưu NSUserDefaultstrự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.


3
Sử dụng mục này để lấy vị trí thư mục ứng dụng của bạn: print (NSHomeDirectory ()) từ vị trí đó, đi tới Thư viện> Tùy chọn> <yourAppsBundleName.plist> đây sẽ là nơi NSUserDefaults đang lưu dữ liệu của bạn.
Bobby

Câu trả lời:


162

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.


12
Tôi đã tìm thấy điều này đã thay đổi trong các phiên bản XCode sau này. Bây giờ bạn sẽ tìm thấy nó trong một thư mục dưới số phiên bản ios hiện tại thay vì Người dùng - ví dụ: 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 / 4.3 / Ứng dụng
nevster

Thú vị ... Dường như nếu bạn đang làm kiểm tra đơn vị OCMock / SenTestingKit với NSUserDefaults, thì NSUserDefaultskhô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/...
ma11hew28

Làm thế nào tôi có thể xem nó cho một ứng dụng đã được cài đặt? Khách hàng của tôi đã tải xuống ứng dụng từ cửa hàng ứng dụng và có gì đó không đúng. Tôi cần kiểm tra tệp NSUserDefaults
Dejell

Khách hàng của bạn - nếu bạn có thể nói chuyện với anh ta và anh ta có chút hiểu biết - có thể sử dụng một công cụ như PhoneView để truy cập vào hệ thống tệp điện thoại của anh ta và sao chép tệp khỏi điện thoại để gửi cho bạn.
Daniel Schneller

13
Đường dẫn đã thay đổi thành: ~ / Library / Developer / CoreSimulator / Devices
Brainware

355

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]);

1
THX, cái này hiệu quả hơn ~
acoustic

3
Apple có thể tạo một trình xem đơn giản trong XCode cho việc này. Giống như người xem plist. Nhưng không, họ không muốn làm cho nó dễ dàng.
GeneCode

78

Trong Swift chúng ta có thể sử dụng như sau: -

Swift 3.x & 4.x

Để nhận tất cả các khóa & giá trị:

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

Để truy xuất đại diện từ điển đầy đủ của mặc định của người dùng:

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

Để lấy các khóa:

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

Để lấy các giá trị:

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))

Swift 2.x

Để truy xuất đại diện từ điển đầy đủ của mặc định của người dùng:

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

Để lấy các khóa:

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

Để lấy các giá trị:

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

40

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]

3
Điều này cũng hoạt động trong trình gỡ lỗi bằng cách sử dụng lệnh này: (lldb) "po [[[NSUserDefaults standardUserDefaults] dictionaryRepftimeation] allKeys]"
Ethan Parker

21

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ế.


tôi thích phản ứng này Nó ổn định và sẽ luôn hoạt động, hy vọng!
lucianoenrico 14/03/2016

7

Thật dễ dàng, vì tên tệp plist là <app-bundle-identifier>.plist, bạn có thể sử dụng findlệ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 openlệ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ó.


7

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)

6

Sử dụng mã dưới đây.

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

Xuất sắc! Thú vị như thế nào các câu trả lời tốt nhất thường là ngắn nhất. Hiếm khi điều hướng các thư mục trong chế độ thiết bị đầu cuối cần thiết. Rõ ràng, các chuyên viên máy tính thích cách tiếp cận cửa sau, có thể là tin tặc bí mật trong đó?
Giăng

Cảm ơn, nhưng không thể có được bạn. Bạn muốn nói gì?
Mr.Javing Multani

5

Đố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 defaultstiệ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Ả

defaultscho 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;
    ...

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.


2

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]);
    }
}

2
Tôi có thể đề nghị bạn gọi chức năng đó là "logAllUserDefaults" vì nó không thực sự "lấy" mặc định?
markrickert

Phải, @markrickert. Có lẽ người ta có thể tạo một từ điển từ nó và trả lại nó.
Julian F. Weinert

1
Hoặc đơn giản là .. NSLog(@"%@", [[[NSUserDefaults standardUserDefaults] dictionaryRepresentation] debugDescription]);(Gần như trong câu trả lời được bình chọn hàng đầu ở trên.)
chiếu

2

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ả).


2

Ứng dụng giả lập

Tập lệnh shell này tìm kiếm tên của ứng dụng, lấy id góimở 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

Phiên bản mở rộng

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

Ứng dụng Mac

defaults read com.bundleid.app

1

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


Đây là giải pháp duy nhất hoạt động để tìm kiếm các kết quả của người dùng trên trình giả lập cho xcode 9.4
anoo_radha

1

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.



1

Đối với các ứng dụng MacOS, hãy truy
cập: /Users/ đũaUser Bolog / L Library / Content / com. Đũayour company}. {Ứng dụng của bạn} / Dữ liệu / Thư viện / Tùy chọn và mở pList của ứng dụng của bạn bằng Xcode.


1

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!


0

Bạn có thể NSLog từng giá trị bạn đặt, như:

NSLog(@"%@",[[NSUserDefaults standardDefaults] stringForKey:@"WhateverTheKeyYouSet"]);

0

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 NSUserDefaultstù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

Làm thế nào để tôi ăn kịch bản này, bằng dĩa hoặc bằng tay? Tôi đặt nó ở đâu, ý tôi là?
Josh

1
@Josh Bạn phải đặt nó cùng với các tệp dự án của bạn (trong ví dụ của tôi, tập lệnh được đặt tên là open-prefs-plist.sh). Tôi chưa thử nghiệm điều này với Xcode mới nhất. Tôi khuyên bạn nên Flex kiểm tra thông tin này ngay bây giờ. github.com/Flipboard/FLEX
Ernesto MB

0

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))


0

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 đó.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.