6

में पृष्ठभूमि रीफ्रेश करने का प्रयास करते समय नहीं कहा जाता है, मैं एक वेब सेवा से निर्धारित डेटा प्राप्त करने के लिए एक जटिलता पर काम कर रहा हूं। प्रत्येक 20-30 मिनट (या मैन्युअल रूप से), मैं ऐसा करने के लिए WKRefreshBackgroundTask शेड्यूल कर रहा हूं।WKURLSessionRefreshBackgroundTask को watchOS

ऐप्पल द्वारा सुझाए गए अनुसार, मैं चाहता हूं कि ओएस पृष्ठभूमि को NSURLSession के माध्यम से इस डेटा को लाने के लिए संभाल लें।

func scheduleURLSession() 
{ 
    print("\nScheduling URL Session...") 

    let backgroundSessionConfig:URLSessionConfiguration = URLSessionConfiguration.background(withIdentifier: NSUUID().uuidString) 
    backgroundSessionConfig.sessionSendsLaunchEvents = true 

    let backgroundSession = URLSession(configuration: backgroundSessionConfig) 

    let downloadTask = backgroundSession.downloadTask(with: URL(string: "https://www.myserver.com/somedata")!) 
    downloadTask.resume() 
} 

इस बारे में कुछ बातें:

इस समारोह मैं डेटा की आवश्यकता डाउनलोड करने के लिए इस्तेमाल करते हैं

  1. जब मैं यह अनुसूची यह कहा जाता हो जाता है। मैं कंसोल में अपना प्रिंट स्टेटमेंट देखता हूं।
  2. यह लगभग ऐप्पल के उदाहरण के समान है।
  3. मैंने यूआरएल छोड़ा है। वह वही यूआरएल आईओएस/वॉचओएस ऐप्स में ठीक काम करता है, इसलिए इसमें कुछ भी गलत नहीं है।

समस्या यह है कि मैं कार्य पर resume() पर कॉल कर रहा हूं और इसे पूरा होने पर अपने ऐप को जागने की इजाजत देता हूं, ऐसा लगता है कि ऐसा नहीं लगता है। एक WKURLSessionRefreshBackgroundTask रूप

func handle(_ backgroundTasks: Set<WKRefreshBackgroundTask>) 

, लेकिन यह नहीं है:

जब यह पूरा करता है, यह एक WKExtensionDelegate हैंडलर के लिए वापस आ रहा किया जाना चाहिए।

मेरा कोड, ऐप्पल के नमूना कोड के समान, फिर एक और सत्र बनाता है लेकिन WKURLSessionRefreshBackgroundTask के पहचानकर्ता के माध्यम से इसे फिर से बदलता है। यह वह जगह है जहां डाउनलोड किए गए डेटा को संसाधित करने के लिए प्रतिनिधि सेट किया गया है। कोड जांचें:

func handle(_ backgroundTasks: Set<WKRefreshBackgroundTask>) { 
    for task in backgroundTasks { 
     switch task { 

     case let backgroundTask as WKApplicationRefreshBackgroundTask: 
      print("\nWatchKit - WKApplicationRefreshBackgroundTask") 
      // self.updateComplicationDataArrivalTimes(backgroundTask) 
      self.scheduleURLSession() 
      backgroundTask.setTaskCompleted() 

     case let snapshotTask as WKSnapshotRefreshBackgroundTask: 
      // Snapshot tasks have a unique completion call, make sure to set your expiration date 
      print("\nWatchKit - WKSnapshotRefreshBackgroundTask") 
      snapshotTask.setTaskCompleted(restoredDefaultState: true, estimatedSnapshotExpiration: Date.distantFuture, userInfo: nil) 

     case let connectivityTask as WKWatchConnectivityRefreshBackgroundTask: 
      print("\nWatchKit - WKWatchConnectivityRefreshBackgroundTask") 
      connectivityTask.setTaskCompleted() 

     case let urlSessionTask as WKURLSessionRefreshBackgroundTask: 
      print("\nWatchKit - WKURLSessionRefreshBackgroundTask") 
      let backgroundConfigObject = URLSessionConfiguration.background(withIdentifier: urlSessionTask.sessionIdentifier) 
      let backgroundSession = URLSession(configuration: backgroundConfigObject, delegate: self, delegateQueue: nil) 

      print("Rejoining session ", backgroundSession) 
      urlSessionTask.setTaskCompleted() 

     default: 
      // make sure to complete unhandled task types 
      task.setTaskCompleted() 
     } 
    } 
} 

लेकिन फिर भी, ऐसा कभी नहीं लगता है। मुझे लगता है कि यह प्रोजेक्ट के लिए ऐप्पल के नमूना कोड के समान कोड के बावजूद यह क्यों काम कर रहा है: WatchBackgroundRefresh: Using WKRefreshBackgroundTask to update WatchKit apps in the background

क्या मेरे प्रोजेक्ट में कुछ सेटिंग है जो मुझे याद आ रही है? मैं यह कोड ExtensionDelegate में देख रहा हूं, वॉचस 3 में नया। मैं WKExtensionDelegate और URLSessionDownloadDelegate पर भी अनुरूप हूं।

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

+0

क्या आपने कभी इसे हल किया है? –

+1

यह बहुत बोझिल है। जब मैंने एक बग सबमिट किया, तो ऐप्पल प्रतिनिधि ने मुझे बताया कि यह केवल एक भौतिक डिवाइस (सिम्युलेटर नहीं) पर काम करता है। काश वे इसे अपनी साइट पर पोस्ट नमूना परियोजना के लिए वास्तविक दस्तावेज़ीकरण में कहा था। इसके अलावा, इसमें कुछ समय लगता है। हालांकि, आप इसे लंबे समय तक कॉलबैक के लिए प्रतीक्षा करना चाहते हैं। साथ ही, ऐसा लगता है कि आप अपने दैनिक आवंटित पृष्ठभूमि कार्य कार्यों से बाहर निकल सकते हैं क्योंकि थोड़ी देर के बाद, ऐसा लगता है कि अगले दिन तक काम करना बंद हो जाएगा - जब सिस्टम अधिक पृष्ठभूमि कार्य कार्यों की अनुमति देता है। –

+0

धन्यवाद! Thats .... अच्छी तरह से, भयानक खबर। लेकिन यह भी बताता है कि मैं सिम्युलेटर में काम करने वाले एप्पल उदाहरण क्यों नहीं प्राप्त कर सकता हूं। मेरे पास ऐप्पल वॉच नहीं है, इसलिए मैं एक खरीदता हूं या अपना ऐप वापस लेता हूं :( –

उत्तर

3

मुझे ऐप्पल का उदाहरण कभी काम नहीं मिला, लेकिन मुझे पृष्ठभूमि रीफ्रेश काम करने में मिला। उनके उदाहरण के विपरीत आपको खुद को सत्र का प्रतिनिधि बनाना होगा। तो यह बजाय की तरह अपनी पृष्ठभूमि सत्र बनाने:

backgroundSession = URLSession जाने (विन्यास: backgroundSessionConfig, प्रतिनिधि: स्वयं, delegateQueue: शून्य)

मैं एक विस्तृत कोड उदाहरण यहाँ (प्रश्न के कोड देखें):

WatchOS 3 WKApplicationRefreshBackgroundTask didReceiveChallenge

उम्मीद है कि यह मदद करता है।

+0

मैं नहीं देख सकता कि यह प्रश्न में आपने जो पोस्ट किया है उससे अलग है। –

+0

प्रश्न का कोड उत्पादन में काम कर रहा है। – CodenameDuchess

4

मुझे यह काम मिल गया! मैंने डब्ल्यूडब्ल्यूडीसी 16 वीडियो/नोट्स पर बहुत कुछ देखकर शुरू किया, उन्हें एप्पल से WatchBackgroundRefresh उदाहरण की तुलना में।फिर, ऐप्पल देव मंचों को ब्राउज़ करते समय, मुझे this thread मिला, उसी समस्या के साथ हमें सामना करना पड़ा। वहां, एक लड़का, "डैनियल फ़ॉन्ट्स" इसे काम करने के लिए अपने 'रेसिपी' पोस्ट करता है (नोट, स्वीकृत उत्तर नहीं!), और जो वीडियो के साथ मिलकर मेरे लिए काम करता है।

क्या मैं एप्पल उदाहरण काम करने के लिए किया था:

  1. MainInterfaceController एक URLSessionDelegate
  2. बनाओ एक स्थानीय चर बनाएँ: var savedTask:WKRefreshBackgroundTask?
  3. handle(backgroundTasks:) समारोह में, स्थानीय चर self.savedTask = task को WKURLSessionRefreshBackgroundTask बचाने - task.setTaskCompleted() (!!)
  4. urlSession - didFinishDownloading: में, सहेजे गए कार्य को पूरा करने के लिए सेट करें: self.savedTask?.setTaskCompleted() आपके पास री डेटा प्राप्त हुआ।
  5. सुनिश्चित करें कि आप जिस संसाधन को एक्सेस कर रहे हैं वह https: // है, अन्यथा अपनी Info.plist फ़ाइल में "ऐप ट्रांसपोर्ट सुरक्षा सेटिंग्स" जोड़ें।

आशा है कि इससे मदद मिल सकती है!

ps। यह सिम्युलेटर में काम करता है (xcode 8.3.3, watchOS 3.2)

+0

ग्रेट टिप @ जेन्स पीटर !! आईटी अंततः जाग गया! मेरी गलती यह थी कि मैं प्रतिनिधि के लिए एक और कक्षा का उपयोग कर रहा था लेकिन अब प्रतिनिधि मेरे एक्सटेंशन डिलीगेट पर हैं और यह काम करता है। लेकिन दो चीजें मैं हल नहीं कर सकता: 1 - मुझे यह संदेश मिल रहा है कि पहचानकर्ता के साथ पृष्ठभूमि सत्र पहले से मौजूद है। यह मुझे परेशान करता है, लेकिन चीजें काम करती हैं किसी भी तरह। 2 - आप 'अवैध और रद्द() 'कॉल कहां डालते हैं? मैं इसका उपयोग नहीं कर रहा हूँ। क्या मैं? – francisaugusto

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