2017-06-08 13 views
9

स्थिति के रूप में यह

Proper situationआईओएस - आज विस्तार विजेट समय के साथ मंजूरी दे दी

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

No buttons configured

समस्या

कई घंटे (कहीं बीच 4 और 7) के एप्लिकेशन नहीं खोला है, विजेट reverts 'नहीं बटन कॉन्फ़िगर किया गया' को देखने के लिए के बाद।

विश्लेषण अब तक

जिस तरह से डेटा एप्लिकेशन-समूह से भरी हुई है जैसा कि नीचे दिखाया कोड का उपयोग किया जाता है। (gist for full code) जिस तरह से मैंने इसे लिखा था, 'नो बटन कॉन्फ़िगर' दृश्य का एकमात्र तरीका दिखाया जा सकता है कि buttons सरणी वास्तव में मौजूद है लेकिन शून्य की लंबाई है।

मैं एक कैश समाशोधन या एक पृष्ठभूमि सेवा रोक की तरह कुछ की उम्मीद है, लेकिन जहाँ तक मैं देख सकते हैं, अपवाद पहले पकड़ा जाना चाहिए: कोई संबंध एप्लिकेशन-समूह डेटा में किए जा सकने

  • हैं, userDefaults शून्य होना चाहिए, इसलिए इसे 'लॉग इन व्यू' दिखाना चाहिए।
  • मामले में बटन कभी नहीं परिभाषित किया गया, buttons नहीं के बराबर होना चाहिए और इसलिए इसे फिर से

एप्लिकेशन को ध्यान में रखते पृष्ठभूमि में कुछ नहीं करता है 'दृश्य में प्रवेश नहीं है' दिखाना चाहिए, एप्लिकेशन को स्वयं में बदलाव नहीं किया जा सकता है बटन

मैंने डीबगर कनेक्ट होने के दौरान इसे पुन: उत्पन्न करने का प्रयास किया, लेकिन समस्या पुन: उत्पन्न नहीं होगी।

क्या किसी को भी इस समस्या को ठीक करने या इसे डिबग करने के तरीके पर थोड़ा सा विचार है?

प्रासंगिक फ़ाइलें:

प्रासंगिक कोड:

private struct sharedData { 
     static var baseUrl: String? 
     static var token: String? 
     static var phoneDeviceId: String? 
     static var buttons: Array<Button>? 
    } 

func loadData() { 
     let groupIdentifier = "group." + NSBundle.mainBundle().bundleIdentifier! 
     var groupIdArray = groupIdentifier.componentsSeparatedByString(".") 
     groupIdArray.removeAtIndex(groupIdArray.count - 1) 
     let appGroupIdentifier = groupIdArray.joinWithSeparator("."); 

     let userDefaults = NSUserDefaults.init(suiteName: appGroupIdentifier) 
     if (userDefaults == nil) { 
      print("Error in user defaults") 
      setButtonTitle("Not logged in. Open Triggi to continue.") 
      return false 
     } 
     sharedData.baseUrl = userDefaults?.valueForKey("baseUrl") as? String 
     sharedData.token = userDefaults?.valueForKey("token") as? String 
     sharedData.phoneDeviceId = userDefaults?.valueForKey("phoneDeviceId") as? String 
     let buttons = userDefaults?.valueForKey("buttons") as? NSArray 

     if (sharedData.baseUrl == nil || sharedData.token == nil || sharedData.phoneDeviceId == nil || buttons == nil) { 
      print("Missing data") 
      setButtonTitle("Not logged in. Open Triggi to continue.") 
      return false 
     } 

     if (buttons?.count == 0) { 
      print("No buttons configured") 
      setButtonTitle("No buttons configured. Open Triggi to continue.") 
      return false; 
     } 

    // More things are done with the data here 
} 
+0

क्या यह स्विफ्ट 2 में है ??? – Coder256

+0

हां, दुख की बात है कि तीसरे पक्ष के प्लगइन्स पर निर्भरता के कारण, हम अभी भी स्विफ्ट 2.3 –

+0

से जुड़े हुए हैं जो प्लगइन? साथ ही, क्या आप कृपया 'ड्रॉबटन' और 'रंगफ्रेमनाम' के लिए फ़ंक्शंस प्रदान कर सकते हैं? – Coder256

उत्तर

1

Today Extension Controller एक UIViewController है और इस प्रकार UIViewController के समान जीवन चक्र का पालन करता है। इसलिए, widget लोड होने पर लाइफसाइक्ल विधि viewDidLoad() हर बार कॉल की जाती है।

इसके अलावा, widgetPerformUpdateWithCompletionHandler कहा जाता है:

  1. जब विजेट पृष्ठभूमि में अद्यतन किया जाता है
  2. से पहले विजेट स्नैपशॉट widgetPerformUpdateWithCompletionHandler में loadData() बुला, वह यहां से भी फोन की

तो लिया जाता है, बजाय viewDidLoad()

इसके अलावा, आपने पर्यवेक्षण से UIButtons को जोड़ने/निकालने के लिए कोड कहाँ लिखा है और अपने कोड में "कोई बटन कॉन्फ़िगर नहीं किया गया" दिखाने के लिए?

+0

मैंने इसे और अधिक व्यापक डीबग के लिए कई लॉग जोड़ दिए हैं। मैं इसे कई उपयोगकर्ताओं के साथ समय के साथ चलाना सेट कर दूंगा। अगर यह ठीक हो जाता है, तो मैं वापस आऊंगा! –

संबंधित मुद्दे