La mia app è configurata per supportare push silenzioso (contenuto disponibile) e supporta anche il recupero dello sfondo . Voglio che io abbia bisogno di ottenerlo dopo aver ricevuto una push silenziosa, ho bisogno di inviare una richiesta Ajax al server, recuperare i dati e salvarli (persistono con CoreData).Download async all'interno didReceiveRemoteNotification
Ovviamente tutto ciò accade senza che l'utente apra mai l'app. Quando aprirà l'app, un nuovo dato sarà in attesa. Questa è la chiamata spinta silenziosa indietro:
func application(application: UIApplication, didReceiveRemoteNotification userInfo: [NSObject : AnyObject], fetchCompletionHandler completionHandler: (UIBackgroundFetchResult) -> Void) {
// Use Alamofire to make an ajax call:
//...
let mutableURLRequest = NSMutableURLRequest(URL: URL)
let requestBodyData : NSMutableData = NSMutableData()
mutableURLRequest.HTTPBody = body
mutableURLRequest.HTTPMethod = "POST"
mutableURLRequest.setValue("Bearer " + accessToken, forHTTPHeaderField: "Authorization")
mutableURLRequest.setValue("application/json", forHTTPHeaderField: "Content-Type")
request(mutableURLRequest)
.responseJSON { (req, res, data, error) in
//We do not reach this code block !
// Save the incoming data to CoreData
completionHandler(UIBackgroundFetchResult.NewData)
}
}
Ora, il problema è che quando una notifica arriva e il delegato si chiama, il codice viene eseguito ajax, effettuare la chiamata al server, e poi esce. Il codice all'interno del callback ajax non verrà eseguito. Ma quando apro l'app e la porto in primo piano, improvvisamente questa sezione di codice si riavvia e continua a funzionare.
Questo non è il comportamento auspicabile perché quando apro l'applicazione ho ancora bisogno di aspettare 1-2 secondi per le quelle operazioni per eseguire (l'aggiornamento dell'interfaccia utente, ecc)
Che cosa sto facendo male qui? Devo aprire un nuovo thread in background per questa operazione?
UPDATE:
mi sono trasferito completionHandler (UIBackgroundFetchResult.NewData) nel callback ajax, ma ancora questa dose non risolve il problema originale, che è che questo blocco di codice AJAX callback non verrà eseguito.
UPDATE 2:
Sembra come se fosse un problema con Alamofire, e che dovrò utilizzare NSURLSession di fare questa chiamata AJAX. Cercando di mettere insieme un po 'di codice.
Ehi, hai risolto il tuo problema? – gersonmendes