ऐप समूहों के साथ ऐप्स के बीच डेटा का संचार और निरंतर बनाना


85

आईओएस 8 ने ऐप समूहों के बारे में कल एक नया एपीआई प्रकट किया। डेटा साझा करने और ऐप्स के बीच संवाद करने से पहले यह एक तरह से गड़बड़ था और मुझे विश्वास है कि ऐप समूहों को ठीक करने का इरादा है।

अपने ऐप में मैंने ऐप ग्रुप्स को इनेबल किया है और एक नया ग्रुप जोड़ा है लेकिन मैं इसका इस्तेमाल कैसे करना है, इसके बारे में कोई डॉक्यूमेंट नहीं ढूंढ सकता। प्रलेखन और एपीआई संदर्भ केवल यह बताता है कि समूह कैसे जोड़ा जाए।

तो ऐप समूह वास्तव में क्या करने का इरादा रखता है? क्या इसका उपयोग करने के बारे में कहीं कोई दस्तावेज है?

जवाबों:


81

App Group का एक अन्य लाभ एक NSUserDefaultsडेटाबेस साझा करने की क्षमता है । यह ऐप एक्सटेंशन (नोटिफिकेशन सेंटर विजेट्स, कस्टम कीबोर्ड आदि) के लिए भी काम करता है।

NSUserDefaultsएप्लिकेशन समूह में सभी एप्लिकेशन में इस तरह अपनी वस्तु को आरम्भ करें और वे डेटाबेस को साझा करेंगे:

उद्देश्य सी:

[[NSUserDefaults alloc] initWithSuiteName:@"<group identifier>"];

स्विफ्ट:

NSUserDefaults(suiteName: "<group identifier>")

ध्यान रखें कि [NSUserDefaults standardUserDefaults]प्रत्येक एप्लिकेशन के लिए डेटाबेस से सब कुछ इस डेटाबेस में नहीं जाएगा।

प्रलेखन एक सही उदाहरण के रूप में अच्छी तरह से देता है (बीटा 3 के अनुसार)।

और डेटाबेस को सिंक्रनाइज़ करने के लिए मत भूलना:

[yourDefaults synchronize];

2
केवल सिम्युलेटर (एक्सकोड 6 बीटा 5, आईओएस 8 बीटा 5) पर काम करता है
आईओएस देव

8
नोट: यदि आप इसे iOS 8 एक्सटेंशन (उदाहरण के लिए कीबोर्ड) के साथ उपयोग कर रहे हैं, तो आपको यह सुनिश्चित करने की आवश्यकता होगी कि इसकी Info.plist फ़ाइल में आपके एक्सटेंशन के पास RequestOpenAccess = YES है।
किरण पनेसर

1
मैंने RequestOpenAccess = YES किया और अनुदेश का पालन किया फिर भी यह डिवाइस पर मेरे लिए काम नहीं करता है और एमुलेटर पर ठीक काम करता है, डिवाइस के लिए कुछ भी विशिष्ट है?
MAC

मेरे साथ एक ही मुद्दा, मेरे ऐप में मेरे पास शेयर एक्सटेंशन है, यह सिम्युलेटर पर काम करता है, लेकिन वास्तविक डिवाइस पर काम नहीं कर रहा है, मैंने RequestOpenAccess = YES को जोड़ा है, लेकिन यह काम नहीं करता है, मेरा सवाल है stackoverflow.com/questions/304894/ …
रवि ओझा

3
@ माइकइचर्ड सुनिश्चित नहीं हैं, लेकिन अगर मुझे सही से याद है कि ऐप समूह एक टीम आईडी के साथ उपसर्ग कर रहे हैं
सांता क्लॉस

74

कई ऐप्स के बीच NSUserDefaults डेटा साझा करना

एप्लिकेशन और एक्सटेंशन के बीच या 2 ऐप्स के बीच साझा डिफॉल्ट को साझा करने के लिए आपको निम्नलिखित चरणों का उपयोग करके अपनी सेटिंग में एक ऐप समूह जोड़ना होगा:

  1. प्रोजेक्ट नेविगेटर में * .xcodeproj फ़ाइल (शीर्ष पर होनी चाहिए) पर क्लिक करें।
  2. प्रोजेक्ट नेविगेटर के दाईं ओर प्रोजेक्ट और लक्ष्य के लिए देखें। लक्ष्य के तहत अपने प्राथमिक लक्ष्य पर क्लिक करें (लक्ष्य के तहत पहली चीज़ होनी चाहिए)।
  3. ऊपर की ओर, क्षमता टैब पर क्लिक करें।
  4. एप्लिकेशन समूह अनुभाग में ऐप समूह चालू करने के लिए दाईं ओर स्थित स्विच पर क्लिक करें।
  5. + बटन पर क्लिक करें और group.com.company.myApp नाम का एक ऐप ग्रुप जोड़ें ।
  6. अपने अन्य एप्लिकेशन में उसी स्थान पर जाएं और यह समूह अब चयन करने के लिए उपलब्ध होना चाहिए। प्रत्येक साझा किए गए डेटा का उपयोग करने वाले प्रत्येक एप्लिकेशन के लिए इस समूह को चालू करें।

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

डेटा स्टोर करने के लिए:

var userDefaults = NSUserDefaults(suiteName: "group.com.company.myApp")!
userDefaults.setObject("user12345", forKey: "userId")
userDefaults.synchronize()

डेटा पुनर्प्राप्त करने के लिए:

var userDefaults = NSUserDefaults(suiteName: "group.com.company.myApp")
if let testUserId = userDefaults?.objectForKey("userId") as? String {
  print("User Id: \(testUserId)")
}

2
धन्यवाद! यह कैसे करना है यह जानने के लिए प्रलेखन के माध्यम से खोज करने में थोड़ा समय लगा और मुझे लगा कि अन्य लोग मेरे द्वारा उठाए गए कदमों की सराहना कर सकते हैं।
तेनुजुय

विस्तृत विवरण के लिए धन्यवाद ...! क्या हमें इस समूह को सक्षम करने के लिए Apple डेवलपर पोर्टल (Apple वेबसाइट जो आपके सभी प्रमाणपत्र, पहचानकर्ता, उपकरण और प्रावधान प्रोफ़ाइल) दिखाती है, से कोई प्रमाण पत्र बनाने की आवश्यकता है? पुश सूचना के समान।
अरबाज़ शेख

जब आप चरण 5 करते हैं तो इसे ऐप डेवलपर को ऐप्पल डेवलपर पोर्टल में जोड़ना चाहिए, इसे जोड़ने के लिए आपको सीधे डेवलपर पोर्टल पर नहीं जाना चाहिए। चरण 5 करने के बाद आप पोर्टल पर जा सकते हैं और देख सकते हैं कि इसे आपके लिए बनाया जाना चाहिए।
तेनुस्जय

@TenaciousJay शानदार जवाब। बस जोड़ना चाहते हैं यदि आप फंक एप्लिकेशन से ऐप लॉन्च करना चाहते हैं (ऐप: यूआईपैलेशन, ओपनुरल url: NSURL, विकल्प: [स्ट्रिंग: AnyObject]) -> बूल
तैमूर

बहुत बढ़िया जवाब। साभार @TenaciousJay मैं एक चर और इसके मूल्य को AppB से AppA में प्राप्त करने की कोशिश कर रहा हूं, मैं यह कैसे करूंगा? उदाहरण के लिए यदि AppB में "riderCancelledRequest = true" है, तो मैं AppA में इसे कैसे पुनः प्राप्त करूंगा?
लिजग

37

मौजूदा दस्तावेज़ों की मेरी व्याख्या के अनुसार, एप्लिकेशन समूह मुख्य रूप से एक्सटेंशन के लिए लक्षित होते हैं, विशेष रूप से विजेट्स के लिए। विजेट अपने स्वयं के एप्लिकेशन बंडल हैं जो आपके ऐप के साथ सह-अस्तित्व में हैं। चूंकि वे एक अलग अनुप्रयोग हैं और इसलिए उनका स्वयं का सैंडबॉक्स है, इसलिए आपको फ़ाइलों को साझा करने के लिए ऐप समूहों का उपयोग करना होगा।

कुछ हेडर grep'ing के बाद, मुझे लगता है कि मुझे एपीआई की आवश्यकता थी, लेकिन वास्तव में आईओएस 7 के हिस्से के रूप में रखा गया था।

NSFileManagerइस पर एक विधि है containerURLForSecurityApplicationGroupIdentifier:जहाँ आप अपने ऐप के लिए ऐप समूहों को चालू करते समय आपके द्वारा बनाए गए पहचानकर्ता में पास कर सकते हैं:

NSURL *containerURL = [[NSFileManager defaultManager] 
           containerURLForSecurityApplicationGroupIdentifier:@"group.com.company.app"];

धन्यवाद, मेरा मानना ​​है कि आप एक्स्टेंसिबिलिटी के बारे में सही हैं। मैं इस iOS 7 विधि के बारे में थोड़ा अधिक संदिग्ध हूं, यह मुझे बहुत स्थिर लगता है, iOS 8 ने ऐप्स के बीच वास्तविक इंटरैक्शन और संचार पेश किया।
स्ट्रेम

@Justafinger यह iOS 7 विधि केवल साझा किए गए अनुप्रयोगों के बीच डेटा से लिखने और पढ़ने के लिए URL बनाने के लिए है। विगेट्स के लिए यह विशेष विधि केवल वास्तव में उपयोगी है (जो मैं अभी तक देखता हूं), लेकिन अन्य एक्सटेंशन नहीं।
वेन हार्टमैन

ठीक है, मुझे विश्वास है कि Apple iOS 8 में यह आसान बनाना चाहता था बिना किसी कंटेनर को प्रोग्राम किए और कस्टम फ़ाइलों को साझा किए। दस्तावेज़ में कहा गया है कि आपको NSUserDefault का उपयोग करके डेटा साझा करने में सक्षम होना चाहिए। मुझे लगता है कि मुझे कुछ याद आ रहा है, क्योंकि यह मेरे लिए काम नहीं कर रहा है।
streem

@Justafinger मैं NSUserDefaultsकाम करने में सक्षम नहीं है , या तो। मैंने बीटा 1 बग तक चाक किया।
वेन हार्टमैन 15

@WayneHartman NSUserDefaultsडेटाबेस के लिए वर्कअराउंड है । मेरा जवाब देखिए।
सांता क्लॉस

6

एक महत्वपूर्ण जाल जिसका मैंने आज में दोहन किया वह निम्नलिखित है:

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

यदि आप ऐसा करते हैं, तो दोनों ऐप्स समान NSUserDefaults को साझा करेंगे, जब वे इस तरह सेट होते हैं

var userDefaults = NSUserDefaults(suiteName: "group.com.company.myApp")
userDefaults!.setObject("user12345", forKey: "userId")
userDefaults!.synchronize()

इसके कारण कई स्थानों पर समस्याएँ होती हैं:

  1. कल्पना करें कि जब आप उपयोगकर्ता के लिए एक विशेष ऐप-इंट्रो-स्क्रीन दिखाए गए हैं, तो आप एक कुंजी के लिए हां सेट करते हैं। अन्य ऐप अब YES भी पढ़ेंगे और परिचय नहीं दिखाएंगे।
  2. हां कुछ ऐप अपने यूजर डिफॉल्ट में भी oAuth टोकन स्टोर करते हैं। वैसे भी ... कार्यान्वयन के आधार पर, ऐप यह पहचान लेगा कि एक टोकन है और गलत टोकन का उपयोग करके डेटा पुनर्प्राप्त करना शुरू करें। मौका अधिक है कि यह अजीब त्रुटियों के साथ विफल हो जाएगा।

सामान्य रूप से इस समस्या का समाधान वर्तमान में बनाए गए कॉन्फ़िगरेशन के साथ डिफ़ॉल्ट कुंजियों को उपसर्ग करना है। आप अपने कॉन्फ़िगरेशन के लिए अलग-अलग बंडल आइडेंटिफ़ायर सेट करके रनटाइम पर कॉन्फ़िगरेशन का आसानी से पता लगा सकते हैं। तो बस बंडल पहचानकर्ता से पढ़ें NSBundle.mainBundle()। यदि आपके पास एक ही बंडल पहचानकर्ता है, तो आपको अलग-अलग प्रीप्रोसेसर मैक्रोज़ सेट करने की आवश्यकता है

#ifdef DEBUG
  NSString* configuration = @"debug";
#elif RELEASE
  NSString* configuration = @"release";
#endif

स्विफ्ट में यह लगभग समान दिखाई देगा:

#if DEBUG
  let configuration = "debug"
#elseif RELEASE
  let configuration = "release"
#endif

8
आपकी समस्याएं मौजूद हैं क्योंकि आप अपने सभी डेटा को एक साझा UserDefaults में मिलाते हैं। आपको NSUserDefaults.standardUserDefaults()उन डेटा के लिए उपयोग करना चाहिए जिन्हें साझा नहीं किया जाना चाहिए।
डैनियल

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