使用计时器访问iOS应用程序后台位置

时间:2017-04-07 09:50:46

标签: ios

我正在寻找一种解决方案,以便在app处于后台时访问/停止位置服务。我的应用程序在发送到后台时可以连续定位(它可以访问连续位置)。这是应用功能所必需的。

所以我想知道一些事情:

  • 我的应用程序在后台仍能连续占据多长时间? (在操作系统杀死后台进程之前或类似的事情之前)

  • 如果我想添加一个计时器,说60分钟后app会停止占用该位置,那么正确的方法是什么?

1 个答案:

答案 0 :(得分:1)

可以使用以下代码完成后台位置更新:

在Appdelegate课程中:

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