Фоновый мониторинг CLRegion не выполняется

В настройках моего проекта> цель> Возможности у меня включены фоновые режимы с установленным флажком «Обновления местоположения».

введите здесь описание изображения

введите здесь описание изображения

AppDelegate

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

    self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];

    self.storyController = [StoryController sharedController];
    self.storyController.locationManager.delegate = self;

 ... etc initializing VC ...

- (void)locationManager:(CLLocationManager *)manager didEnterRegion:(CLRegion *)region {
    NSLog(@"entered region, %@", region.identifier);
    [self handleRegionEvent:region];
}

- (void)locationManager:(CLLocationManager *)manager didExitRegion:(CLRegion *)region {
    NSLog(@"exited region, %@", region.identifier);
    [self handleRegionEvent:region];
}

- (void)handleRegionEvent:(CLRegion *)region {
    NSLog(@"handle region");
    if ([UIApplication sharedApplication].applicationState ==
        UIApplicationStateActive) {
        NSLog(@"handle region local");
        UILocalNotification *n = [[UILocalNotification alloc] init];
        n.alertBody = @"LOCAL";
        n.soundName = @"Default"; //Coffee Man?
        [[UIApplication sharedApplication] presentLocalNotificationNow:n];
    } else {
        if ([[StoryController sharedController] readyForNextChapter]) {
            UILocalNotification *n = [[UILocalNotification alloc] init];
            n.alertBody = @"New ☕ Story";
            n.soundName = @"Default"; //Coffee Man?
            [[UIApplication sharedApplication] presentLocalNotificationNow:n];
        }
    }
}

StoryController

+ (id)sharedController {
    static StoryController *myController = nil;
    static dispatch_once_t token;
    dispatch_once(&token, ^{
        myController = [[StoryController alloc] init];
    });

    return myController;
}

- (id)init {
    self = [super init];
    self.locationManager = [[CLLocationManager alloc] init];
    NSLog(@"monitored regions: %@", self.locationManager.monitoredRegions);

Позже я отслеживаю регион с помощью:

CLCircularRegion *region = [[CLCircularRegion alloc] initWithCenter:g.coordinate radius:1000 identifier:"My Store"];
region.notifyOnEntry = true;
region.notifyOnExit = true;

NSLog(@"%d", [CLLocationManager authorizationStatus]);
[[[StoryController sharedController] locationManager] startMonitoringForRegion:region];

Я не получаю никаких уведомлений, когда выхожу или вхожу в радиус 1 км, когда приложение работает в фоновом режиме.

Как мне заставить это работать? Когда я выхожу из отслеживаемых регионов, я вижу, что широта и долгота верны.


person quantumpotato    schedule 19.01.2016    source источник


Ответы (1)


Две вещи, которые вам нужно сделать, чтобы убедиться, что вы делаете.

  1. проверка наличия мониторинга региона

  2. убедитесь, что ваш locationManager.authorizationStatus == .authorizedAlways

Некоторые системы просто не поддерживают мониторинг региона, а мониторинг региона никогда не будет работать, если ваш статус авторизации не равен .authorizedAlways, только тогда он может отслеживать в фоновом режиме.

https://developer.apple.com/library/content/documentation/UserExperience/Conceptual/LocationAwarenessPG/RegionMonitoring/RegionMonitoring.html

person Wink    schedule 01.11.2016