Firebase хранения загрузки задача не завершается после того, как приложение провел некоторое время в фоновом режиме

Я загружаю изображение из хранилища Firebase следующим образом:

let storage = FIRStorage.storage()
// Create a storage reference from our storage service
let storageRef = storage.reference(forURL: "MY_STORAGE_URL")

let imageRef = storageRef.child("Path_to_image")

// Download image in memory 
let downloadTask = imageRef.data(withMaxSize: 1 * 1024 * 1024) {
    (data, error) -> Void in

    if (error != nil) {

        //Handle the error 

    } else {

        guard let imageData = data else {
            print("Unable to unwrap image data.")
            return
        }

        let downloadedImage = UIImage(data: imageData)
        //Do some stuff with the image 

    }

}

Я также отслеживаю, что происходит с загрузкой, используя следующих наблюдателей:

// Observe changes in status
downloadTask.observe(.resume) { (snapshot) -> Void in
    // Download resumed, also fires when the download starts
}

downloadTask.observe(.pause) { (snapshot) -> Void in
    // Download paused
}

downloadTask.observe(.progress) { (snapshot) -> Void in
    // Download reported progress
}

downloadTask.observe(.success) { (snapshot) -> Void in
    // Download completed successfully
}

downloadTask.observe(.failure) { (snapshot) -> Void in
    //Download failed 
}

Это все работает просто хорошо, когда приложение впервые запущен. Тем не менее, я получаю проблемы, если приложение входит в фоновом режиме, и я играю вокруг с некоторыми другими приложениями (Facebook, Twitter и т.д.), затем верните приложение на передний план. У меня также есть проблемы, если я оставляю приложение открытым и работает на переднем плане для более или равной 1 час.

Проблема в том, что обработчик завершения в let downloadTask = imageRef.data(withMaxSize:blah blah blah (в первом блоке кода выше) никогда не вызывается. Если обработчик завершения никогда не вызывается, я никогда не могу развернуть данные и попытаться использовать образ в своем приложении.

Кроме того, в downloadTaskнаблюдателях единственными обработчиками завершения, которые увольняются, являются .resumeand .progress. .successСобытия .failureor никогда не запускаются. Мне кажется, что это ошибка хранения Firebase, но я не уверен. Кто-нибудь еще сталкивался с подобной проблемой? Я не понимаю, почему код будет работать просто хорошо от свежего запуска, но затем через некоторое время на переднем плане или через некоторое время в фоновом режиме загрузка изображения перестает работать. Заранее спасибо за любой вклад, который вы можете иметь.

1 ответ

  1. К сожалению, в настоящее время это ожидаемое поведение. Firebase Storage (В настоящее время) только на переднем плане: если приложение фоновое, мы не сохранили URL-адрес загрузки и не можем загрузить в фоновом режиме или перезапустить его после того, как он выходит из фона, поэтому он, вероятно, убит ОС и элемент не загружен.

    Это следующая большая вещь™, которую мы хотели бы решить (наш Android SDK делает это возможным , хотя и не легко), но, к сожалению, на данный момент мы не добились большего прогресса в этом.

    Как немного побочного Примечания, ваши наблюдатели не будут существовать после изменения активности — downloadTaskушел, как только приложение является backgrounded, поэтому, когда он возвращается на передний план, нам в основном нужен метод, который извлекает все задачи, которые в настоящее время backgrounded, и позволяет подключить наблюдателей обратно. Что-то вроде:

    FIRStorage.storage().backgroundedTasks { (tasks) -> Void in
      // tasks is an array of upload and download tasks
      // not sure if it needs to be async
    }