क्या यह देखने का कोई तरीका है कि NSUserDefaults
सीधे क्या सहेजा गया है? मैं यह देखना चाहूंगा कि क्या मेरा डेटा सही तरीके से सहेजा गया है।
क्या यह देखने का कोई तरीका है कि NSUserDefaults
सीधे क्या सहेजा गया है? मैं यह देखना चाहूंगा कि क्या मेरा डेटा सही तरीके से सहेजा गया है।
जवाबों:
यदि आप जाते हैं, तो आप सिम्युलेटर में अपने ऐप के लिए 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 एडिटर में खोलें और अपने दिल की सामग्री के लिए लगातार मूल्यों को ब्राउज़ करें।
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 * पाथ = NSSearchPathForDirectoriesInDomains ( NSLibraryDirectory, NSUserDomainMask, YES); NSString * फ़ोल्डर = [पथ objectAtIndex: 0]; NSLog (@ "आपके NSUserDefaults इस फ़ोल्डर में संग्रहीत हैं:% @ / प्राथमिकताएँ", फ़ोल्डर);
यह वरीयताएँ फ़ोल्डर में पथ देता है
आपके NSUserDefaults इस फ़ोल्डर में संग्रहीत हैं: / उपयोगकर्ता / महल / पुस्तकालय / अनुप्रयोग समर्थन / iPhone सिम्युलेटर / उपयोगकर्ता / अनुप्रयोग / BC5056A0-F46B-4AF1-A6DC-3A7DAB9849560 / पुस्तकालय / प्राथमिकताएँ
आपकी NSUserDefaults फ़ाइल वरीयताओं के फ़ोल्डर में स्थित है और आपके उपसर्ग और विनियोग नाम के अनुसार नामित है
dk.castleandersen.dreamteam.grid.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 का उपयोग करते हैं , तो इसे खोलने के लिए पथ पर केवल कमांड करें।
स्विफ्ट 4.0 में
//func dictionaryRepresentation() -> [String : AnyObject]
क्योंकि NSUserDefaults.standardUserDefaults () रिटर्न [स्ट्रिंग: AnyObject] का शब्दकोश
हमने इसे एक में डाल दिया NSDictionary
। फिर इसे कोष्ठक में रखकर '' (') हमें किसी भी एनएसडीआर पर जैसे ही .allKeys या .allValues को कॉल करने की अनुमति देगा।
print((UserDefaults.standard.dictionaryRepresentation() as NSDictionary).allKeys)
नीचे दिए गए कोड का उपयोग करें।
NSLog(@"NSUserDefault: %@", [[NSUserDefaults standardUserDefaults] dictionaryRepresentation]);
के लिए ओएस एक्स अनुप्रयोगों , बजाय आवेदन के चूक 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;
...
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 के पीछे है और इसे खोजने के लिए एक दर्द है। यह आपके सिम्युलेटर ऐप निर्देशिकाओं के लिए आसान पहुँच की अनुमति देता है।
मैंने बेहतर प्रस्तुति के लिए मोरियन के सुझाव के आधार पर इस पद्धति का निर्माण किया। इसे कॉल करके उपयोग करें[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]);
(लगभग जैसा कि ऊपर-ऊपर जवाब दिया गया है।)
मैक ऐप देखें जिसका नाम SimPenders2 है । यह मेनू बार में रहता है, और आपके द्वारा उपयोग किए गए सभी सिमुलेटरों को सूचीबद्ध करता है, और फिर आपके प्रत्येक एप्लिकेशन को दिखाता है। एक का चयन करें और आपको एक नई खोजक विंडो मिलती है, जो पहले से ही ऐप की निर्देशिका में खुलती है। यह आपके ऐप और इसके सभी निर्देशिकाओं को खोजना आसान बनाता है। यह एक बड़ा समय बचाने वाला है (और मैंने आसानी से लेखक को दान कर दिया है)।
यह शेल स्क्रिप्ट ऐप के नाम के लिए खोज करता है , बंडल आईडी प्राप्त करता है , और प्लिस्ट फ़ाइलों वाले फ़ोल्डर खोलें ।
#!/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
स्विफ्ट में 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 संपादक में देखेंगे।
केवल सिम्युलेटर में काम करते हैं
धन्यवाद @ नील्स कैसल
मैं अपने डेस्कटॉप पर एक सिम्युलेटर सिम्युलेटर के फ़ोल्डर में रखता हूं जहां यह एप्लिकेशन रखता है, अर्थात:
/Users/gary/Library/Application Support/iPhone Simulator/User/Applications
सबसे हाल की तारीख से क्रमबद्ध, तो बस सबसे हाल ही में एप्लिकेशन फ़ोल्डर लाइब्रेरी / प्राथमिकताएं में जाएं और फ़ाइल को संपादक में देखें।
स्विफ्ट 3
print(UserDefaults.standard.dictionaryRepresentation())
स्विफ्ट 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" आपकी एप्लिकेशन आईडी है
मैं सामान्य रूप से उन्हें खोजक में अंतिम तिथि संशोधित करके फ़ोल्डर्स सॉर्ट करता हूं। और सबसे हाल ही में संपादित फ़ोल्डर मेरी डिवाइस आईडी और ऐप आईडी है।
का आनंद लें!
आप अपने द्वारा निर्धारित प्रत्येक मान को NSLog कर सकते हैं, जैसे:
NSLog(@"%@",[[NSUserDefaults standardDefaults] stringForKey:@"WhateverTheKeyYouSet"]);
इस प्रश्न के स्वीकृत उत्तर को पढ़ने के बाद, मैंने इस सरल स्क्रिप्ट को एक साथ रखा, जो 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
उपयोगकर्ता प्राथमिकताएं, कैश और कई अन्य डेटा पर पूर्ण पथ प्राप्त करने के लिए आप इसे उपयोगकर्ता कर सकते हैं
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
}
फिर आप सीधे प्लिस्ट फाइल को देख सकते हैं कि वहां क्या बचा है।