当应用程序被杀死时,如何获取准确的位置更新? [英] How to get accurate location update when application is killed?
问题描述
我正在开发一个基于位置的应用程序,用户可以在其中存储多个位置,并且当用户经过该存储位置附近时,应用程序将通过本地通知来通知用户.
I'm developing a location based application where user can stored number of locations and when user passed near by that stored location, application will notify user by local notification.
我使用以下代码来实现此功能:
I've used following code to achieve this feature:
-(BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
if([[UIApplication sharedApplication] backgroundRefreshStatus] == UIBackgroundRefreshStatusDenied){
[self showAlertWithTitle:@"" andMessage:@"The app doesn't work without the Background App Refresh enabled. To turn it on, go to Settings > General > Background App Refresh."];
}else if([[UIApplication sharedApplication] backgroundRefreshStatus] == UIBackgroundRefreshStatusRestricted){
[self showAlertWithTitle:@"" andMessage:@"The functions of this app are limited because the Background App Refresh is disable."];
} else {
if ([launchOptions objectForKey:UIApplicationLaunchOptionsLocationKey]) {
// This "afterResume" flag is just to show that he receiving location updates
self.shareModel.afterResume = YES;
self.shareModel.anotherLocationManager = [[CLLocationManager alloc]init];
self.shareModel.anotherLocationManager.delegate = self;
self.shareModel.anotherLocationManager.desiredAccuracy = kCLLocationAccuracyHundredMeters; //kCLLocationAccuracyBestForNavigation
self.shareModel.anotherLocationManager.activityType = CLActivityTypeOtherNavigation;
[self.shareModel.anotherLocationManager startUpdatingLocation];
self.shareModel.anotherLocationManager.pausesLocationUpdatesAutomatically = YES;
if(IS_OS_8_OR_LATER) {
if ([self.shareModel.anotherLocationManager respondsToSelector:@selector(requestWhenInUseAuthorization)]) {
[self.shareModel.anotherLocationManager requestWhenInUseAuthorization];
}
[self.shareModel.anotherLocationManager requestAlwaysAuthorization];
}
[self.shareModel.anotherLocationManager startMonitoringSignificantLocationChanges];
}
}
}
-(void)locationManager:(CLLocationManager *)manager didUpdateLocations:(NSArray *)locations {
CLLocation *currentLocation = [locations lastObject];
latitudeTemp = currentLocation.coordinate.latitude;
longitudeTemp = currentLocation.coordinate.longitude;
[self locationChangeLogic];
//If the timer still valid, return it (Will not run the code below)
if (self.shareModel.timer)
return;
self.shareModel.bgTask = [BackgroundTaskManager sharedBackgroundTaskManager];
[self.shareModel.bgTask beginNewBackgroundTask];
//Restart the locationMaanger after 30 Seconds
self.shareModel.timer = [NSTimer scheduledTimerWithTimeInterval:30
target:self
selector:@selector (restartLocationUpdates)
userInfo:nil
repeats:YES];
//Will only stop the locationManager after 10 seconds, so that we can get some accurate locations
//The location manager will only operate for 10 seconds to save battery
NSTimer * delay10Seconds;
delay10Seconds = [NSTimer scheduledTimerWithTimeInterval:10
target:self
selector:@selector(stopLocationDelayBy10Seconds)
userInfo:nil
repeats:YES];
}
- (void)applicationDidEnterBackground:(UIApplication *)application {
[self.shareModel.anotherLocationManager startMonitoringSignificantLocationChanges];
}
- (void)applicationDidBecomeActive:(UIApplication *)application {
// Restart any tasks that were paused (or not yet started) while the application was inactive. If the application was previously in the background, optionally refresh the user interface.
//Remove the "afterResume" Flag after the app is active again.
self.shareModel.afterResume = NO;
if(self.shareModel.anotherLocationManager)
[self.shareModel.anotherLocationManager stopMonitoringSignificantLocationChanges];
self.shareModel.anotherLocationManager = [[CLLocationManager alloc]init];
self.shareModel.anotherLocationManager.delegate = self;
self.shareModel.anotherLocationManager.desiredAccuracy = kCLLocationAccuracyHundredMeters; //kCLLocationAccuracyBestForNavigation;
self.shareModel.anotherLocationManager.activityType = CLActivityTypeOtherNavigation;
[self.shareModel.anotherLocationManager startUpdatingLocation];
if(IS_OS_8_OR_LATER) {
if ([self.shareModel.anotherLocationManager respondsToSelector:@selector(requestWhenInUseAuthorization)]) {
[self.shareModel.anotherLocationManager requestWhenInUseAuthorization];
}
[self.shareModel.anotherLocationManager requestAlwaysAuthorization];
}
[self.shareModel.anotherLocationManager startMonitoringSignificantLocationChanges];
}
通过使用以上代码,我甚至可以获得位置被用户杀死的应用程序,但不够准确.有时我没有获得位置,有时我在通过存储的位置后获得了位置.当用户输入该特定半径时,我需要准确显示位置通知.
By using above code, i'm able to get location even application killed by User but not as accurate as it should be. Sometime i didn't get location and sometime i get location after passing that stored location. I need to show location notification exactly when user enter in that specific radius.
请帮助我解决此问题.
谢谢.
推荐答案
区域监视(Geofencing)可以满足我的要求.
Region Monitoring (Geofencing) serve my requirement.
您可以使用以下几个链接来获取更多信息:
You can use few following link for more information:
谢谢..
这篇关于当应用程序被杀死时,如何获取准确的位置更新?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!