gpt4 book ai didi

ios - 监控 2 个或更多区域时出现 iBeacons 问题

转载 作者:塔克拉玛干 更新时间:2023-11-02 08:00:51 26 4
gpt4 key购买 nike

在我的 iBeaconReceiver 应用程序中,我试图监控超过 1 个区域,并且我使用了这段代码

- (void)viewDidLoad
{
[super viewDidLoad];

// Initialize location manager and set ourselves as the delegate and beacons dictionary
_beacons = [[NSMutableDictionary alloc] init];
self.locationManager = [[CLLocationManager alloc] init];
self.locationManager.delegate = self;

self.myBeaconRegion = [[CLBeaconRegion alloc] initWithProximityUUID:[[NSUUID alloc] initWithUUIDString:@"6C1AA496-1653-403D-BD1E-7F630AA6F254"] major: 1 minor: 1 identifier: @"region1"];

self.myBeaconRegion2 = [[CLBeaconRegion alloc] initWithProximityUUID:[[NSUUID alloc] initWithUUIDString:@"6C1AA496-1653-403D-BD1E-7F630AA6F254"] major: 1 minor: 2 identifier: @"region2"];

NSLog(@"startMonitoring");
// Tell location manager to start monitoring for the beacon region
[self.locationManager startMonitoringForRegion:self.myBeaconRegion];
[self.locationManager startMonitoringForRegion:self.myBeaconRegion2];

_myBeaconRegion.notifyEntryStateOnDisplay = YES;
_myBeaconRegion2.notifyEntryStateOnDisplay = YES;


// Check if beacon monitoring is available for this device
if (![CLLocationManager isMonitoringAvailableForClass:[CLBeaconRegion class]]){
UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Monitoring not available" message:nil delegate:nil cancelButtonTitle:@"Ok" otherButtonTitles: nil]; [alert show]; return;
}

}

然后我开始寻找信标

- (void)locationManager:(CLLocationManager*)manager didDetermineState:(CLRegionState)state forRegion:(CLRegion *)region
{
if(state == CLRegionStateInside)
{
if([region.identifier isEqualToString:@"region1"])
[self.locationManager startRangingBeaconsInRegion:self.myBeaconRegion];
else if ([region.identifier isEqualToString:@"region2"])
[self.locationManager startRangingBeaconsInRegion:self.myBeaconRegion2];
}
}

现在这是我的问题,我创建了一个简单的 UITableView 以这种方式显示我设备范围内的信标

-(void)locationManager:(CLLocationManager*)manager
didRangeBeacons:(NSArray*)beacons
inRegion:(CLBeaconRegion*)region
{
//NSLog(@"didRangeBeacons");
[_beacons removeAllObjects];

NSArray *immediateBeacons = [beacons filteredArrayUsingPredicate:[NSPredicate predicateWithFormat:@"proximity = %d", CLProximityImmediate]];
if([immediateBeacons count])
[_beacons setObject:immediateBeacons forKey:[NSNumber numberWithInt:CLProximityImmediate]];

NSArray *nearBeacons = [beacons filteredArrayUsingPredicate:[NSPredicate predicateWithFormat:@"proximity = %d", CLProximityNear]];
if([nearBeacons count])
[_beacons setObject:nearBeacons forKey:[NSNumber numberWithInt:CLProximityNear]];

NSArray *farBeacons = [beacons filteredArrayUsingPredicate:[NSPredicate predicateWithFormat:@"proximity = %d", CLProximityFar]];
if([farBeacons count])
[_beacons setObject:farBeacons forKey:[NSNumber numberWithInt:CLProximityFar]];

[self.tableView reloadData];

}

使用 _beacons 字典。这是我的场景:

首先,我必须说我正在使用 iPad 作为 iBeacon 天线,能够交替广播 region1region2

  1. 开始广播region1,一切正常,我的UITableView中填满了那个beacon的UUID
  2. 停止广播 region1,启动 region2,一切正常,我的 UITabelView 现在显示 region2 UUID
  3. 停止region2并返回广播region1UITableView是空的!找不到信标
  4. 停止 region1 并重新启动 region2 现在 region2 UUID 显示在我的 UITableView 中。从这一点开始,只有 region2 被我的应用监听,PLUS 我的 UITableView 颤抖(意思是它不稳定)!!!,好像每半秒它会重新加载所有 UI(例如在第 1 点和第 2 点中不会发生的事情)

我已经阅读了一些关于这个问题的帖子,用户通过为每个区域使用不同的标识符解决了问题,但我想我使用的是不同的标识符,所以我不明白问题出在哪里!看起来每当它进入 region2 时就会忘记 region1

提前致谢

最佳答案

问题是 locationManager: didRangeBeacons: inRegion: 方法会针对您测距的每个区域独立调用。因此,当 iOS 在这两个区域提供有关信标的信息时,该方法将每秒为每个区域调用一次。

这是代码显示的问题,因为行 [_beacons removeAllObjects] 将在每次回调开始时清除字典。考虑其中一个回调可以包含一个空的信标数组。当对两个区域进行测距时,调用的时间是不确定的。因此,您可能会收到一个带有信标列表的回调,显示它,然后在几分之一秒后收到另一个带有空 beacons 数组的回调,导致第一个数组永远不会显示。同样,当两个区域都显示信标时,显示可能会闪烁,具体取决于回调的时间。

解决方案是不要在每次回调开始时清除字典。相反,您必须维护一个不同的字典,其中包含最后一次看到每个信标的时间的时间戳,并定期删除任何信标几秒钟后您的显示器上还没有看到。

关于ios - 监控 2 个或更多区域时出现 iBeacons 问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23590703/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com