2015-09-06 4 views
2

У меня есть приложение iOS, которое собирает информацию о местоположении в фоновом режиме и выталкивает его в Parse. При нажатии, я проверяю доступность Parse.com. Если это доступно, я использую saveInBackground, иначе я использую saveEventually. Вот последовательность событий:Как сохранить объекты Parse в фоновом режиме из приложения iOS, которое находится в фоновом режиме?

  1. Запустите приложение
  2. Положите его в фоновом режиме, нажав кнопку домой.
  3. Переместить
  4. Проверить наличие обновлений в разделе «Анализ».

То, что я нахожу, это то, что обновления не были нажаты (не видно в браузере анализа), когда приложение находится в фоновом режиме. Однако, как только я нажимаю, чтобы получить приложение на переднем плане, обновления происходят, и я вижу их в Интернете. Я проверил, что у меня есть правильные разрешения (всегда получаю обновления местоположения) в plist, и я вижу, что обновления местоположения на самом деле получены в памяти моего приложения, но они, похоже, ждут в очереди Push 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

Спасибо Дэвиду за редактирование, я буду придерживаться его в будущих вопросах. –

+0

Используете ли вы 'beginBackgroundTaskWithExpirationHandler', и если да, вы слишком скоро вызываете' endBackgroundTask'? Убедитесь, что вы вызываете 'endBackgroundTask' * внутри * и в конце блока' saveInBackgroundWithBlock'. –

+0

Изучил код, добавив его на вопрос. beginbBackgroundTaskWithExp .. использовался. Поэтому нам нужно искать в другом месте. –

ответ

0

Если вы хотите нажимать обновления в фоновом режиме, вам необходимо включить фоновый режим. Вот tutorial, который должен вам помочь.

+0

Я добавил свой код к вопросу, я, кажется, делаю то, что описано в учебнике. –

Смежные вопросы