AlamoFire Descargar en segundo plano Sesión

Estoy usando Alamofire dentro de una nueva aplicación (Un Gestor de descargas Muestra basada en Alamofire)
Necesito algunas aclaraciones acerca de la descarga de archivos mediante el fondo de sesión.
Necesito reemplazar SessionDelegate para obtener funciona?
O simplemente backgroundCompletionHandler?

Típicamente ¿cuáles son los pasos para manejar las descargas en segundo plano usando Alamofire?
Y ¿cómo puedo controlar el caso de que mi aplicación está relauch, con descargas en el flujo.

InformationsquelleAutor LastMove | 2015-05-09

3 Kommentare

  1. 31

    Actualización

    Basado en este increíble tutorial, he elaborado un proyecto de ejemplo disponibles en GitHub. Él tiene un ejemplo para el fondo de gestión de sesiones.

    Según Apple La dirección URL de Carga Guía de Programación de sistemas:

    Tanto en iOS y OS X, cuando el usuario arranca de nuevo la aplicación, su aplicación
    debe crear inmediatamente fondo de configuración de objetos con el
    mismos identificadores como las sesiones que tenía tareas pendientes cuando su
    aplicación de la última ejecución, a continuación, crear una sesión para cada uno de los
    objetos de configuración. Estas nuevas sesiones son de igual manera de forma automática
    vuelvan a asociar con la continua actividad de fondo.

    Así que al parecer por el uso de la experiencia adecuada configuración de la sesión de los casos, las descargas nunca será «en flujo».

    También he encontrado esta respuesta realmente útil.

    Respuesta Original

    De Alamofire del Página de GitHub:

    Aplicaciones pueden crear gestores de fondo y efímero
    las sesiones, así como nuevos gerentes que personalizar la sesión por defecto
    configuración, tales como el valor por defecto de los encabezados (HTTPAdditionalHeaders) o
    intervalo de tiempo de espera (timeoutIntervalForRequest).

    Por defecto, el nivel superior de los métodos de uso compartido Manager instancia predeterminada de la configuración de la sesión. Sin embargo, puede crear un administrador con fondo de configuración de la sesión de este modo:

    let configuration = NSURLSessionConfiguration.backgroundSessionConfigurationWithIdentifier("com.example.app.background")
    let manager = Alamofire.Manager(configuration: configuration)

    Usted puede hacer las solicitudes de uso de este Manager instancia.

    manager.startRequestsImmediately = true
    let request = NSURLRequest(URL: NSURL(string: "your.url.here")!)
    manager.request(request)

    Mirando a su aplicación, también tiene una propiedad llamada backgroundCompletionHandler, así que usted puede añadir un bloque de finalización:

    manager.backgroundCompletionHandler = {
            //do something when the request has finished
        }
    • Gracias por tu respuesta. Yo ya había leído Alamofire de la documentación. Mi principal pregunta es «¿cómo puedo controlar el caso de que mi aplicación está relauch, con descargas en el flujo.»
    • Yo entiendo. He hecho un poco de investigación, comprobar la actualización de la respuesta, puede ser útil.
    • Muchas gracias, no es exactamente lo que yo esperaba, pero es por lejos la mejor respuesta
    • lo siento, no podía ser más útil. Tengo una cosa más para usted: tengo un proyecto de ejemplo en esta Repo de GitHub con un trabajo de fondo de sesión de la aplicación. Marque la casilla de «Redes» del proyecto. Usted puede también encontrar los recursos que he utilizado en la descripción. En mi experiencia, usted no tiene que preocuparse acerca de la aplicación se reinicia, el fondo de las sesiones de trabajo «automáticamente». Espero que ayude! 🙂
    • Ty voy a ver que
    • FIY startRequestsImmediately es true de forma predeterminada, gracias por la respuesta compañero
    • Puede agregar una sección cerca de la parte superior de explicar por qué es más fácil hacerlo directamente que con AF? También me costó un poco de búsqueda en google para darse cuenta de que la FA del cierre de devolver la llamada a sistema simplemente no puede trabajar con el fondo de las sesiones, al menos no directamente, y que este es un caso de uso que mejor manejan directamente (si dolorosamente).
    • Puede usted por favor, actualice su ejemplo a al menos Swift 3 ?
    • Mi destinationURL es nula, si yo lanzo una solicitud de descarga con la URL de arriba. y el archivo descargado no se descargan usando por encima de administrador. @JózsefVesza

  2. 25

    Es realmente muy fácil con Alamofire:

    1) su Alamofire.El administrador debe ser configurado con un fondo en el identificador de sesión:

    class NetworkManager {
        ...
        private lazy var backgroundManager: Alamofire.SessionManager = {
            let bundleIdentifier = ...
            return Alamofire.SessionManager(configuration: URLSessionConfiguration.background(withIdentifier: bundleIdentifier + ".background"))
        }()
        ...
    }

    2) en la Aplicación Delegado implementar application(_:handleEventsForBackgroundURLSession:completionHandler: y pasar el controlador de finalización para Alamofire.SessionManager.backgroundCompletionHandler.

    En mi caso la aplicación delegado método parece

    func application(_ application: UIApplication, handleEventsForBackgroundURLSession identifier: String, completionHandler: @escaping () -> Void) {
        NetworkManager.default.backgroundCompletionHandler = completionHandler
    }

    y mi administrador de red tiene un calculada propiedad como esta para configurar el Administrador de la propiedad:

    var backgroundCompletionHandler: (() -> Void)? {
        get {
            return backgroundManager.backgroundCompletionHandler
        }
        set {
            backgroundManager.backgroundCompletionHandler = newValue
        }
    }
    • ¿Cuánto tiempo durará este trabajo en segundo plano ?
    • es posible descargar varias imágenes una a una mediante Funciones Recursivas?
  3. 8

    Yo estaba buscando la solución bastante largo. Hasta leer el artículo mencionado anteriormente. El problema para mi fue – tuve que habilitar accesorio Externo de comunicación

    AlamoFire Descargar en segundo plano Sesión

    Todo lo demás fue hecho como se describió anteriormente.
    AppDelegate:

    func application(_ application: UIApplication, handleEventsForBackgroundURLSession identifier: String, completionHandler: @escaping () -> Void) {
            BackendAPIManager.sharedInstance.backgroundCompletionHandler = completionHandler
        }

    Singleton:

    import Alamofire
    
    class BackendAPIManager: NSObject {
        static let sharedInstance = BackendAPIManager()
    
        var alamoFireManager : Alamofire.SessionManager!
    
        var backgroundCompletionHandler: (() -> Void)? {
            get {
                return alamoFireManager?.backgroundCompletionHandler
            }
            set {
                alamoFireManager?.backgroundCompletionHandler = newValue
            }
        }
    
        fileprivate override init()
        {
            let configuration = URLSessionConfiguration.background(withIdentifier: "com.url.background")
            configuration.timeoutIntervalForRequest = 200 //seconds
            configuration.timeoutIntervalForResource = 200
            self.alamoFireManager = Alamofire.SessionManager(configuration: configuration)
        }
    }

    Y las llamadas se realizan de la siguiente manera:

    BackendAPIManager.sharedInstance.alamoFireManager.upload(multipartFormData: { (multipartFormData) in ...
    • ¿Tu aplicación no necesita realmente para tener la funcionalidad mediante el cual se comunica con un accesorio externo para que Apple apruebe una aplicación con este modo de fondo marcado?
    • Por qué usted necesita para activar accesorios Externos de comunicación? Esto se convierte en un problema cuando la presentación de la app en la AppStore.
    • Fondo de la página de la sincronización de las buenas condiciones de funcionamiento, gracias a los post de esta respuesta.
    • ¿este método es aceptado por Apple al subir a la tienda?
    • nope.

Kommentieren Sie den Artikel

Bitte geben Sie Ihren Kommentar ein!
Bitte geben Sie hier Ihren Namen ein

Pruebas en línea