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.