【问题标题】:swift running code in periodically background在定期后台快速运行代码
【发布时间】:2018-12-10 09:10:18
【问题描述】:

即使在后台,我的 swift 应用程序也需要定期运行一段代码。实现这一目标的最佳方法是什么? 我试过DispatchQueue.global(qos: .background).async 但没用

新尝试:

我将此添加到我的 ViewController:

private var time: Date?
private lazy var dateFormatter: DateFormatter = {
    let formatter = DateFormatter()
    formatter.dateStyle = .short
    formatter.timeStyle = .long
    return formatter
}()

func fetch(_ completion: () -> Void) {
    time = Date()
    completion()
}

这是我的 AppDelegate

func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {
    UIApplication.shared.setMinimumBackgroundFetchInterval(UIApplicationBackgroundFetchIntervalMinimum)
    // Override point for customization after application launch.
    return true
}

func application(_ application: UIApplication, performFetchWithCompletionHandler completionHandler: @escaping (UIBackgroundFetchResult) -> Void) {
    if let tabBarController = window?.rootViewController as? UITabBarController,
        let viewControllers = tabBarController.viewControllers
    {
        for viewController in viewControllers {
            if let fetchViewController = viewController as? ViewController {
                fetchViewController.fetch {
                    completionHandler(.newData)
                    print("fired")
                }
            }
        }
    }
}

并在completionHandler(.newData) 上放置一个断点。 但是当我运行应用程序时,断点永远不会被触发。并且打印语句从未执行。

【问题讨论】:

  • DispatchQueue 是一个线程处理进程,当应用程序本身在后台时,它不是后台进程的实际实现。这是两个不同的东西。请先尝试理解这一点。在您的情况下,DispatchQueue.global(qos: .background).async 将在应用程序处于前台时在后台线程中执行一些代码。请在 iOS 中寻找后台模式以满足您的要求。

标签: swift


【解决方案1】:

iOS 不允许您的应用在后台运行时根据您的喜好继续运行进程。当它第一次后台运行时,您将有很短的时间来执行一些任务(大约几分钟),然后它才会停止。

然后,您需要使用后台获取来定期为您的应用获取新信息。

Ray Wenderlich 网站上有一个很好的关于 iOS 支持的各种背景模式的教程:RayWenderlich - Background modes

还有一个guide on Apples developer portal 解释了当应用程序处于后台时您可以做什么和不能做什么。

实现长时间运行的任务

对于需要更多执行时间来执行的任务,您必须请求特定权限才能在后台运行它们而不会被暂停。在 iOS 中,只允许特定的应用类型在后台运行:

  • 在后台向用户播放有声内容的应用,例如音乐播放器应用
  • 在后台录制音频内容的应用
  • 让用户随时了解其位置的应用,例如导航应用
  • 支持互联网协议语音 (VoIP) 的应用
  • 需要定期下载和处理新内容的应用
  • 从外部附件接收定期更新的应用
  • 实现这些服务的应用程序必须声明它们支持的服务并使用系统框架来实现这些服务的相关方面。

声明服务让系统知道您使用了哪些服务,但在某些情况下,实际上是系统框架阻止了您的应用程序被挂起。

更新:

首先,我不会将刷新代码放在 ViewController 中,在后台获取操作期间,VC 可能不在内存中。创建一个单独的类或处理获取和存储数据的东西,然后在您的 ViewControllers viewWillAppear 函数上,加载可用的最新数据。

为了测试后台提取操作,在 xcode 中,从菜单中选择“调试”,然后选择“模拟后台提取”。它将启动应用程序并调用performFetchWithCompletionHandler 函数。

【讨论】:

  • 好吧,我希望它检查我们内部网中的页面是否有新帖子,如果有任何帖子,请通知用户。这个可以吗?
  • 您应该能够在后台获取模式下执行此操作。更好的选择是让一些外部脚本经常检查它并在有新信息时向用户发送推送通知
  • 你能给我举个例子吗?我在您的链接中找不到任何关于安排重复任务的内容
  • 后台获取是您所需要的。它在两个链接中都处于后台模式,或者这里是更多 specific link
  • 我尝试关注您的一个链接,请参阅我编辑的问题
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-15
  • 1970-01-01
  • 1970-01-01
  • 2013-07-14
  • 1970-01-01
  • 2014-02-19
相关资源
最近更新 更多