ios - ApplicationWillTerminate NSURLSession 可能吗?

标签 ios objective-c nsurlconnection uiapplicationdelegate

我试图在应用程序终止时通过 NSURLSession 进行快速 POST。应用程序终止定义为用户在主屏幕上将其滑出。此外,applicationWillTerminate 被示范性地调用(所以这不是问题)。

我的目的是通知服务器该用户现在要下线了。

然而,这不起作用..因为我没有在我的后端收到 POST。我想弄清楚为什么这不起作用.. 或者即使它应该?根据 Apple 文档,如果它可以在 5 秒内执行,这应该可以工作。虽然我什至没有完成处理程序,所以它应该被执行。任何帮助或建议将不胜感激。

我的实现如下(供引用)

- (void)applicationWillTerminate:(UIApplication *)application {

    NSMutableDictionary * gatherAllInputs = [[NSMutableDictionary alloc] initWithObjectsAndKeys:
                                             @"blah@df.com, @"emailEntry",
                                             @"False", @"isPersonAvailable",
                                             nil];

    NSError *error;
    NSData *gatherAllInputsJSON = [NSJSONSerialization dataWithJSONObject:gatherAllInputs options:0 error:&error];

    NSString* theDataSentToServer;
    theDataSentToServer = [[NSString alloc] initWithData:gatherAllInputsJSON encoding:NSUTF8StringEncoding];

    NSURLSessionConfiguration *sessionConfiguration = [NSURLSessionConfiguration defaultSessionConfiguration];
    NSURLSession *postingSession = [NSURLSession sessionWithConfiguration:sessionConfiguration];

    NSURL *url = [NSURL URLWithString:@"https://blahblahblah.com/someblah"];
    NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url];

    [request setHTTPMethod:@"POST"];
    [request setHTTPBody:[theDataSentToServer dataUsingEncoding:NSUTF8StringEncoding]];

    NSURLSessionDataTask *postSomething = [postingSession dataTaskWithRequest:request];
    [postSomething resume]; 
    NSLog(@"Got here!"); //<-- THIS GETS OUTPUTTED.. SO I KNOW THIS CODE IS BEING CALLED!

}

编辑:

同样,我们有带有 XMPP 框架的消息传递应用程序。 需要在 applicationWIllTerminate 委托(delegate)上终止/断开 XMPP 连接。实际上,当应用程序处于前台并且用户切换到多任务 UI(双击主页按钮)时,将调用 applicationWIllTerminate。通过调用 XMPP Disconnection 尝试但没有运气。

不能使用 WillResignActive 来断开连接,在 DidEnteredBackground 中,不允许在这种情况下将委托(delegate)用于任何时间延长。

Server-client Ping pong 每 2 分钟进行一次,因此也将继续进行中继。

寻找可行的解决方案以在用户强制退出应用程序时断开 XMPP。

最佳答案

可能会发生许多事情:

首先,Apple 表示:“您对该方法的实现有大约 5 秒的时间来执行任何任务并返回。” Apple Docs

我强调“大约”是因为认为这 5 秒是理所当然的,这不是您通常想要做的事情。此超时可能取决于多种因素,例如资源的总体可用性(受您的应用无法控制的具体情况的影响,例如正在运行的其他应用)。

其次,你说:“虽然我什至没有完成处理程序所以它应该被执行”。

这意味着您正在执行同步调用,即在放手之前必须等待的调用。您确定零到大约 5 秒对于这次通话来说足够了吗?我知道这听起来时间太多了,但网络可用性/可靠性/速度也是我们通常不应认为理所当然的事情。

您是否尝试过做其他事情而不是在那里进行网络调用?例如,为用户默认值写点什么?放一个计时器,看看实际给你的时间有多少变化。

关于ios - ApplicationWillTerminate NSURLSession 可能吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28465946/

相关文章:

ios - CLGeocoder Swift 2 版本

c++ - 如何从 64 位整数中获取高 20 位?

ios - iOS NSURLSession 是否支持 HTTP 100-continue?

nsurlconnection - NSURLConnection 的 didReceiveData 方法中 appendData 的奇怪问题

objective-c - iOS:接受多个对象类型作为参数(是)对象?

ios - 应用程序在后台时的连接状态和通过XMPP的处理

objective-c - 如何控制MPMoviePlayerController的播放时间?

objective-c - 在 webview 上添加事件指示器

swift - 如何使用 XCTest 对离线场景进行单元测试

ios - 如何在单个 UIView 中启用两个不同 UIScrollview 的缩放?