2016-12-28 15 views
16

खोलने के बिना आज एक्सटेंशन (विजेट) से होस्ट ऐप में कार्रवाई करें, मैं आज एक्सटेंशन (विजेट) से ऐप रखने में कुछ क्रियाएं प्रबंधित करना चाहता हूं।ऐप आईओएस

पूर्ण विवरण: मेरे युक्त ऐप में, कुछ क्रिया (जैसे प्ले/पॉज़ ऑडियो) प्रदर्शन करते हैं। और आज भी विस्तार (विजेट) से उस क्रिया को प्रबंधित करना चाहते हैं। पृष्ठभूमि स्थिति में भी एक कार्रवाई जारी है।

आज के विस्तार में, वही कार्यवाही करेगा। इसलिए इसके लिए, यदि मुख्य युक्त ऐप में पहले से ही कोई कार्रवाई शुरू होती है और इसे पृष्ठभूमि स्थिति में भेजती है, तो उपयोगकर्ता किसी विजेट से कार्रवाई रोक सकता है। और उपयोगकर्ता विजेट (आज एक्सटेंशन) से किसी भी समय कार्रवाई शुरू/रोक सकता है।

इस लक्ष्य को प्राप्त करने के लिए मैंने ऐप समूह क्षमता के साथ UserDefault का उपयोग किया और एक बूलियन मान स्टोर किया। जब विजेट मौजूद होता है तो यह बूलियन मान की जांच करता है और सेट बटन स्टेट प्ले/पॉज़ सेट करता है। यह सही ढंग से सेट है लेकिन जब मैं एक्सटेंशन बटन एक्शन दबाता हूं तो होस्ट ऐप में प्रदर्शन नहीं करता है।

कोड:

मुख्य युक्त एप्लिकेशन कोड

override func viewDidLoad() { 
    super.viewDidLoad() 
    let objUserDefault = UserDefaults(suiteName:"group.test.TodayExtensionSharingDefaults") 

    let objTemp = objUserDefault?.object(forKey: "value") 

    self.btnValue.isSelected = objTemp 

    NotificationCenter.default.addObserver(self, selector: #selector(self.userDefaultsDidChange), name: UserDefaults.didChangeNotification, object: nil) 
} 




func userDefaultsDidChange(_ notification: Notification) { 

     let objUserDefault = UserDefaults(suiteName: "group.test.TodayExtensionSharingDefaults") 
     objUserDefault?.synchronize() 
     let objTemp = objUserDefault?.object(forKey: "value") 
     self.btnValue.isSelected = objTemp 
    } 

में विस्तार कक्षा में:

@IBAction func onPlayPause(_ sender: UIButton) { 
     DispatchQueue.main.async { 
     let sharedDefaults = UserDefaults(suiteName: "group.test.TodayExtensionSharingDefaults") 

     if let isPlaying = sharedDefaults?.bool(forKey: "isPlaing") { 

     sharedDefaults?.set(!isPlaying, forKey: "isPlaying") 

     }else{ 

     sharedDefaults?.set(false, forKey: "isPlaying") 
     } 

     sharedDefaults?.synchronize() 
} 

अधिसूचना निकाल दिया जब कोई उपयोगकर्ता अपडेट डिफ़ॉल्ट नहीं किया गया। जब ऐप पुनरारंभ होता है तो यह अद्यतन मूल्य है।

तो इस समस्या को हल करने के लिए कैसे?

और वही चीज एप को विजेट में रखने के विपरीत तरीकों से करना चाहती है। (उपयोगकर्ता एकल क्रिया ऑब्जेक्ट के लिए आसान है लेकिन कैसे?)

और ऐप खोलने के बिना एक्सटेंशन से ऐप रखने में त्वरित कार्रवाई करने का कोई अन्य तरीका है?

+0

आप कहाँ अपनी अधिसूचना फायरिंग कर रहे हैं? – karthikeyan

उत्तर

9

MMWormhole (या इसका नया और अनौपचारिक स्विफ्ट संस्करण, बस Wormhole) का उपयोग करें। यह बहुत सरल है।

एप्लिकेशन के दृश्य नियंत्रक में:

override func viewDidLoad() { 
    super.viewDidLoad() 
    // Do any additional setup after loading the view, typically from a nib. 
    let wormhole = MMWormhole(applicationGroupIdentifier: "group.test.TodayExtensionSharingDefaults", 
           optionalDirectory: "TodayExtensionSharingDefaults") 

    wormhole.listenForMessage(withIdentifier: "togglePlayPause") { [weak self] _ in 
     guard let controller = self else { return } 
     controller.btnValue.isSelected = controller.btnValue.isSelected 
    } 
} 

विस्तार में:

override func viewDidLoad() { 
    super.viewDidLoad() 
    // Do any additional setup after loading the view from its nib. 

    self.wormhole = MMWormhole(applicationGroupIdentifier: "group.test.TodayExtensionSharingDefaults", optionalDirectory: "TodayExtensionSharingDefaults") 
} 

@IBAction func onPlayPause(_ sender: UIButton) { 
    guard let wormhole = self.wormhole else { extensionContext?.openURL(NSURL(string: "foo://startPlaying")!, completionHandler: nil) } // Throw error here instead of return, since somehow this function was called before viewDidLoad (or something else went horribly wrong) 

    wormhole.passMessageObject(nil, identifier: "togglePlayPause") 
} 

Xcode के दस्तावेज़ प्रकार अनुभाग में घोषित foo:// (या आप का उपयोग और जो कुछ भी), यूआरएल के तहत है, तो में application(_:open:options:) लागू आपका AppDelegate ताकि यूआरएल पास होने पर ऐप संगीत बजाना शुरू कर दे, foo://startPlaying है।

how to add URL to Xcode

+0

नमस्ते, यह लाइब्रेरी काम नहीं कर रही है जब कोई ऐप निष्क्रिय स्थिति और पृष्ठभूमि –

+0

में है, ठीक है अगर ऐप नहीं चल रहा है, तो संगीत कैसे शुरू होगा? – Coder256

+0

यही मुद्दा है। PlayAndRecord –

4
  1. कस्टम यूआरएल Sceheme

  2. चेक समूहों डेटा बनाएँ।(आप सही स्थापित करने या नहीं कर रहे हैं)

  3. जब भी आप बटन पर क्लिक करें, मेजबान एप्लिकेशन AppDelegate, UIApplication प्रतिनिधि

    func application(_ application: UIApplication, open urls: URL, sourceApplication: String?, annotation: Any) -> Bool { 
    
         let obj = urls.absoluteString.components(separatedBy: "://")[1] 
         NotificationCenter.default.post(name: widgetNotificationName, object: obj) 
         print("App delegate") 
         return true 
        } 
    
  4. आग अपनी सूचना वहां से तो यह निरीक्षण से कहा जाता हो जाएगा आपके मेजबान में कहीं भी।

    विजेट बटन क्रिया कोड

    @IBAction func doActionMethod(_ sender: AnyObject) { 
    
        let button = (sender as! UIButton) 
        var dailyThanthi = "" 
        switch button.tag { 
        case 0: 
         dailyThanthi = "DailyThanthi://h" 
        case 1: 
         dailyThanthi = "DailyThanthi://c" 
        case 2: 
         dailyThanthi = "DailyThanthi://j" 
         //  case 3: 
         //   dailyThanthi = "DailyThanthi://s" 
         //  case 4: 
         //   dailyThanthi = "DailyThanthi://s" 
        default: 
         break 
        } 
    
        let pjURL = NSURL(string: dailyThanthi)! 
        self.extensionContext!.open(pjURL as URL, completionHandler: nil) 
    
    } 
    
  5. बाहर चेक कस्टम यूआरएल के प्रकार: https://developer.apple.com/library/content/documentation/iPhone/Conceptual/iPhoneOSProgrammingGuide/Inter-AppCommunication/Inter-AppCommunication.html

  6. नोट:

    वहाँ एक एप्लिकेशन एक्सटेंशन और के बीच कोई सीधा संचार होता है इसके ऐप युक्त; आम तौर पर, युक्त ऐप भी नहीं चल रहा है जबकि एक निहित एक्सटेंशन चल रहा है। ऐप एक्सटेंशन में ऐप और होस्ट ऐप बिल्कुल संवाद नहीं करता है।

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

    चित्रा 2-2 में बिंदीदार रेखा एक ऐप एक्सटेंशन और उसके युक्त ऐप के बीच उपलब्ध सीमित इंटरैक्शन का प्रतिनिधित्व करती है। आज विजेट (और कोई अन्य ऐप एक्सटेंशन प्रकार) NSExtensionContext कक्षा की विधि को कॉल करके अपने युक्त ऐप को खोलने के लिए सिस्टम से पूछ सकता है। जैसा कि चित्रा 2-3 में पढ़ें/लिखें तीरों द्वारा इंगित किया गया है, कोई ऐप एक्सटेंशन और इसके युक्त ऐप साझा किए गए डेटा को निजी रूप से परिभाषित साझा कंटेनर में एक्सेस कर सकता है। एक एक्सटेंशन के बीच संचार की पूर्ण शब्दावली, इसकी मेजबान ऐप, और इसमें ऐप चित्र 4 में सरल रूप में दिखाया गया है।

    https://developer.apple.com/library/content/documentation/General/Conceptual/ExtensibilityPG/ExtensionOverview.html

+0

बिंदु 3 और 4 नहीं प्राप्त कर रहा है। क्या आप कृपया अधिक और सही तरीके से समझा सकते हैं। –

+0

यह आपके ऐप को खोल देगा, 6 बिंदु देखें .. लेकिन आप ऐप खोलने के बिना कह रहे हैं, मुझे लगता है कि यह संभव नहीं है, दस्तावेज़ीकरण की जांच करें। – karthikeyan