2
votes

Erreur Alamofire: l'opération n'a pas pu être terminée. Le logiciel a provoqué la déconnexion

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 "

 entrez la description de l'image ici

  • Mon API prend 60 secondes pour terminer une opération.
  • Cela ne se produit que sur les iPhone, pas sur les simulateurs.

Veuillez me donner une solution à ce problème.


5 commentaires

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.


4 Réponses :


3
votes

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];
       }
}


5 commentaires

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



0
votes

 entrez la description de l'image ici

Redémarrez votre iPhone, la solution à ce problème.


0 commentaires

0
votes

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
    }


1 commentaires

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.



0
votes

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. [


0 commentaires