我有一个iOS应用程序,它在后台收集位置信息并将其推送到Parse。在推送时,我检查 Parse.com 的可达性。如果可以访问,我使用saveInBackground
,否则我使用saveEventually
。以下是事件序列:
我发现当应用程序处于后台时,不会推送更新(在Parse浏览器中不可见)。但是,一旦我点击以获取前景中的应用程序,更新就会发生,我会在网络上看到它们。我已经检查过plist中我有正确的权限(总是得到位置更新),我确实看到位置更新实际上是在我的应用程序的内存中收到的,但它们似乎在Parse推送队列中等待获取在网络上。整个时间,当应用程序在后台或前台时,我连接到网络。
在我的情况下,很可能用户可能不会长时间点击该应用,但我确实需要Parse后端中的位置作为我的后端逻辑。如何在后台推送更新?我搜索并查看了AnyPic代码,但它不适用于最近的iOS,因为在最近的iOS中,我们需要使用NSURL
进行后台推送。
以下是我正在做的代码段。我正在使用dispatch_async和beginBackgroundtask。
var backgroundTaskId: UIBackgroundTaskIdentifier!
if(Reachability.isConnectedToNetwork()) {
// Request a background execution task to allow us to finish uploading the location even if the app is backgrounded
self.backgroundTaskId = UIApplication.sharedApplication().beginBackgroundTaskWithExpirationHandler {
UIApplication.sharedApplication().endBackgroundTask(self.backgroundTaskId)
}
NSLog("Requested background expiration task with id \(self.backgroundTaskId) for writing:\(object)")
// Dispatch async with network connected and then backgrounding the task currently stops
// on-going updates which resume when the task is brought into foreground again.
// This behaviour is of saveInBackground and not of iOS related stuff as it also happens
// without dispatch async and background task ID. See:
// See my question:
//http://stackoverflow.com/questions/32427082/how-to-save-parse-objects-in-background-from-an-ios-app-that-is-in-background
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), {
object.saveInBackgroundWithBlock({
(succeeded: Bool, error: NSError?) -> Void in
if(succeeded) {
UIApplication.sharedApplication().endBackgroundTask(self.backgroundTaskId)
}
else
{
object.saveEventually()
UIApplication.sharedApplication().endBackgroundTask(self.backgroundTaskId) }
}) // saveInBackground
}) // dispatch_async
}
else // No Network
{
object.saveEventually()
}