macos मुख्य डेटा, साझा प्राथमिकताओं और अधिसूचनाओं के संबंध में मैक ओएस एक्स हेल्पर/मुख्य ऐप आर्किटेक्चर से कैसे निपटें?



core-data notifications (1)

मुझे एक प्रोजेक्ट (मैक ओएस एक्स ऐप) के बारे में कुछ वास्तुशिल्प संदेह हैं जिन पर मैं काम कर रहा हूं। इसमें मूल रूप से दो तत्व होते हैं: पृष्ठभूमि में चलने वाला एक डिमन कुछ डेटा एकत्र करता है और एक दर्शक जो एकत्रित डेटा का प्रतिनिधित्व करने के लिए उपयोग किया जाता है।

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

कुछ प्रयोग करने के बाद, मुझे पता चला कि इस कार्यक्षमता को प्राप्त करने का सबसे अच्छा तरीका दो अनुप्रयोगों को बनाकर, दर्शक का प्रतिनिधित्व करने वाला मुख्य अनुप्रयोग और डेल्मन का प्रतिनिधित्व करने वाला एक सहायक उपयोगिता है। मैंने इस तरह से किए गए कारणों में से एक यह है कि LSUIElement मानों के बीच स्विच करना संभव नहीं है ताकि डेमॉन / दर्शक राज्य को मजबूर किया जा सके।

अब मेरे पास इस वास्तुकला के बारे में कुछ प्रश्न हैं:

  • डेटा को सहेजने और पुनर्प्राप्त करने के लिए दोनों डिमन और दर्शक एप्लिकेशन समान कोर डेटा स्टोर का उपयोग करते हैं। बहु-थ्रेडेड एप्लिकेशन होने पर मुझे पता है कि डेटा को सही तरीके से सिंक्रनाइज़ करने के लिए एकाधिक NSManagedObjectContext ऑब्जेक्ट्स की आवश्यकता है। एक साथ कोर कोर स्टोर का उपयोग कर कई अनुप्रयोगों के बारे में क्या? क्या यह संघर्ष, ताले आदि के जोखिम के बिना भी संभव है? मैं स्थिरता की गारंटी कैसे दूं?

  • जब दर्शक शुरू होता है तो डिमन हमेशा शुरू होना चाहिए। मैंने इसे सभी खुली प्रक्रियाओं के माध्यम से बस लूप करके हासिल किया और जांच की कि क्या डिमन का बंडल पहचानकर्ता सूचीबद्ध है। यदि नहीं, तो NSWorkspace का उपयोग करके NSWorkspace शुरू किया गया है। यह ठीक काम करता है। अब जब उपयोगकर्ता डिमन छोड़ देता है, तो दर्शक को भी रोकना चाहिए। दर्शकों को डिमन रोकने की अधिसूचना के लिए सबसे अच्छा तरीका क्या है? मैं समय-समय पर सक्रिय प्रक्रियाओं की जांच कर सकता हूं और दर्शक को छोड़ सकता हूं यदि डिमन खत्म हो गया है लेकिन यह थोड़ा अजीब लगता है। मैं बदले में कुछ प्रकार की अधिसूचना चुनूंगा जो दर्शकों को बंद होने पर भेज देगा। लेकिन चूंकि इस अधिसूचना को ऐप्स के बीच भेजा और पकड़ा जाना चाहिए, मुझे नहीं पता कि कौन सी सरल अधिसूचना सेवा उपलब्ध है। कोई विचार?

  • एप्लिकेशन सैंडबॉक्स किया गया है क्योंकि इसे मैक ऐप स्टोर पर वितरित किया जाएगा। NSWorkspace साथ ऐप्स प्रारंभ करना एप्लिकेशन को उसी सैंडबॉक्स वाले वातावरण में चलाने के लिए लक्षित ऐप का कारण बनता है, जो मुझे लगता है कि एक समस्या नहीं है क्योंकि एक ही सैंडबॉक्स में दोनों अनुप्रयोगों को चलाने से बेहतर लगता है और शायद यह है। लेकिन इस परिदृश्य की कल्पना करें: लॉगिन पर स्वचालित रूप से SMLoginItemSetEnabled शुरू हो गया है ( SMLoginItemSetEnabled का उपयोग SMLoginItemSetEnabled ) और उपयोगकर्ता Viewer.app को डबल-क्लिक करता है। चूंकि डिमन पहले से चल रहा है (फिर से, यह सक्रिय प्रक्रियाओं के माध्यम से लूपिंग द्वारा चेक किया गया है) यह शुरू नहीं होगा। अब हमारे पास डिमन और दर्शक विभिन्न सैंडबॉक्स में चल रहे हैं? क्या इससे वरीयताओं, कोर डेटा स्टोर इत्यादि से संबंधित कोई समस्या होगी?

  • मैं बुनियादी विन्यास के लिए NSUserDefaults का उपयोग करना चाहता हूं, क्या मैं किसी भी तरह से इस डेटा को डेमन और दर्शक के बीच बदल सकता हूं? दोबारा, दोनों अनुप्रयोगों में अलग-अलग बंडल पहचानकर्ता होंगे।

आपकी मदद के लिए अग्रिम धन्यवाद, सराहना की!


इस समस्या का कोई सही जवाब नहीं है, लेकिन यहां मैं इस तरह से संपर्क करूंगा:

डेटा को सहेजने और पुनर्प्राप्त करने के लिए दोनों डिमन और दर्शक एप्लिकेशन समान कोर डेटा स्टोर का उपयोग करते हैं।

क्योंकि प्रक्रियाओं के बीच कोर डेटा स्टोर साझा करना समर्थित नहीं है (जहां तक ​​मुझे पता है), मैं डिमन को XPC सेवा का पर्दाफाश कर दूंगा । कोर डेटा स्टोर को खोलने के बजाय, दर्शक डेमॉन के माध्यम से डेटा तक पहुंचने के लिए NSXPCConnection का उपयोग करेगा।

मान लें कि दर्शक कभी SMLoginItemSetEnabled बिना नहीं चलता है, यह SMLoginItemSetEnabled , जैसा कि आपने प्रश्न में उल्लेख किया है, SMLoginItemSetEnabled लिए एक मशीन सेवा पंजीकृत करने के लिए, और फिर उस सेवा से कनेक्ट करें।

नमूना कोड है जो ऐप्पल की वेबसाइट पर स्थापित करने के विवरण पर जाता है (सारांश: App.app/Contents/Library/LoginItems/daemon.bundle.id.app को App.app/Contents/Library/LoginItems/daemon.bundle.id.app पर होना App.app/Contents/Library/LoginItems/daemon.bundle.id.app ), और आप भी चाह सकते हैं इस ब्लॉग पोस्ट को पढ़ें जो सैंडबॉक्सिंग द्वारा लगाए गए कुछ अतिरिक्त आवश्यकताओं पर चर्चा करता है (सारांश: अतिरिक्त सुनिश्चित करें कि आपकी टीम आईडी डिमन के बंडल पहचानकर्ता में है)।

जब दर्शक शुरू होता है तो डिमन हमेशा शुरू होना चाहिए।

सभी सेट: एक बार जब आप SMLoginItemSetEnabled साथ SMLoginItemSetEnabled पंजीकृत करते हैं, तो लॉन्च डी (यदि आवश्यक हो) शुरू करेगा जब दर्शक अपनी XPC सेवा से कनेक्ट होता है।

अब जब उपयोगकर्ता डिमन छोड़ देता है, तो दर्शक को भी रोकना चाहिए।

जब NSXPCConnection दर्शक यह पता लगाने के लिए NSXPCConnection का उपयोग कर सकता है। डेमॉन SMLoginItemSetEnabled का उपयोग करने से पहले स्वयं को पंजीकृत करने के लिए भी उपयोग कर सकता है, ताकि इसे फिर से लॉन्च न किया जा सके।

मैं बुनियादी विन्यास के लिए NSUserDefaults का उपयोग करना चाहता हूं, क्या मैं किसी भी तरह से इस डेटा को डेमन और दर्शक के बीच बदल सकता हूं? दोबारा, दोनों अनुप्रयोगों में अलग-अलग बंडल पहचानकर्ता होंगे।

इसके लिए एक सूट का प्रयोग करें:

// To read or write:
NSUserDefaults* suiteDefaults = [[NSUserDefaults alloc] initWithSuiteName:@"com.example.app.shared"];
[suiteDefaults setObject:[NSDate date] forKey:@"launchTime"];

// Add the suite to -standardUserDefaults to make reading easier:
NSUserDefaults* defaults = [NSUserDefaults standardUserDefaults];
[defaults addSuiteNamed:@"com.example.app.shared"];

सैंडबॉक्सिंग के साथ काम करने के लिए, दर्शक और डिमन को एक ऐप समूह साझा करना होगा। आप साझा कुंजी में परिवर्तनों का निरीक्षण करने के लिए केवीओ का भी उपयोग कर सकते हैं।





helpers