Alamofire me donne une erreur lorsque j'appelle l'API et verrouille l'écran mobile ou l'application Minimize.
"Impossible de terminer l'opération. Le logiciel a provoqué la connexion abandonner "
Veuillez me donner une solution à ce problème.
4 Réponses :
Je pense qu'iOS 12 ferme la connexion avant que la dernière requête ne renvoie un résultat lorsque l'application passe en arrière-plan. vous pouvez utiliser le code suivant pour résoudre votre problème:
if ([UIApplication sharedApplication].applicationState == UIApplicationStateBackground) {
[self sendBackgroundDataToServer];
}
- (void) sendBackgroundDataToServer {
UIBackgroundTaskIdentifier bgTask = UIBackgroundTaskInvalid;
bgTask = [[UIApplication sharedApplication] beginBackgroundTaskWithExpirationHandler:^{
[[UIApplication sharedApplication] endBackgroundTask:bgTask];
}];
NSMutableDictionary *dictionary = [NSMutableDictionary dictionaryWithCapacity:2];
[dictionary setObject:[NSNumber numberWithDouble:lc.coordinate.latitude] forKey:@"floLatitude"];
[dictionary setObject:[NSNumber numberWithDouble:lc.coordinate.longitude] forKey:@"floLongitude"];
// send to server with a synchronous request
// AFTER ALL THE UPDATES, close the task
if (bgTask != UIBackgroundTaskInvalid) {
[[UIApplication sharedApplication] endBackgroundTask:bgTask];
}
}
Merci, je vais vérifier et revenir vers vous.
Votre méthode ne fonctionne pas pour moi car je ne souhaite pas appeler l'API en arrière-plan. Alamofire me donne une erreur lorsque j'appelle l'API et verrouille l'écran mobile ou l'application Minimize.
Quel est le scénario complet de votre problème? c'est-à-dire que chaque fois que vous êtes entré au premier plan et que vous frappez l'API, une erreur est survenue?
@AnkitSaini Il appellera l'API, tandis que l'API est en cours, nous minimiserons l'application ou verrouillerons l'écran. Lorsque nous ouvrons à nouveau l'application, elle affichera le message d'alerte comme ci-dessus.
@ VimalkumarN.M. Absolument raison. Il n'y a pas de solution. Cette erreur provient du côté Apple, conformément à ceci -> github.com/AFNetworking/AFNetworking/issues/4279
J'ai trouvé une solution précise à ce problème:
AppDelegate:
let backgroundTaskIdentifier = UIApplication.shared.beginBackgroundTask(expirationHandler: nil)
backgroundManager.session.configuration.shouldUseExtendedBackgroundIdleMode = true
backgroundManager.startRequestsImmediately = true
backgroundManager.session.configuration.timeoutIntervalForRequest = 180
backgroundManager.request(url, method: apiType, parameters: dict, encoding: URLEncoding.default, headers: headers)
.responseJSON(queue: .main) { (response: DataResponse<Any>) in
UIApplication.shared.endBackgroundTask(backgroundTaskIdentifier)
switch(response.result) {
case .success(_):
case .failure(_):
}
}
Dans votre classe API Manager:
private lazy var backgroundManager: Alamofire.SessionManager = {
let bundleIdentifier = "com.YourDomain.YourAppName"
return Alamofire.SessionManager(configuration: URLSessionConfiguration.background(withIdentifier: bundleIdentifier + ".background"))
}()
var backgroundCompletionHandler: (() -> Void)? {
get {
return backgroundManager.backgroundCompletionHandler
}
set {
backgroundManager.backgroundCompletionHandler = newValue
}
}
Comment appeler l'API:
func application(_ application: UIApplication, handleEventsForBackgroundURLSession identifier: String, completionHandler: @escaping () -> Void) {
APIManager.shared.backgroundCompletionHandler = completionHandler
}
Cela fonctionne-t-il bien pour vous? J'ai un scénario de lien profond, quand je reviens à l'application, je perds la connexion réseau. Cela ne se produit pas fréquemment, mais puisque cela est lié à la tâche de paiement. J'ai dû me pencher dessus.
Voici une réponse à la même question sur la page GitHub d'Alamofire que je trouve utile:
[...] il s'agit d'une erreur système sous-jacente qui peut se produire lorsque les requêtes réseau sont supprimées pendant la mise en arrière-plan. Je vous suggère de mettre en œuvre des tâches en arrière-plan autour de vos demandes réseau pour les maintenir en vie assez longtemps pour les terminer en arrière-plan. Vous pouvez trouver une documentation complète sur les forums de développement Apple . Une fois que vous avez correctement géré cette transition, les erreurs devraient cesser ou vous donner une chance d'annuler correctement les demandes. [
stackoverflow.com/help/how-to-ask
L'intervalle de temps par défaut d'alamofire est: 60, si vous voulez réduire le temps que vous pouvez passer l'intervalle de délai selon vos besoins, les simulateurs ne parviennent pas à résoudre le problème exact.
J'ai défini l'intervalle de temps est: request.timeoutInterval = 15000 @ Anbu.Karthik
ce que vous voulez dire, définissez-vous les 250 minutes pour chaque appel ..?
L'API normale donne également la même erreur lorsque l'intervalle de temps est par défaut de 60 secondes.