CLProximityNear时显示后台通知



当我的应用程序在后台,设备进入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方法?

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

这取决于你的应用程序是否包含逻辑来确定新的信标是否可见,或者你是否已经通知了用户。我建议你存储一组以前发现的信标,每次调用locationManager:didRangeBeacons:inRegion时,你都会将列表与beacons参数的内容进行比较。然后你应该能够判断是否发现了任何新的信标。

多个通知可以这样解决:

如果只想发送一次通知,只需定义一个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秒的间隔就会开始。用户不太可能走得太快,以至于在你的应用程序进入睡眠状态前的5秒内进入"接近"状态。出于这个原因,当你在后台时,通常不可能根据特定的接近度采取特定的行动。

也就是说,如果你想在前台做这件事,如果你做出改变以防止通知每秒都来,这会很好。

最新更新