首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >有人能帮助在迅捷中实现BGTaskScheduler吗?

有人能帮助在迅捷中实现BGTaskScheduler吗?
EN

Stack Overflow用户
提问于 2022-02-24 09:25:06
回答 1查看 1.8K关注 0票数 1

希望每个人都做得好!我一直在尝试实现BGTaskScheduler,这样我的应用程序就可以在后台刷新提要并安排一些本地通知。我已经阅读了几乎每一篇关于BGTaskScheduler的文章/问题,我也找不到它的任何明确实现。我已经下载了苹果ColorFeed的例子,复制了几乎所有的例子,并重新构建了我的代码来围绕这个例子,但它并没有触发(我遇到了其他人也提到了这一点,但线程上没有解决方案)。我知道BGTaskScheduler在刷新的时间框架上是不可靠的,我只需要它每天更新一次,所以这不是一个问题。启动模拟后台应用程序刷新没有做任何事情,我也离开了我的手机与应用程序加载一夜,它没有启动。

我重新设计了我的xcode项目,使用App作为@UIApplicationMain的主要入口点,这意味着我可以看到我的代码工作到applicationDidEnterBackground,但是后台的提取任务只是没有触发。我得到的最后一个打印是"BGTask计划“-没有错误。

后台获取和后台处理都是在签名和功能中启用的(两者都用于故障排除)。我已经将com.devname.AppName.refresh添加到允许的后台任务调度器标识符中,并导入了BackgroundTasks。

我已经用BGProcessingTaskRequest和BGAppRefreshTaskRequest做了下面的尝试。pullData函数所用的时间不到10秒,所以我计划使用BGAppRefreshTaskRequest,下面的内容也是用BGAppProcessingTaskRequest尝试的。

这是我的AppDelegate。

代码语言:javascript
复制
import SwiftUI
import UIKit
import Foundation
import BackgroundTasks


@UIApplicationMain
class AppDelegate: UIResponder, UIApplicationDelegate {
    
    var window: UIWindow?
    
    func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey : Any]? = nil) -> Bool {
        
        let window = UIWindow()
                self.window = window
                window.rootViewController = UIHostingController(rootView: ContentView())
                window.makeKeyAndVisible()
         
        BGTaskScheduler.shared.register(forTaskWithIdentifier: "com.devname.AppName.refresh", using: nil) { task in
            self.handleAppRefresh(task: task as! BGProcessingTask)
        }
            return true
        }
            
    func applicationDidEnterBackground(_ application: UIApplication) {
        print("App Entered Background")
        scheduleAppRefresh()
    }
            
    func scheduleAppRefresh() {
        let request = BGProcessingTaskRequest(identifier: "com.devname.AppName.refresh")
        request.earliestBeginDate = Date(timeIntervalSinceNow: 1 * 60) // Fetch no earlier than 1 minutes from now
        
        do {
            try BGTaskScheduler.shared.submit(request)
            print("BGTask Scheduled")
        } catch {
            print("Could not schedule app refresh: \(error)")
        }
    }
    
    func handleAppRefresh(task: BGProcessingTask) {
        scheduleAppRefresh()
        print("BG Background Task fired")

        let queue = OperationQueue()
        queue.maxConcurrentOperationCount = 1
        print("Op Queue Set")

        let context = BlockOperation {
            print("Background Task Running")
//This is my function to perform in background task            
pullData()
        }
        queue.addOperation(context)
    }
}

一旦我得到了一个解决方案/这个工作,我将重新发布我的代码,因为似乎缺乏该功能的在线工作示例。干杯!

更新

因此,我在代码中遇到了一些问题,我已经更正了这些问题(并编辑了原始文章)。现在,当我模拟背景刷新时,我得到了一些错误,这是很好的,我得到了一些进展。我已经删除了背景任务,这样它就可以直接打印到控制台,但是我仍然会收到这些错误。有人知道是什么导致了这一切吗?

10.10.10.10是我的web托管IP,用于托管CSV,作为后台任务的一部分。即使把它从后台任务中去掉,它仍然被引用。也没有任何来自计划任务的打印。

2022-02-25 17:17:27.746261+0000 APPNAME11826 11826:3148885连接1:收到故障通知

2022-02-25 17:17:27.746388+0000 APPNAME11826 11826:3148885 nw_flow_add_write_request C1.1 10.10.10.10:443失败的通道流(满足(满足路径),可行,接口: en0,ipv4,dns)不能接受写入请求

2022-02-25 17:17:27.746452+0000 APPNAME11826 11826:3148885 nw_write_request_report C1发送失败,错误为“套接字未连接”

EN

回答 1

Stack Overflow用户

发布于 2022-02-26 12:45:51

好的,我不完全确定这是100%的修正,因为我仍然有一些错误,但是看起来背景任务正在运行--这就是这个问题所涉及的问题,下面是一些运行后台任务的代码。

我注意到一件事:调试中的“模拟后台刷新”不会在模拟器或我的iphone上启动背景刷新。我只是偶然地让应用程序在我的iphone上后台运行,并注意到打印结果出现在控制台上。我不确定这是我的xcode的问题,还是我在做一些愚蠢的事情,但至少我已经运行了后台任务。

我还得到了一个错误"Framework dealloc'd‘(未完成)。这是一个程序员错误。“--不确定这是一个实际的错误,是我遗漏的代码,还是它只是一个警告,但我看到了计划任务的打印,它还运行了我设置的测试函数来调度通知。

其中一些代码可能不相关,但它是后台任务工作的一个例子。-希望它能在未来帮助到其他人,因为在网上这方面的例子很少。干杯!

代码语言:javascript
复制
import SwiftUI
import UIKit
import Foundation
import BackgroundTasks


@UIApplicationMain
class AppDelegate: UIResponder, UIApplicationDelegate {
    
    var window: UIWindow?
    
    func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey : Any]?) -> Bool {
        
        let window = UIWindow()
        self.window = window
        window.rootViewController = UIHostingController(rootView: EventListView())
        window.makeKeyAndVisible()
        
        //code goes here
        
        BGTaskScheduler.shared.register(forTaskWithIdentifier: "com.devname.appname.refresh", using: DispatchQueue.main) { task in
            self.handleAppRefresh(task: task as! BGProcessingTask)
        }
        return true
    }
    
    func applicationDidEnterBackground(_ application: UIApplication) {
        print("App Entered Background")
        scheduleAppRefresh()
    }
    
    func scheduleAppRefresh() {
        let request = BGProcessingTaskRequest(identifier: "com.devname.appname.refresh")
        request.requiresNetworkConnectivity = true
        //request.earliestBeginDate = Date(timeIntervalSinceNow: 1 * 60) // Fetch no earlier than 15 minutes from now
        
        do {
            try BGTaskScheduler.shared.submit(request)
            print("BGTask Scheduled")
        } catch {
            print("Could not schedule app refresh: \(error)")
        }
    }
    func handleAppRefresh(task: BGProcessingTask) {
        //Scehdules a second refresh
        scheduleAppRefresh()
        BGNotification()
        print("BG Background Task fired")
}
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/71249731

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档