如何从后台的iOS应用程序中保存背景中的Parse对象?

时间:2015-09-06 18:51:28

标签: ios parse-platform

我有一个iOS应用程序,它在后台收集位置信息并将其推送到Parse。在推送时,我检查 Parse.com 的可达性。如果可以访问,我使用saveInBackground,否则我使用saveEventually。以下是事件序列:

  1. 启动应用
  2. 按主页按钮将其置于后台。
  3. 四处移动
  4. 检查Parse中的更新。
  5. 我发现当应用程序处于后台时,不会推送更新(在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()     
            }
    

0 个答案:

没有答案