में पृष्ठभूमि रीफ्रेश करने का प्रयास करते समय नहीं कहा जाता है, मैं एक वेब सेवा से निर्धारित डेटा प्राप्त करने के लिए एक जटिलता पर काम कर रहा हूं। प्रत्येक 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()
}
इस बारे में कुछ बातें:
इस समारोह मैं डेटा की आवश्यकता डाउनलोड करने के लिए इस्तेमाल करते हैं
- जब मैं यह अनुसूची यह कहा जाता हो जाता है। मैं कंसोल में अपना प्रिंट स्टेटमेंट देखता हूं।
- यह लगभग ऐप्पल के उदाहरण के समान है।
- मैंने यूआरएल छोड़ा है। वह वही यूआरएल आईओएस/वॉचओएस ऐप्स में ठीक काम करता है, इसलिए इसमें कुछ भी गलत नहीं है।
समस्या यह है कि मैं कार्य पर 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
पर भी अनुरूप हूं।
अग्रिम में आपकी सहायता के लिए धन्यवाद!
क्या आपने कभी इसे हल किया है? –
यह बहुत बोझिल है। जब मैंने एक बग सबमिट किया, तो ऐप्पल प्रतिनिधि ने मुझे बताया कि यह केवल एक भौतिक डिवाइस (सिम्युलेटर नहीं) पर काम करता है। काश वे इसे अपनी साइट पर पोस्ट नमूना परियोजना के लिए वास्तविक दस्तावेज़ीकरण में कहा था। इसके अलावा, इसमें कुछ समय लगता है। हालांकि, आप इसे लंबे समय तक कॉलबैक के लिए प्रतीक्षा करना चाहते हैं। साथ ही, ऐसा लगता है कि आप अपने दैनिक आवंटित पृष्ठभूमि कार्य कार्यों से बाहर निकल सकते हैं क्योंकि थोड़ी देर के बाद, ऐसा लगता है कि अगले दिन तक काम करना बंद हो जाएगा - जब सिस्टम अधिक पृष्ठभूमि कार्य कार्यों की अनुमति देता है। –
धन्यवाद! Thats .... अच्छी तरह से, भयानक खबर। लेकिन यह भी बताता है कि मैं सिम्युलेटर में काम करने वाले एप्पल उदाहरण क्यों नहीं प्राप्त कर सकता हूं। मेरे पास ऐप्पल वॉच नहीं है, इसलिए मैं एक खरीदता हूं या अपना ऐप वापस लेता हूं :( –