后台获取 performFetchWithCompletionHandler 不起作用?
Posted
技术标签:
【中文标题】后台获取 performFetchWithCompletionHandler 不起作用?【英文标题】:Background fetch performFetchWithCompletionHandler not working? 【发布时间】:2018-10-26 19:04:06 【问题描述】:即使应用在后台,我的应用也希望每 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
但问题是
-
我无法进入 performFetchWithCompletionHandler 方法,除非我点击 Debug>simulate background fetch
如何实现每 5 秒调用一次 performFetchWithCompletionHandler。
【问题讨论】:
你找到解决办法了吗? 【参考方案1】:您对什么是后台提取存在误解。开发人员无权决定何时准确执行后台提取。 ios 自己决定何时允许应用执行后台提取。
setMinimumBackgroundFetchInterval
函数仅允许您指定在后台提取之间必须经过的最小时间间隔,以最大限度地减少应用程序的能源和数据使用量。但是,您在此处设置的时间间隔并不能保证您的应用程序能够频繁地执行后台获取。 documentation 中关于此的关键语句是“在后台opportunistically获取内容...”。
目前,确保您的应用可以在后台执行某些功能(包括从服务器获取数据)的唯一方法是定期从您自己的服务器发送静默推送通知。但是,即使这样,如果您的应用需要很长时间才能完成执行以响应推送,或者您的应用收到太多通知,系统可能会决定不唤醒您的应用以响应静默推送通知。
【讨论】:
好的...可以在位置更新后台模式下完成...在后台设置位置获取间隔,一旦此间隔方法/委托获取调用,将消息发送到具有最新位置的服务器间隔 5 秒后。 @Azhar 你可以尝试使用deferred location updates,这是设置定期调用代理的时间间隔的唯一方法(请注意,GPS 仍将在整个持续时间内保持开启,它赢了在您的情况下,不只是每 5 分钟打开一次)。此外,系统可能不会为您的应用程序提供足够的执行时间来完成后台URLRequest
。我真的不建议滥用位置更新来处理常规的后台网络请求。
首先,由于您的应用程序不断使用 GPS,您的用户将体验到电池寿命严重下降,其次,Apple 可能会因滥用后台位置更新而拒绝您的应用程序。
是的,我已经与客户沟通过这可能对电池寿命有害,Apple 可以强制在应用描述中添加这样的文字……但他坚持不惜一切代价这样做:) 以上是关于后台获取 performFetchWithCompletionHandler 不起作用?的主要内容,如果未能解决你的问题,请参考以下文章