सहेजे गए NSUserDefaults को देखने का आसान तरीका?


225

क्या यह देखने का कोई तरीका है कि NSUserDefaultsसीधे क्या सहेजा गया है? मैं यह देखना चाहूंगा कि क्या मेरा डेटा सही तरीके से सहेजा गया है।


3
अपनी एप्लिकेशन निर्देशिका का स्थान प्राप्त करने के लिए इसका उपयोग करें: उस स्थान से प्रिंट (NSHomeDirectory ()), लाइब्रेरी> वरीयताएँ> <yourAppsBundleName.plist> पर जाएं यह वह जगह होगी जहां NSUserDefaults आपका डेटा सहेज रहा है।
बॉबी

जवाबों:


162

यदि आप जाते हैं, तो आप सिम्युलेटर में अपने ऐप के लिए pList फ़ाइल पा सकते हैं:

/ उपयोगकर्ता / आपके उपयोगकर्ता नाम / लाइब्रेरी / अनुप्रयोग समर्थन / iPhone सिम्युलेटर / <सिम संस्करण> / अनुप्रयोग

इस निर्देशिका में GUID नाम निर्देशिकाओं का एक समूह है। यदि आप कुछ ऐप्स पर काम कर रहे हैं तो उनमें से कुछ ही होंगे। तो आपको अपना ऐप बाइनरी खोजने की आवश्यकता है:

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

फिर GUID निर्देशिका में लाइब्रेरी / वरीयता निर्देशिका पर जाएं। इसलिए:

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

आपको एक फ़ाइल ढूंढनी चाहिए जो कि इस प्रकार है:

<Bundle Identifier>.foo.pList

इसे pList एडिटर में खोलें और अपने दिल की सामग्री के लिए लगातार मूल्यों को ब्राउज़ करें।


12
मैंने पाया है कि यह XCode के बाद के संस्करणों में बदल गया है। अब आप इसे उपयोगकर्ता के बजाय वर्तमान ios संस्करण संख्या के अंतर्गत एक निर्देशिका में पाएंगे - जैसे / उपयोगकर्ता / आपके उपयोगकर्ता नाम / लाइब्रेरी / अनुप्रयोग समर्थन / iPhone सिम्युलेटर / 4.3 / अनुप्रयोग
nevster

दिलचस्प ... ऐसा लगता है कि यदि आप OCMock / SenTestingKit यूनिट का परीक्षण कर रहे हैं NSUserDefaults, तो NSUserDefaultsएक .plist फ़ाइल के लिए बने नहीं हैं, बल्कि मेमोरी में प्रबंधित हैं: stackoverflow.com/questions/6193597/…
ma111128

मैं पहले से इंस्टॉल किए गए एप्लिकेशन के लिए इसे कैसे देख सकता हूं? मेरे ग्राहक ने ऐपस्टोर से एप्लिकेशन डाउनलोड किया, और कुछ गलत है। मुझे NSUserDefaults फ़ाइल
Dejell

आपका क्लाइंट - यदि आप उससे बात कर सकते हैं और वह कुछ समझदार है - तो वह फोनव्यू जैसे टूल का इस्तेमाल करके अपने फोन फाइल सिस्टम तक पहुंच बना सकता है और आपको इसे भेजने के लिए फाइल को फोन से कॉपी कर सकता है।
डैनियल श्नाइलर

13
रास्ता बदल गया है: ~ / लाइब्रेरी / डेवलपर / कोरसिमुलेटर / डिवाइसेस
ब्रेनवेयर

355

आप सभी वर्तमान NSUserDefaults को लॉग में प्रिंट कर सकते हैं:

बस चाबियाँ:

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

कुंजी और मूल्य:

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

1
THX, यह एक और अधिक कुशल है ~
ध्वनिक

3
Apple इसके लिए XCode में एक साधारण दर्शक बना सकता है। प्लिस्ट दर्शक की तरह। लेकिन नहीं, वे इसे आसान नहीं बनाना चाहते।
जिनेकोड

78

स्विफ्ट में हम निम्नलिखित का उपयोग कर सकते हैं: -

स्विफ्ट 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 standardUserDefaults] DictionaryRepresentation] allKeys]"
एथन

21

मैं कभी-कभी सिम्युलेटर में चलने के दौरान मेरी NSUserDefaults फ़ाइल का स्थान प्रिंट करने के लिए निम्नलिखित स्निपेट का उपयोग करता हूं

NSArray * पाथ = NSSearchPathForDirectoriesInDomains (
   NSLibraryDirectory, NSUserDomainMask, YES);
NSString * फ़ोल्डर = [पथ objectAtIndex: 0];
NSLog (@ "आपके NSUserDefaults इस फ़ोल्डर में संग्रहीत हैं:% @ / प्राथमिकताएँ", फ़ोल्डर);

यह वरीयताएँ फ़ोल्डर में पथ देता है

आपके NSUserDefaults इस फ़ोल्डर में संग्रहीत हैं: / उपयोगकर्ता / महल / पुस्तकालय / अनुप्रयोग समर्थन / iPhone सिम्युलेटर / उपयोगकर्ता / अनुप्रयोग / BC5056A0-F46B-4AF1-A6DC-3A7DAB9849560 / पुस्तकालय / प्राथमिकताएँ

आपकी NSUserDefaults फ़ाइल वरीयताओं के फ़ोल्डर में स्थित है और आपके उपसर्ग और विनियोग नाम के अनुसार नामित है

dk.castleandersen.dreamteam.grid.plist

मैं वास्तविक डिवाइस के लिए सच होने की उम्मीद करता हूं।


मुझे यह प्रतिक्रिया पसंद है। यह स्थिर है और हमेशा काम करेगा, उम्मीद है!
लूसियानोनेरिको

7

आसान है, क्योंकि प्लिस्ट फ़ाइल का नाम है <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

स्विफ्ट 4.0 में

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

क्योंकि NSUserDefaults.standardUserDefaults () रिटर्न [स्ट्रिंग: AnyObject] का शब्दकोश

हमने इसे एक में डाल दिया NSDictionary। फिर इसे कोष्ठक में रखकर '' (') हमें किसी भी एनएसडीआर पर जैसे ही .allKeys या .allValues ​​को कॉल करने की अनुमति देगा।

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

6

नीचे दिए गए कोड का उपयोग करें।

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

प्रतिभाशाली! दिलचस्प है कि कैसे सबसे अच्छे उत्तर आमतौर पर सबसे छोटे होते हैं। शायद ही कभी टर्मिनल मोड में निर्देशिका नेविगेट करना आवश्यक है। जाहिर है, पिछले दरवाजे दृष्टिकोण की तरह geeks, शायद उनमें गुप्त हैकर?
जॉन

धन्यवाद, लेकिन खिचड़ी भाषा आपको मिल रही है। तुम क्या कहना चाहते हो?
श्री जावेद मुल्तानी

5

के लिए ओएस एक्स अनुप्रयोगों , बजाय आवेदन के चूक plist फ़ाइल ढूँढने के लिए, यह आसान उपयोग करने के लिए है defaultsकमांड लाइन उपयोगिता।

नाम

 defaults -- access the Mac OS X user defaults system

SYNOPSIS

 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 उपयोगकर्ता डिफॉल्ट्स को पढ़ने, लिखने और हटाने की अनुमति देता है। मैक ओएस एक्स एप्लिकेशन और अन्य प्रोग्राम उपयोगकर्ता की वरीयताओं और अन्य जानकारी को रिकॉर्ड करने के लिए डिफॉल्ट सिस्टम का उपयोग करते हैं जो तब बनाए रखना चाहिए जब एप्लिकेशन चल नहीं रहे हों (जैसे कि नए दस्तावेज़ों के लिए डिफ़ॉल्ट फ़ॉन्ट, या जानकारी पैनल की स्थिति)। इस जानकारी के अधिकांश एक appli- उद्धरण वरीयता पैनल के माध्यम से पहुँचा जा सकता है, लेकिन यह जानकारी पैनल की स्थिति जैसे कुछ नहीं है। आप इस जानकारी तक पहुँच सकते हैं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 का उपयोग करने की सलाह दूंगा क्योंकि इन दिनों सब कुछ UUIDs के पीछे है और इसे खोजने के लिए एक दर्द है। यह आपके सिम्युलेटर ऐप निर्देशिकाओं के लिए आसान पहुँच की अनुमति देता है।


2

मैंने बेहतर प्रस्तुति के लिए मोरियन के सुझाव के आधार पर इस पद्धति का निर्माण किया। इसे कॉल करके उपयोग करें[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" कहेंगे क्योंकि यह वास्तव में "डिफ़ॉल्ट" नहीं है?
12

राइट, @markrickert। हो सकता है कि कोई इसमें से एक शब्दकोश बना सके और उसे वापस कर सके।
जूलियन एफ वेइनर्ट

1
या बस .. NSLog(@"%@", [[[NSUserDefaults standardUserDefaults] dictionaryRepresentation] debugDescription]);(लगभग जैसा कि ऊपर-ऊपर जवाब दिया गया है।)
matsr

2

मैक ऐप देखें जिसका नाम SimPenders2 है । यह मेनू बार में रहता है, और आपके द्वारा उपयोग किए गए सभी सिमुलेटरों को सूचीबद्ध करता है, और फिर आपके प्रत्येक एप्लिकेशन को दिखाता है। एक का चयन करें और आपको एक नई खोजक विंडो मिलती है, जो पहले से ही ऐप की निर्देशिका में खुलती है। यह आपके ऐप और इसके सभी निर्देशिकाओं को खोजना आसान बनाता है। यह एक बड़ा समय बचाने वाला है (और मैंने आसानी से लेखक को दान कर दिया है)।


2

सिम्युलेटर ऐप

यह शेल स्क्रिप्ट ऐप के नाम के लिए खोज करता है , बंडल आईडी प्राप्त करता है , और प्लिस्ट फ़ाइलों वाले फ़ोल्डर खोलें

#!/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

मिला ऐप My App (com.organisation.MyApp) / उपयोगकर्ता / संगठन / पुस्तकालय / डेवलपर / CoreSimulator / डिवाइस / 3E4C8DC3-6FF4-428F-A624-B78DBE0B88083 / डेटा / कंटेनर / बंडल / अनुप्रयोग / 960A5232-219D-4C46-8CA3 01E259D8DDAD / मेरा App.app

UserDefaults मेरा ऐप के लिए मिला

मैक ऐप

defaults read com.bundleid.app

1

स्विफ्ट में 2.2

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

Xcode डिबग कंसोल में NSUserDefaults की प्लिस्ट फ़ाइल फ़ोल्डर स्थान का प्रिंट आउट लेगा। पथ स्ट्रिंग की प्रतिलिपि बनाएँ। अपना खोजक खोलें, गो मेनू आइटम में फ़ोल्डर पर जाएं, पथ स्ट्रिंग पेस्ट करें। प्लिस्ट फाइल पर डबल क्लिक करें। आप सामग्री को अपने Xcode संपादक में देखेंगे।

केवल सिम्युलेटर में काम करते हैं

धन्यवाद @ नील्स कैसल


यह एकमात्र समाधान है, जिसने xcode 9.4 के लिए सिम्युलेटर पर userdefaults प्लिस्ट खोजने के लिए काम किया है
aoo_radha

1

मैं अपने डेस्कटॉप पर एक सिम्युलेटर सिम्युलेटर के फ़ोल्डर में रखता हूं जहां यह एप्लिकेशन रखता है, अर्थात:

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

सबसे हाल की तारीख से क्रमबद्ध, तो बस सबसे हाल ही में एप्लिकेशन फ़ोल्डर लाइब्रेरी / प्राथमिकताएं में जाएं और फ़ाइल को संपादक में देखें।



1

MacOS एप्स के लिए यहां
जाएं: /Users//hi/Unarios/Library/Containers/com.ministrour कंपनी}


1

स्विफ्ट 5 एक्सकोड 11.2 समाधान

यह वह संपूर्ण पथ है जहाँ आपके UserDefaults कुंजी मान एक फ़ाइल में होंगे। अपना एप्लिकेशन बंडल पहचानकर्ता .plist फ़ाइल का अनुसरण करें और ढूंढें।

/ उपयोगकर्ता / 'आपका उपयोगकर्ता नाम' / पुस्तकालय / डेवलपर / कोरसिमुलेटर / उपकरण / 4176EED3-B9FC-4C77-A25E-ASD201B9FDFG2 / डेटा / कंटेनर / डेटा / आवेदन / 56D7CE31-9A8B-4371-9B0F-9604E2394B094B

यहाँ "4176EED3-B9FC-4C77-A25E-ASD201B9FDFG2" आपकी डिवाइस आईडी है

और "56D7CE31-9A8B-4371-9B0F-9604E239423B0" आपकी एप्लिकेशन आईडी है

मैं सामान्य रूप से उन्हें खोजक में अंतिम तिथि संशोधित करके फ़ोल्डर्स सॉर्ट करता हूं। और सबसे हाल ही में संपादित फ़ोल्डर मेरी डिवाइस आईडी और ऐप आईडी है।

का आनंद लें!


0

आप अपने द्वारा निर्धारित प्रत्येक मान को NSLog कर सकते हैं, जैसे:

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

0

इस प्रश्न के स्वीकृत उत्तर को पढ़ने के बाद, मैंने इस सरल स्क्रिप्ट को एक साथ रखा, जो NSUserDefaultsवरीयताओं को संग्रहीत करने के लिए iOS सिम्युलेटर द्वारा उपयोग की जाने वाली plist फाइलें खोलती है , और जबकि यह एक निश्चित सेटअप मानती है (मेरा बिल्कुल फिट बैठता है), यह दूसरों के लिए एक शुरुआती बिंदु के रूप में काम कर सकता है ।

$ 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

कांटे या हाथों से, मैं इस स्क्रिप्ट को कैसे खाऊंगा? मैं इसे कहां रखूं, मेरा मतलब है?
जोश

1
@ जोश आपको इसे अपनी प्रोजेक्ट फाइल्स के साथ रखना होगा (मेरे उदाहरण में स्क्रिप्ट का नाम open-prefs-plist.sh है)। मैंने हालांकि नवीनतम Xcode के साथ इसका परीक्षण नहीं किया है। मैं आपको इस जानकारी का निरीक्षण करने के लिए फ्लेक्स की सलाह देता हूं। github.com/Flipboard/FLEX
अर्नेस्टो एमबी

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
}

फिर आप सीधे प्लिस्ट फाइल को देख सकते हैं कि वहां क्या बचा है।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.