【问题标题】:Display background notification when CLProximityNearCLProximityNear 时显示背景通知
【发布时间】:2014-02-07 09:35:32
【问题描述】:

当我的应用程序在后台并且设备进入 iBeacon 的区域并且它们的 CLProximity 接近时,我尝试显示通知正在工作,但它仍然以 1 秒的间隔出现:

- (void)locationManager:(CLLocationManager *)manager didEnterRegion:(CLRegion *)region{
    NSLog(@"Entered beacon region");
    [self.locationManager startRangingBeaconsInRegion:self.beaconRegion];
}

- (void) locationManager:(CLLocationManager *)manager didExitRegion:(CLRegion *)region{
    NSLog(@"Left region");
    [self.locationManager stopRangingBeaconsInRegion:self.beaconRegion];
}

- (void) locationManager:(CLLocationManager *)manager didStartMonitoringForRegion:(CLRegion *)region {
    [self.locationManager startRangingBeaconsInRegion:self.beaconRegion];
}
- (void) locationManager:(CLLocationManager *)manager didRangeBeacons:(NSArray *)beacons inRegion:(CLBeaconRegion *)region {
    CLBeacon *beacon = [[CLBeacon alloc] init];
    beacon = [beacons lastObject];
    self.uuidLabel.text = beacon.proximityUUID.UUIDString;

    if(beacon.proximity == CLProximityUnknown) {
        distanceLabel.text = @"Unknown Proximity";
        [self.view setBackgroundColor:[UIColor grayColor]];
    } else if (beacon.proximity == CLProximityImmediate) {
        distanceLabel.text = @"Immediate";
        [self.view setBackgroundColor:[UIColor redColor]];
    } else if (beacon.proximity == CLProximityNear) {
        distanceLabel.text = @"Near";
        [self.view setBackgroundColor:[UIColor orangeColor]];
        UILocalNotification *inRange = [[UILocalNotification alloc] init];
        inRange.alertBody = [NSString stringWithFormat:@"Entered region!"];
        inRange.soundName = UILocalNotificationDefaultSoundName;
        [[UIApplication sharedApplication] presentLocalNotificationNow:inRange];
    } else if (beacon.proximity == CLProximityFar) {
        distanceLabel.text = @"Far";
        [self.view setBackgroundColor:[UIColor blueColor]];

    }
}

是否应该在显示通知后调用方法来告诉应用它已显示,并且在用户超出范围并再次进入之前不要继续调用 didRangeBeacons 方法?

【问题讨论】:

    标签: ios7 core-location ibeacon


    【解决方案1】:

    当测距信标时,locationManager:didRangeBeacons:inRegion 将每秒调用一次,正如您已确定的那样。每次,beacons 参数将包含所有可见信标的数组。

    由您的应用包含确定新信标是否可见或您是否已通知用户的逻辑。我建议您存储一组先前发现的信标,并且每次调用locationManager:didRangeBeacons:inRegion 时,您都将您的列表与beacons 参数的内容进行比较。然后您应该能够判断是否找到了任何新的信标。

    【讨论】:

      【解决方案2】:

      多个通知可以这样解决:

      如果您只想发送一次通知,只需定义一个alreadyDisplayed 标志,在发送通知后设置该标志,然后在发送前检查其值。

      像这样:

      BOOL alreadyDisplayed = NO;
      
      ...
      
      - (void) locationManager:(CLLocationManager *)manager didRangeBeacons:(NSArray *)beacons inRegion:(CLBeaconRegion *)region {
      
        ...
      
        else if (beacon.proximity == CLProximityNear) {
          distanceLabel.text = @"Near";
          if (!alreadyDisplayed) {
            [self.view setBackgroundColor:[UIColor orangeColor]];
            alreadyDisplayed = YES;
            UILocalNotification *inRange = [[UILocalNotification alloc] init];
            inRange.alertBody = [NSString stringWithFormat:@"Entered region!"];
            inRange.soundName = UILocalNotificationDefaultSoundName;
            [[UIApplication sharedApplication] presentLocalNotificationNow:inRange];
          }
        }
      
      ...
      
      }
      

      但你还有第二个问题:

      如果您想在 背景 中执行此操作,如您的问题标题所示,这根本行不通。问题是,在 iOS 检测到您的手机在后台进入 iBeacon 区域后,它只会让它运行五秒钟,然后将其置于睡眠状态。由于 iBeacon 的范围约为 50 米,因此最有可能的情况是,当您处于 50 米范围的边缘时,这五秒的间隔将开始。用户不太可能走得如此之快,以至于他们在您的应用程序进入睡眠状态之前的 5 秒内进入“Near”邻近区域。因此,当您在后台时,通常不可能根据特定的接近度采取特定的操作。

      也就是说,如果您想在前台执行此操作,如果您进行更改以阻止通知每秒发送一次,这将正常工作。

      【讨论】:

      • 那么最好先计算出用户何时越过边界,然后计算出他们跨过该区域之间经过了多长时间以确保是显示通知的适当时间?
      • 我不确定这是否有帮助。在后台,您的应用程序只会在越界后运行五秒钟。如果用户步行到“near”附近需要 15 秒,那么您的应用程序将不会运行,并且您根本无法显示通知。如果你等到下一次你的应用唤醒,那就太晚了。不幸的是,这是 iOS 上 iBeacons 的真正限制,我不相信有解决办法。要在特定距离触发,您的应用必须位于前台。
      猜你喜欢
      • 2018-01-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-08-16
      • 1970-01-01
      • 2021-08-30
      • 1970-01-01
      相关资源
      最近更新 更多