gpt4 book ai didi

iphone - iOS 后台 Location 不发送 http 请求

转载 作者:技术小花猫 更新时间:2023-10-29 10:39:19 24 4
gpt4 key购买 nike

我的应用需要在后台跟踪用户位置,但无法发送“获取”请求。当应用程序进入前台时,http 请求会立即发送。我正在为我的所有网络请求使用 RestKit,并且我遵循了 this tutorial设置我的后台位置服务。在我的 applicationDidEnterBackground

-(void)applicationDidEnterBackground:(UIApplication *)application
{
self.bgLocationManager = [[CLLocationManager alloc] init];
self.bgLocationManager.delegate = self;
[self.bgLocationManager startMonitoringSignificantLocationChanges];
NSLog(@"Entered Background");
}

并且我在我的 applicationDidBecomeActive 委托(delegate)中停止了 stopMonitoringSignificantLocationChange

这是我的 locationManager 委托(delegate),我接受新的更新位置并发送到我的服务器

-(void) locationManager:(CLLocationManager *)manager 
didUpdateToLocation:(CLLocation *)newLocation
fromLocation:(CLLocation *)oldLocation
{
NSLog(@"I am in the background");
bgTask = [[UIApplication sharedApplication]
beginBackgroundTaskWithExpirationHandler:
^{
[[UIApplication sharedApplication] endBackgroundTask:bgTask];
}];
// ANY CODE WE PUT HERE IS OUR BACKGROUND TASK

NSString *currentLatitude = [[NSString alloc]
initWithFormat:@"%g",
newLocation.coordinate.latitude];
NSString *currentLongitude = [[NSString alloc]
initWithFormat:@"%g",
newLocation.coordinate.longitude];
NSString *webToken = [[NSUserDefaults standardUserDefaults] stringForKey:@"userWebToken"];
NSLog(@"I am in the bgTask, my lat %@", currentLatitude);

NSDictionary *queryParams;
queryParams = [NSDictionary dictionaryWithObjectsAndKeys:webToken, @"auth_token", currentLongitude, @"lng", currentLatitude, @"lat", nil];
RKRequest* request = [[RKClient sharedClient] post:@"/api/locations/background_update" params:queryParams delegate:self];
//default is RKRequestBackgroundPolicyNone
request.backgroundPolicy = RKRequestBackgroundPolicyContinue;

// AFTER ALL THE UPDATES, close the task

if (bgTask != UIBackgroundTaskInvalid)
{
[[UIApplication sharedApplication] endBackgroundTask:bgTask];
bgTask = UIBackgroundTaskInvalid;
}
}

网络请求按计划工作,但不会在后台调用。我需要任何额外的步骤吗?在我的 info.plist 中,我将 Required Background modes 键和位置服务作为值。

编辑

我还提到了 this past SO answer .我运行了一些测试,在整个 didUpdateToLocation 调用中放置了日志,它们都被调用了,但没有发送“get”请求。相反,当我最终将应用程序启动到前台时,它发送了所有构建的网络请求(超过 10 个)。

编辑 (2)我将 RKRequestBackgroundPolicyContinue 添加到我的请求中,但它并没有改变我的结果。 (正如您在 restkit 的后台上传/下载中看到的 here)。我看到 Restkit 初始化主机但在应用程序激活之前无法发送请求。

回答

RestKit 一定在后台做一些被禁止的事情。使用 NSURLRequest 效果很好。

NSMutableURLRequest * urlRequest = [NSMutableURLRequest requestWithURL:[NSURL URLWithString:@"http://www.example.com/api/locations/background_update"]];
[urlRequest setValue:@"application/json" forHTTPHeaderField:@"Accept"];
[urlRequest setValue:@"application/json" forHTTPHeaderField:@"Content-Type"];
[urlRequest setHTTPMethod:@"POST"];
[urlRequest setHTTPBody:jsonData];

NSHTTPURLResponse *response = nil;
[NSURLConnection sendSynchronousRequest:urlRequest
returningResponse:&response
error:&error];

使用同步请求很好,因为没有 UI 可以中断后台任务

最佳答案

重新创建原始建议作为答案

Have your try replacing your restKit calls with a stock synchronous NSURLConnection? – dklt Sep 20

关于iphone - iOS 后台 Location 不发送 http 请求,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12463091/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com