У меня есть приложение iOS, которое собирает информацию о местоположении в фоновом режиме и выталкивает его в Parse. При нажатии, я проверяю доступность Parse.com. Если это доступно, я использую saveInBackground
, иначе я использую saveEventually
. Вот последовательность событий:Как сохранить объекты Parse в фоновом режиме из приложения iOS, которое находится в фоновом режиме?
- Запустите приложение
- Положите его в фоновом режиме, нажав кнопку домой.
- Переместить
- Проверить наличие обновлений в разделе «Анализ».
То, что я нахожу, это то, что обновления не были нажаты (не видно в браузере анализа), когда приложение находится в фоновом режиме. Однако, как только я нажимаю, чтобы получить приложение на переднем плане, обновления происходят, и я вижу их в Интернете. Я проверил, что у меня есть правильные разрешения (всегда получаю обновления местоположения) в 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()
}
Спасибо Дэвиду за редактирование, я буду придерживаться его в будущих вопросах. –
Используете ли вы 'beginBackgroundTaskWithExpirationHandler', и если да, вы слишком скоро вызываете' endBackgroundTask'? Убедитесь, что вы вызываете 'endBackgroundTask' * внутри * и в конце блока' saveInBackgroundWithBlock'. –
Изучил код, добавив его на вопрос. beginbBackgroundTaskWithExp .. использовался. Поэтому нам нужно искать в другом месте. –