2017-04-07 2 views
1

アプリがバックグラウンドにある間にロケーションサービスにアクセス/停止するソリューションを探しています。私のアプリは、バックグラウンドに送られたときに連続した場所を取る(連続した場所にアクセスできる)。アプリの機能には必要です。iOSアプリバックグラウンドロケーションは、タイマーを使用してアクセスします

だから私はいくつかのことを知っていると思います:それはバックグラウンドでまだですが私のアプリは、連続的な位置を取ることができ

  • どのくらい? (OSがバックグラウンドプロセスなどを殺す前に)

  • 私がタイマーを追加したい場合は、60分後にアプリがその場所の撮影をやめ、正しい方法はありますか? Appdelegateクラスで

+0

アップル提供背景モード。 – Lumialxk

答えて

1

背景場所updationは、次のコードを使用して行うことができる場所の更新クラスで

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { 

if ([launchOptions objectForKey:UIApplicationLaunchOptionsLocationKey]) { 

     // This "afterResume" flag is just to show that he receiving location updates 
     // are actually from the key "UIApplicationLaunchOptionsLocationKey" 
     self.shareModel.afterResume = YES; 

     [self.shareModel startMonitoringLocation]; 
    } 

    return YES; 
} 
- (void)applicationDidEnterBackground:(UIApplication *)application { 

[self.shareModel stopContinuosLocationUpdate]; 
    [self.shareModel restartMonitoringLocation]; 
} 
- (void)applicationDidBecomeActive:(UIApplication *)application { 

//Remove the "afterResume" Flag after the app is active again. 
    self.shareModel.afterResume = NO; 

    [self.shareModel startContinuosLocationUpdate]; 
} 

、LocationManager.mを言う:

#import <CoreLocation/CoreLocation.h> 

@property (nonatomic) CLLocationManager * anotherLocationManager; 

- (void)startContinuosLocationUpdate 
{ 
    CLAuthorizationStatus status = [CLLocationManager authorizationStatus]; 

    if (status == kCLAuthorizationStatusDenied) 
    { 
     NSLog(@"Location services are disabled in settings."); 
    } 
    else 
    { 
     // for iOS 8 
     if ([self.anotherLocationManager respondsToSelector:@selector(requestAlwaysAuthorization)]) 
     { 
      [self.anotherLocationManager requestAlwaysAuthorization]; 
     } 
     // for iOS 9 
     if ([self.anotherLocationManager respondsToSelector:@selector(setAllowsBackgroundLocationUpdates:)]) 
     { 
      [self.anotherLocationManager setAllowsBackgroundLocationUpdates:YES]; 
     } 

     [self.anotherLocationManager startUpdatingLocation]; 
    } 
} 

- (void)stopContinuosLocationUpdate 
{ 
    [self.anotherLocationManager stopUpdatingLocation]; 
} 

- (void)startMonitoringLocation 
{ 
    if (_anotherLocationManager) 
     [_anotherLocationManager stopMonitoringSignificantLocationChanges]; 

    self.anotherLocationManager = [[CLLocationManager alloc]init]; 
    _anotherLocationManager.delegate = self; 
    _anotherLocationManager.desiredAccuracy = kCLLocationAccuracyBestForNavigation; 
    _anotherLocationManager.activityType = CLActivityTypeOtherNavigation; 

    if(SYSTEM_VERSION_GREATER_THAN_OR_EQUAL_TO(@"9.0")) { 
     [_anotherLocationManager setAllowsBackgroundLocationUpdates:YES]; 
    } 
    else if(SYSTEM_VERSION_GREATER_THAN_OR_EQUAL_TO(@"8.0")) { 
     [_anotherLocationManager requestAlwaysAuthorization]; 
    } 
    [_anotherLocationManager startMonitoringSignificantLocationChanges]; 
} 

- (void)restartMonitoringLocation 
{ 
    [_anotherLocationManager stopMonitoringSignificantLocationChanges]; 

    if(SYSTEM_VERSION_GREATER_THAN_OR_EQUAL_TO(@"9.0")) { 
     [_anotherLocationManager setAllowsBackgroundLocationUpdates:YES]; 
    } 
    else if(SYSTEM_VERSION_GREATER_THAN_OR_EQUAL_TO(@"8.0")) { 
     [_anotherLocationManager requestAlwaysAuthorization]; 
    } 
    [_anotherLocationManager startMonitoringSignificantLocationChanges]; 
} 


#pragma mark - CLLocationManager Delegate 

- (void)locationManager:(CLLocationManager *)manager didUpdateLocations:(NSArray *)locations 
{ 
    if(_dictLocation && [_dictLocation isKindOfClass:[NSDictionary class]]) 
    { 
     float latitudeValue = [[RVCommon validateDataForNumber:_dictLocation[@"lat"]] floatValue]; 
     float longitudeValue = [[RVCommon validateDataForNumber:_dictLocation[@"lng"]] floatValue]; 
     CLLocation *facilityLocation = [[CLLocation alloc] initWithLatitude:latitudeValue longitude:longitudeValue]; 
     CLLocation *mostRecentLocation = locations.lastObject; 

     CLLocationDistance distanceInMeters = [mostRecentLocation distanceFromLocation:facilityLocation]; 
     if (distanceInMeters <= 500.0) 
     { 
      //Here I am informing the server when user is within 500mts of the coordinate. 
     } 
    } 

    NSLog(@"locationManager didUpdateLocations: %@",locations); 
} 
+0

また、次の質問を参照してください。http://stackoverflow.com/q/27742677/5997339、http://stackoverflow.com/q/19042894/5997339 – ron27

+0

http://stackoverflow.com/a/43274101/5997339 – ron27

関連する問題