मैं एक बंडल आईडी साझा करने के लिए आधा दर्जन कमांड लाइन टूल्स (परीक्षण के लिए प्रयुक्त) चाहता हूं ताकि वे एक NSUserDefaults और लाइब्रेरी/कैश सबफ़ोल्डर साझा कर सकें। मैं हार्ड-कोडेड स्ट्रिंग का उपयोग करके लाइब्रेरी/कैश सबफ़ोल्डर के आसपास पहुंच सकता हूं, लेकिन मैं उस फ़ाइल को कैसे सेट कर सकता हूं जिसे NSUserDefaults सहेजता है?

बंडल किए गए एप्लिकेशन में, यह Info.plist में बंडल आईडी द्वारा सेट किया जाता है। लेकिन मैं कमांड लाइन टूल्स के सेट के लिए बंडल आईडी कैसे सेट कर सकता हूं, जिसमें Info.plist नहीं है?

2
Steven Fisher 15 अप्रैल 2011, 22:16

1 उत्तर

सबसे बढ़िया उत्तर

+standardUserDefaults का उपयोग करने के बजाय, +alloc और -init के साथ NSUserDefaults इंस्टेंस बनाएं। इस तरह से बनाया गया उपयोगकर्ता डिफ़ॉल्ट इंस्टेंस मुख्य बंडल आईडी से संबंधित डिफ़ॉल्ट डोमेन के साथ नहीं बनाया जाएगा, इसलिए आपको -addSuiteNamed: मैन्युअल रूप से जोड़ने की विधि इसके लिए एक डिफ़ॉल्ट डोमेन।

(अपडेट करें) क्षमा करें, मेरा बुरा! सूट अस्थिर होते हैं, स्थायी नहीं - उन टूल के लिए उपयोगी होते हैं जिन्हें डिफ़ॉल्ट के साझा सेट को पढ़ने की आवश्यकता होती है, उस एप्लिकेशन के लिए इतना नहीं जो डिफ़ॉल्ट मान सेट करना चाहता है। बाद के लिए, -setPersistentDomain:forName:. डोमेन डिक्शनरी की कुंजियाँ परिभाषित करती हैं कि कौन सी कुंजियाँ नामित डिफॉल्ट डोमेन से संबंधित हैं, और मान उनके डिफ़ॉल्ट मानों की आपूर्ति करते हैं।

यहां एक छोटा सा उदाहरण दिया गया है, जिसे ~/Library/Defaults/com.shermpendley.DefaultsTest.plist बनाना चाहिए, और उसमें सूचीबद्ध कुंजी/मान युग्म को संग्रहित करना चाहिए:

#import <Foundation/Foundation.h>

int main (int argc, const char * argv[])
{

    NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];

    NSUserDefaults *defaults = [[NSUserDefaults alloc] init];
    [defaults setPersistentDomain:[NSDictionary dictionaryWithObject:@"Hello" forKey:@"World"] forName:@"com.shermpendley.DefaultsTest"];
    [defaults synchronize];
    [defaults release];

    [pool drain];
    return 0;
}
6
Stuart M 12 अगस्त 2013, 21:10
यह आशाजनक लग रहा है। फिर मैं मूल्य कैसे निर्धारित करूं? setObject:forKey:/synchronize सिस्टम पर कहीं भी मेरे मूल्य को सहेजने के लिए प्रतीत नहीं होता है।
 – 
Steven Fisher
15 अप्रैल 2011, 22:51
क्षमा करें, मेरी गलती, मैं भूल गया कि सुइट मूल रूप से केवल-पढ़ने के लिए हैं। मैंने एक अन्य विधि के लिए एक लिंक जोड़ा है जो ऐसे डोमेन बनाता है जो करते हैं सिंक करते हैं - और इसे सत्यापित करने के लिए इसका परीक्षण किया। :-)
 – 
Sherm Pendley
15 अप्रैल 2011, 23:45
कोई बात नहीं, इसका पता लगा लिया: CFPreferencesSetValue( (CFStringRef)key, (CFPropertyListRef)value, (CFStringRef)domain, kCFPreferencesCurrentUser, kCFPreferencesAnyHost);
 – 
Steven Fisher
15 अप्रैल 2011, 23:45
हा! मजेदार समय। हालांकि धन्यवाद। :)
 – 
Steven Fisher
15 अप्रैल 2011, 23:45
1
मुझे लगता है कि आप पहली बार सही थे; ऐसा लगता है कि setPersistentDomain कुंजी-मान सेट करता है, डिफ़ॉल्ट नहीं। इसलिए मुझे हर बार डोमेन पढ़ना होगा। AddSuiteNamed का संयोजन: पढ़ने के लिए और CFPreferencesSetValue लिखने के लिए मेरी आवश्यकताओं को पूरी तरह से पूरा करता है।
 – 
Steven Fisher
15 अप्रैल 2011, 23:52