iOS在后台发送HTTP请求

22

当应用程序在后台运行时,是否可以对PHP服务器进行异步的HTTP请求?

这个应用程序是基于位置的,需要每隔5分钟(或其他值)收集当前位置并将坐标发送到服务器。即使应用程序在后台运行,我也可以向服务器发出HTTP POST请求吗?我阅读了很多关于此的思路,但有些人说可以做到,有些人则说不行。

谢谢,

Alex.


2
首先,永远不要尝试在固定时间收集位置信息,这会消耗电池。只需开始监听主要位置变化,如果发生这些变化,则将新位置发送到服务器。如果您需要更准确的位置,请在发生主要位置变化时启动GPS,并在获得足够满足您要求的准确位置后停止GPS。然后将数据发送到服务器。 - rckoenes
3
这是我完成任务的方式:我开始更新位置,获取位置,停止位置更新,将请求发送到服务器,5分钟后再次开始位置更新,获取位置,停止,如此循环。问题是,如果应用程序在后台模式下,我能否发送请求?谢谢。 - Alexandru Circus
2个回答

25

这是可以做到的,但是不可靠,因为你向操作系统请求发送某些东西的时间,操作系统可以接受或拒绝你的请求。以下是我从stackoverflow某处盗取的代码:

[...] //we get the new location from CLLocationManager somewhere here    
BOOL isInBackground = NO;
if ([UIApplication sharedApplication].applicationState == UIApplicationStateBackground)
{
    isInBackground = YES;
}
if (isInBackground)
{
    [self sendBackgroundLocationToServer:newLocation];
}


- (void) sendBackgroundLocationToServer: (CLLocation *) lc
{
    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];
    }
}

2
非常感谢,我宣布你为今年的开发者:)。所以,基本上,它有时可能有效,有时可能无效,这取决于操作系统。 - Alexandru Circus
我可以在模拟器中测试吗? - Dilip Manek
3
isInBackground 完全不必要。 - 2rs2ts
1
@AlexandruCircus 今年的开发者?他写道他从 Stack Overflow 某个地方偷了代码... - Mantas Laurinavičius
1
对于我来说,您就像是一位神一样。谢谢。 - Paresh. P
显示剩余2条评论

4

谢谢,这是Vakio建议的,但没有代码 :d。我认为beginBackgroundTaskWithExpirationHandler方法会解决我的问题。 - Alexandru Circus

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接