CLRegion фоновый мониторинг не происходит

В настройках моего проекта> target > Capabilities у меня включено фоновые режимы с проверкой "Обновления местоположения".

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

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

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-километровый диапазон с приложенным фоном.

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

1 ответ

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

  1. проверка доступности мониторинга региона

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

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

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

Другие вопросы по тегам