【问题标题】:What is the Xcode "Background Processing" Background Mode?什么是 Xcode“后台处理”后台模式?
【发布时间】:2019-12-03 11:53:14
【问题描述】:

在 Xcode 11 中,有一个新的后台模式,“后台处理”。我找不到有关此新后台模式的作用的任何信息。

是否有包含这些信息的资源?

此模式会以某种方式影响在后台使用位置更新(区域监控和 SLC)的应用程序?

【问题讨论】:

  • 我也有同样的问题。我激活了这个功能,但它似乎对应用程序没有任何影响。我的应用执行一些后台任务,这就是我激活它的原因。

标签: ios xcode background-process xcode11 ios-background-mode


【解决方案1】:

应用状态

foreground -> background -> suspended -> terminated

background transfer - 当应用程序处于后台模式时执行一些任务

添加在后台模式下工作的功能

App Target -> Signing & Capabilities -> + Capability -> Background Modes

您可以找到以下模式列表:

  • 音频 - 在后台模式下录制/播放音频
  • 位置 - 在后台模式下接收新的位置更新
  • 后台任务
    • 后台获取 - 后台应用刷新任务 - 在加载应用前 30 秒获取最新数据。
    • 后台处理任务 - 在系统友好时间几分钟(例如,在应用程序成为后台之后)完成大任务(清除视频内容)或优先任务(发送消息)

[Background session]

【讨论】:

    【解决方案2】:

    还没有文档。但是在 WWDC2019 中,他们解释了它是什么以及如何使用它。链接在这里: Apple WWDC 2019

    假设您想在后台清理数据库以删除旧记录。首先,您必须在 Background Modes 功能中启用后台处理。然后在您的Info.plist 中添加后台任务调度程序标识符:

    然后在 'ApplicationDidFinishLaunchingWithOptions' 方法中向任务注册您的标识符。

    BGTaskScheduler.shared.register(forTaskWithIdentifier: "com.example.apple-samplecode.ColorFeed.db_cleaning", using: nil) { task in
        // Downcast the parameter to a processing task as this identifier is used for a processing request
        self.handleDatabaseCleaning(task: task as! BGProcessingTask)
    }
    

    在后台执行您想要执行的工作并将其放入操作队列中。在我们的例子中,清理函数如下所示:

    // Delete feed entries older than one day...
    func handleDatabaseCleaning(task: BGProcessingTask) {
        let queue = OperationQueue()
        queue.maxConcurrentOperationCount = 1
    
        // Do work to setup the task
        let context = PersistentContainer.shared.newBackgroundContext()
        let predicate = NSPredicate(format: "timestamp < %@", NSDate(timeIntervalSinceNow: -24 * 60 * 60))
        let cleanDatabaseOperation = DeleteFeedEntriesOperation(context: context, predicate: predicate)
    
        task.expirationHandler = {
            // After all operations are canceled, the completion block is called to complete the task
            queue.cancelAllOperations()
        }
    
        cleanDatabaseOperation.completionBlock {
            // Perform the task
        }
    
        // Add the task to the queue
        queue.addOperation(cleanDatabaseOperation)
    }
    

    现在,当应用程序进入后台时,我们必须在BGTaskScheduler 中安排后台任务。

    注意:BGTaskScheduler 是一项新功能,用于安排将在后台执行的多个后台任务]。

    此后台任务将每周执行一次以清理我的数据库。查看您可以提及的属性以定义任务类型。

    【讨论】:

    • API 中是否没有功能可以处理 BGTask 的调用频率? IE。控制它不被过多调用的唯一方法是像你现在做的那样自己做,而不是每周一次?
    • BGAppRefreshTaskRequest 与 BGProcessingTaskRequest 之间的区别是什么,除了允许的执行时间以及为什么不总是只使用 BGProcessingTaskRequest。
    • BGProcessingTaskRequest 用于“可能需要几分钟的任务”,而 Refresh 用于较短的任务,例如快速数据更新。
    • 我们可以在应用程序在后台时触发这个吗?
    • 同样的问题:我们可以在应用处于后台并且应用完全关闭时触发这个吗?
    【解决方案3】:

    运行 BGTaskScheduler 任务需要“后台处理”模式。

    BGTaskScheduler:

    通过提交任务请求来调度任务的类 在后台启动您的应用程序。为后台配置应用程序 任务 通过添加 所需背景模式的功能,并通过添加 任务标识符白名单。

    为后台任务配置应用程序

    通过添加以下功能为应用程序配置后台任务 所需的后台模式,并通过添加任务白名单 身份标识。

    【讨论】:

      猜你喜欢
      • 2020-11-11
      • 1970-01-01
      • 2012-02-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-09-18
      • 1970-01-01
      • 2010-09-26
      相关资源
      最近更新 更多