无法启动 beginBackgroundTask swift 3

can't start beginBackgroundTask swift 3

抱歉,我卡住了,但我正在尝试启动后台任务(XCode8、swift 3)

示例来自此处: https://developer.apple.com/library/content/documentation/iPhone/Conceptual/iPhoneOSProgrammingGuide/BackgroundExecution/BackgroundExecution.html#//apple_ref/doc/uid/TP40007072-CH4-SW3

在AppDelegate.swift中:

func applicationDidEnterBackground(_ application: UIApplication) {
    var bgTask: UIBackgroundTaskIdentifier = 0;
    bgTask = application.beginBackgroundTask(withName:"MyBackgroundTask", expirationHandler: {() -> Void in
        print("The task has started")
        application.endBackgroundTask(bgTask)
        bgTask = UIBackgroundTaskInvalid
    })
}

该应用从未显示 "The task has started" 消息。我做错了什么?

过期处理程序块在后台运行一段时间后(通常为 5 分钟左右)被调用。 如果您的后台任务需要很长时间才能完成,这意味着用于编写清理逻辑。

你的代码没有问题,你只需要在后台等待后台任务过期即可。

你对后台任务的使用都是错误的。

等待调用过期处理程序来调用 endBackgroundTask 是一种糟糕的做法,它会使您的应用浪费比它需要的更多的资源。当你的后台任务完成时,你应该立即告诉 iOS。

所以你应该这样做:

func applicationDidEnterBackground(_ application: UIApplication) {
    var finished = false
    var bgTask: UIBackgroundTaskIdentifier = 0;
    bgTask = application.beginBackgroundTask(withName:"MyBackgroundTask", expirationHandler: {() -> Void in
        // Time is up.
        if bgTask != UIBackgroundTaskInvalid {
            // Do something to stop our background task or the app will be killed
            finished = true
        }
    })

    // Perform your background task here
    print("The task has started")
    while !finished {
        print("Not finished")
        // when done, set finished to true
        // If that doesn't happen in time, the expiration handler will do it for us
    }

    // Indicate that it is complete
    application.endBackgroundTask(bgTask)
    bgTask = UIBackgroundTaskInvalid
}

另请注意,您应该在任何 class 中的任何代码周围使用 beginBackgroundTask/endBackgroundTask,即使应用程序进入后台,您也希望在短时间内保留 运行。

在此设置中,如果在 while 循环仍在工作时任务未完成,则 expirationHandler 会在 不同的线程上并行调用 .您应该使用处理程序来停止您的代码并允许它到达 application.endBackgroundTask(bgTask) 行。