Ios 如果应用程序在终止期间发送http请求,服务器是否会收到该请求?

Ios 如果应用程序在终止期间发送http请求,服务器是否会收到该请求?,ios,http,Ios,Http,我想知道,如果我的iOS应用程序正在终止,如果我发送一个HTTP请求通知服务器用户正在脱机,服务器会收到这个请求吗 我的代码如下: - (void)applicationWillTerminate:(UIApplication *)application { // Called when the application is about to terminate. Save data if appropriate. See also applicationDidEnterBackgrou

我想知道,如果我的iOS应用程序正在终止,如果我发送一个HTTP请求通知服务器用户正在脱机,服务器会收到这个请求吗

我的代码如下:

- (void)applicationWillTerminate:(UIApplication *)application {
    // Called when the application is about to terminate. Save data if appropriate. See also applicationDidEnterBackground:.
    NSMutableDictionary *para = [[NSMutableDictionary alloc]initWithCapacity:0];
    [para setObject:[[NSUserDefaults standardUserDefaults] valueForKey:@"UserBindId"] forKey:@"unionId"];
    [para setObject:@(0) forKey:@"OnlineState"];
    [Post updateOnlineWithParameters:para withBlock:^(NSDictionary *commitResult, NSError *error) {
        NSLog(@"applicationWillTerminate = %@", commitResult);
    }];
}
有关如何在应用程序进入后台模式时让应用程序请求多一点时间(最多3分钟,对于您的目的来说应该足够了)的示例,请参阅

- (void)applicationDidEnterBackground:(UIApplication *)application
{
    bgTask = [application beginBackgroundTaskWithName:@"GoingOffline" expirationHandler:^{
        // Well, we ran out of time before network request finished ... handle that however you want

        // but tell the OS that we understand, and that the background task is done

        [application endBackgroundTask:bgTask];
        bgTask = UIBackgroundTaskInvalid;
    }];

    NSDictionary *para = @{@"unionID"     : [[NSUserDefaults standardUserDefaults] valueForKey:@"UserBindId"],
                           @"OnlineState" : @0};

    [Post updateOnlineWithParameters:para withBlock:^(NSDictionary *commitResult, NSError *error) {
        // when done, tell the OS that the background task is done

        [application endBackgroundTask:bgTask];
        bgTask = UIBackgroundTaskInvalid;
    }];
}

我试图简化您的参数一点(不需要可变字典…您可以使用字典文字),所以根据您的需要进行调整。但希望您能遵循这里的基本思想,如果您想在应用程序进入后台时执行某些操作,您必须为此请求权限。

您不能使用http请求从客户端提供故障保护用户在线/离线状态功能。正如Rob所说,如果应用程序被终止(强制退出或e.t.c.)你将无能为力。提供此类功能的方法是使用web套接字,这是电话和服务器之间的“恒定”双向通信。通过这种方式,您可以在服务器端检查连接是否丢失,这表示客户端已脱机。
自己创建这样的服务需要相当长的时间。幸运的是,我们提供这样的软件,并将后端作为服务。这是天赐之物。描述如何管理脱机和联机状态。这很简单。

当你尝试你的代码时会发生什么?@MatthewBurke-这通常是一个谨慎的问题(坦率地说,OP应该描述他的代码的结果),但这是一个经验测试不谨慎的场景。积极的结果(很有可能)并不一定意味着这种模式是安全的(因为它不是)。解决请求和应用程序终止之间的竞争的最安全的方法是简单地要求操作系统额外一点时间来运行有限长度的任务。@Rob-好的观点。我本打算在得到提问者观察到的更多细节后,再提出比赛情况。但这并不是回答这个问题的最佳方法。谢谢。但是,(应用程序输入背景)和(应用程序将终止)之间有什么不同吗?如果应用程序终止被终止,应用程序是否将获得3分钟任务?有关应用程序生命周期的讨论,请参阅。底线是,如果用户刚刚离开你的应用程序,上述操作将使应用程序在后台运行以完成网络请求,在此之前不会暂停或终止。如果用户手动终止您的应用程序(例如,双击home按钮并向上滑动;或关闭设备电源),则所有赌注都将被取消,您没有机会保证发送请求。