后台提取performFetchWithCompletionHandler不工作?

时间:2018-05-16 16:21:51

标签: ios swift location background-fetch background-mode

即使app在后台,我的应用也希望每5秒后更新服务器有关用户位置的信息。我为它实现了背景提取。

func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {        
        application.registerUserNotificationSettings(UIUserNotificationSettings(forTypes: [.Alert, .Badge, .Sound], categories: nil))

        application.setMinimumBackgroundFetchInterval(5.0)

        return true
    }

func application(application: UIApplication, performFetchWithCompletionHandler completionHandler: (UIBackgroundFetchResult) -> Void) {

    completionHandler(UIBackgroundFetchResult.NewData)
    UpdateData()
}

func UpdateData(){
     print("UpdateData executes")
    // function to update data when ever this method triggers
}

但问题是

  1. 我无法输入 performFetchWithCompletionHandler 方法,除非我点击调试>模拟后台提取
  2. 如何在每5秒钟后调用 performFetchWithCompletionHandler

1 个答案:

答案 0 :(得分:4)

您对背景提取有误解。在完全执行后台提取时,开发人员无权。 iOS本身决定何时允许应用程序执行后台提取。

setMinimumBackgroundFetchInterval功能仅允许您指定必须在后台提取之间传递的最小时间间隔,以最大程度地降低应用的能耗和数据使用量。但是,您在此处设置的时间间隔并不能完全保证您的应用可以经常执行后台获取操作。 documentation中有关此问题的关键句是"在后台获取内容机会性 ......"

目前,确保您的应用可以在后台执行某些功能(包括从服务器获取数据)的唯一方法是定期从您自己的服务器发送静默推送通知。但是,即便如此,如果您的应用需要很长时间才能完成执行以响应推送或者您的应用收到过多通知,系统可能决定不响应静音推送通知而唤醒您的应用。