менеджер местоположения работает всегда, но не когда используется - PullRequest
0 голосов
/ 15 сентября 2018

У меня есть приложение, которое прекрасно работало до того, как Apple настояла, чтобы пользователям был предоставлен выбор между «Всегда» и «При использовании» для Location Manager.Приложение использовало iBeacons для отправки приглашений играть в игры и принимать.
Когда выбрано «Всегда», маяки работают нормально, но когда я переключаюсь на «Когда используется», они вообще не работают.Я начал с «Всегда», но изменил следующий код, чтобы предоставить пользователям выбор.В листе приложения я добавил «Конфиденциальность-расположение всегда и описание использования при использовании» и «Конфиденциальность-местоположение при использовании описание использования» и удалил «Описание использования конфиденциальности-расположение всегда».

В приложении «Делегат I»иметь это

- (void)locationManager:(CLLocationManager *)manager
didChangeAuthorizationStatus:(CLAuthorizationStatus)status{

    if([CLLocationManager authorizationStatus]==kCLAuthorizationStatusAuthorizedAlways){
        NSLog(@"Always");
        AlertView2 = [[UIAlertView alloc] initWithTitle:@"Dual player on two devices is enabled."
                                                message:@"To save battery power go to Settings/Privacy/Location Services and choose \"Never\" when not using I'M GAME. Two people can still play on one device when in \"Never\" mode. To recieve invitations to play only when the app is open select \"When In Use\"."
                                               delegate:nil
                                      cancelButtonTitle:@"OK"
                                      otherButtonTitles:nil];
        [AlertView2 show];
        [[NSUserDefaults standardUserDefaults] setObject:@"YES" forKey:@"accessKey"];
        [[NSUserDefaults standardUserDefaults] synchronize];
    }
    if([CLLocationManager authorizationStatus]==kCLAuthorizationStatusAuthorizedWhenInUse){
        NSLog(@"WhenInUse");
        AlertView2 = [[UIAlertView alloc] initWithTitle:@"Dual player on two devices is enabled."
                                                message:@"To save battery power go to Settings/Privacy/Location Services and choose \"Never\" when not using I'M GAME. Two people can still play on one device when in \"Never\" mode. To recieve invitations to play while app is in background select \"Always\"."
                                               delegate:nil
                                      cancelButtonTitle:@"OK"
                                      otherButtonTitles:nil];
        [AlertView2 show];
        [[NSUserDefaults standardUserDefaults] setObject:@"YES" forKey:@"accessKey"];
        [[NSUserDefaults standardUserDefaults] synchronize];
    }
    if([CLLocationManager authorizationStatus]==kCLAuthorizationStatusRestricted){
        NSLog(@"restricted");
    }

    if([CLLocationManager authorizationStatus]==kCLAuthorizationStatusDenied){
        NSLog(@"denied");
        AlertView2 = [[UIAlertView alloc] initWithTitle:@"Dual player on a single device Only."
                                                message:@"To play on two devices go to Settings Privacy/Location Services and choose \"Always\" or \"When In Use\" for I'M GAME. In \"Always\" you can recieve invites while app is in background, in \"When In Use\" invites only appear when the app is on screen. To preserve battery choose \"Never\" when not using I'M GAME."
                                               delegate:nil
                                      cancelButtonTitle:@"OK"
                                      otherButtonTitles:nil];
        [AlertView2 show];
        [[NSUserDefaults standardUserDefaults] setObject:@"YES" forKey:@"accessKey"];
        [[NSUserDefaults standardUserDefaults] synchronize];

    }
    if([CLLocationManager authorizationStatus]==kCLAuthorizationStatusNotDetermined){
        NSLog(@"undetermined2");
         [locationManager requestAlwaysAuthorization];
       [locationManager requestWhenInUseAuthorization];
    }


}

Нужно ли в iBeacon для Privacy-Location установить «Always» для работы?

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

1 Ответ

0 голосов
/ 15 сентября 2018

Если ваше приложение авторизовано для измерения радиомаяка только тогда, когда оно находится на переднем плане, легко имитировать логику входа / выхода с помощью всего лишь didRangeBeacons обратного вызова.

  1. Настройка одной переменной класса:

    var beaconLastSeen: Date? = nil
    
  2. Добавьте этот код к вашему didRangeBeacons методу:

    if beacons.count > 0 {
      if beaconLastSeen == nil {
         // call didEnterRegion logic here
      }
      beaconLastSeen = Date()
    }
    else {
      if beconLastSeen != nil && Date() - beaconLastSeen > 30 {
         beaconLastSeen = nil
         // call didExitRegion logic here
      }
    }
    

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

РЕДАКТИРОВАТЬ: Вот тот же код в Задаче C:

NSDate *beaconLastSeen = nil;

...

if (beacons.count > 0) {
    if (beaconLastSeen == nil) {
        // call didEnterRegion logic here
    }
    beaconLastSeen = [[NSDate alloc] init];
}
else {
    if (beaconLastSeen != nil  && [[[NSDate alloc] init] timeIntervalSinceDate: beaconLastSeen] > 30 ) {
        beaconLastSeen = nil;
        // call didExitRegion logic here
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...