0

我正在開發一個基於位置的應用程序,其中用戶可以存儲多個位置,當用戶通過該存儲位置傳遞時,應用程序將通過本地通知通知用戶。如何在應用程序被殺時獲得準確的位置更新?

我用下面的代碼來實現此功能:


-(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]; 
} 

通過使用上面的代碼,我能夠獲取位置甚至是由用戶殺死的應用程序,但並不像應該那樣準確。有時候我沒有得到位置,有時候我通過存儲位置後得到位置。我需要在用戶輸入特定半徑時精確顯示位置通知。

請幫我解決這個問題。

在此先感謝。

+0

你測試這個程序在其他車輛上或在行走? – BSMP 2015-03-30 13:32:24

+0

現在,我正在使用CLLocationRegion以更好的方式獲取基於位置的通知。 – 2015-04-15 14:55:56

+0

@MehulS發佈您的答案請輸入你的電子郵件地址 – Arvind 2015-08-18 12:03:24

回答

相關問題