我已经在ios中基于计时器实现了背景位置更新(每1分钟一次)。它工作良好并获得位置(纬度和长值),但在15之后断开连接。 我不能再触发它了。 任何人都可以帮助我。
这是我的代码..
- (void)applicationDidEnterBackground:(UIApplication *)application {
[[GlobalClass sharedGlobals].locationManager stopMonitoringSignificantLocationChanges];
if ([[[UIDevice currentDevice] systemVersion] floatValue] >= 8) {
[[GlobalClass sharedGlobals].locationManager requestAlwaysAuthorization];
}
[[GlobalClass sharedGlobals].locationManager startMonitoringSignificantLocationChanges];
int timeInterval = 60; // (i.e., 1 mins )
if (!setTimer) {
setTimer = [NSTimer scheduledTimerWithTimeInterval:timeInterval target: self
selector: @selector(toMakeServerCall) userInfo: nil repeats: YES];
}
}
#pragma mark - Send Current lat & long to the server
- (void)toMakeServerCall {
NSString *latitude = [NSString stringWithFormat:@"%f",[[GlobalClass sharedGlobals] currentLocationObject].coordinate.latitude];
NSString *longitude = [NSString stringWithFormat:@"%f",[[GlobalClass sharedGlobals] currentLocationObject].coordinate.longitude];
NSLog(@"Current Lat is :%@ \n Current Long is :%@ ",latitude,longitude);
NSURL *url = [NSURL URLWithString:[NSString stringWithFormat:@"http:www.google.com/myLatitude is: %@ and My Longitude is: %@",latitude,longitude]];
NSURLRequest *request = [NSURLRequest requestWithURL:url];
}
提前致谢。
答案 0 :(得分:1)
当你使用"重大改变"服务(或坦白地任何位置服务),你不使用计时器。当位置发生变化时,操作系统会调用你,而不是相反。
关于您的计时器,当应用程序暂停时,计时器不再运行。所以,不要使用计时器。但是通过重大变更服务,当设备检测到它已被移动了很长的距离时,您的应用程序将被唤醒并被通知。正如Location and Maps Programming Guide: Starting the Significant-Change Location Service所说:
如果您使重要更改位置服务保持运行且您的iOS应用随后被暂停或终止,则当新位置数据到达时,该服务会自动唤醒您的应用。在唤醒时,应用程序将被置于后台,您将获得少量时间(大约10秒)来手动重新启动位置服务并处理位置数据。 (如Knowing When to Start Location Services中所述,您必须在后台手动重新启动任何挂起的位置更新之前手动重新启动位置服务。)因为您的应用程序在后台,所以它必须执行最少的工作并避免任何任务(例如查询)网络)可能会阻止它在分配的时间到期之前返回。如果没有,您的应用将被终止。如果iOS应用程序需要更多时间来处理位置数据,则可以使用
UIApplication
类的beginBackgroundTaskWithName:expirationHandler:
方法请求更多后台执行时间。
答案 1 :(得分:0)
即使将pausesLocationUpdatesAutomatically
设置为false,位置更新也可能会暂停。好消息是,您可以在暂停更新时收到通知,因此可以重新启动位置更新。
像这样在您的locationManagerDidPauseLocationUpdates
中定义CLLocationManagerDelegate
:
func locationManagerDidPauseLocationUpdates(_ manager: CLLocationManager) {
manager.startUpdatingLocation()
}
答案 2 :(得分:-1)
@surezz:请在下面的网址上查看我的回答。可能它会帮助你。