我试图在应用程序终止时通过 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/