邻近 API 的行为不一致 - iOS iBeacon



我正在将iOS设备转换为iBeacon,然后使用核心位置的范围API来检测信标的接近度。现在, 这有效,但我看到一种不可预测的行为,有时在定义的距离(比如 10 米外)我看到没有信标有时远信标,有时在信标附近.

有没有办法使这种行为更加一致?

- (void)viewDidLoad {
    [super viewDidLoad];
    self.beaconSwitch.on = NO;
    self.beaconView.backgroundColor = [UIColor clearColor];
    self.peripheralManager = [[CBPeripheralManager alloc] initWithDelegate:self queue:nil];
    BeaconRegion *beaconRegion = [[BeaconRegion alloc] init];
    self.beaconRegion = [[CLBeaconRegion alloc] initWithProximityUUID:beaconRegion.uuid major:[beaconRegion.major shortValue] minor:[beaconRegion.minor shortValue] identifier:beaconIdentifier];
}

- (void)viewWillDisappear:(BOOL)animated {
    [super viewWillDisappear:animated];
    [self.peripheralManager stopAdvertising];
}

- (IBAction)doneButtonPressed:(id)sender {
    [self dismissViewControllerAnimated:YES completion:nil];
}
- (IBAction)beaconSwitchPressed:(id)sender {
    if (self.beaconSwitch.on == true) {
        self.beaconView.beaconState = BNBeaconStateBroadcasting;
        NSDictionary *data = [self.beaconRegion peripheralDataWithMeasuredPower:nil];
        [self.peripheralManager startAdvertising:data];
    } else {
        self.beaconView.beaconState = BNBeaconStateStop;
        [self.peripheralManager stopAdvertising];
    }
}

以下是我将iOS设备转换为信标的方法:

以下是我获得它接近的方式:

- (void)viewDidLoad {
    [super viewDidLoad];
    BeaconRegion *beaconRegion = [[BeaconRegion alloc] init];
    self.beaconRegion = [[CLBeaconRegion alloc] initWithProximityUUID:beaconRegion.uuid identifier:beaconIdentifier];
    self.beaconRegion.notifyOnEntry = YES;
    self.beaconRegion.notifyOnExit = YES;
    self.beaconRegion.notifyEntryStateOnDisplay = YES;
    self.locationManager = [[CLLocationManager alloc] init];
    self.locationManager.delegate = self;
    self.detectionSwitch.on = NO;
}
- (IBAction)beaconDetectionSwitchPressed:(id)sender {
    if (self.detectionSwitch.isOn) {
        [self.locationManager startMonitoringForRegion:self.beaconRegion];
        [self.locationManager requestStateForRegion:self.beaconRegion];
    } else {
        self.lastProximity = CLProximityUnknown;
        [self.locationManager stopMonitoringForRegion:self.beaconRegion];
        [self.locationManager stopRangingBeaconsInRegion:self.beaconRegion];
        self.titleLabel.text = @"";
        self.messageLabel.text = @"";
    }
}
- (void)viewWillDisappear:(BOOL)animated {
    [super viewWillDisappear:animated];
    [self.locationManager stopMonitoringForRegion:self.beaconRegion];
    [self.locationManager stopRangingBeaconsInRegion:self.beaconRegion];
    self.locationManager = nil;
}
- (void)locationManager:(CLLocationManager *)iManager didEnterRegion:(CLRegion *)iRegion {
    NSLog(@"Detected a beacon");
    if (![self.beaconRegion isEqual:iRegion]) {
        return;
    }
    NSLog(@"Entered into the beacon region = %@", iRegion);
    [self.locationManager startRangingBeaconsInRegion:self.beaconRegion];
}
- (void)locationManager:(CLLocationManager *)manager didRangeBeacons:(NSArray *)beacons inRegion:(CLBeaconRegion *)region {
    NSLog(@"Ranging beacon successful");
    if (beacons.count > 0) {
        CLBeacon *nearestBeacon = beacons[0];
        CLProximity currentProximity = nearestBeacon.proximity;
        if (currentProximity == self.lastProximity) {
            NSLog(@"No Change in Beacon distance");
        } else {
            self.lastProximity = currentProximity;
            [self updateUserAboutProximity];
        }
    } else {
        self.lastProximity = CLProximityUnknown;
    }
}

- (void)updateUserAboutProximity {
    NSString *title = @"--";
    NSString *message = @"--";
    switch (self.lastProximity) {
        case CLProximityUnknown:{
            title = @"No Beacon";
            message = @"There is no nearby beacon";
        }
            break;
        case CLProximityImmediate:{
            title = @"Immediate Beacon";
            message = @"You are standing immediate to video wall!";
        }
            break;
        case CLProximityNear:{
            if (self.isServerCallOn) {
                title = @"Near Beacon";
                message = @"You are standing near to video wall!";
            } else {
                title = @"Near Beacon";
                message = @"You are standing near to video wall! Initiating a server call.";
                if (!self.ignoreSeverCallTrigger) {
                    self.isServerCallOn = YES;
                    [self talkToServer];
                } else {
                    NSLog(@"Ignoring server call trigger");
                    message = @"Ignoring server call trigger!";
                }
            }
        }
            break;
        case CLProximityFar:{
            title = @"Far Beacon";
            message = @"You are standing far from video wall!";
        }
            break;
        default:
            break;
    }
    self.titleLabel.text = title;
    self.messageLabel.text = message;
}
- (void)locationManager:(CLLocationManager *)manager didDetermineState:(CLRegionState)state forRegion:(CLRegion *)region {
    if (state == CLRegionStateInside) {
        NSLog(@"Starting Ranging");
        [self.locationManager startRangingBeaconsInRegion:self.beaconRegion];
    }
}
- (void)locationManager:(CLLocationManager *)manager didChangeAuthorizationStatus:(CLAuthorizationStatus)status {
    if (![CLLocationManager locationServicesEnabled]) {
        NSLog(@"Location Service Not Enabled");
    }
    if ([CLLocationManager authorizationStatus] != kCLAuthorizationStatusAuthorizedAlways) {
        NSLog(@"Location Service Not Authorized");
    }
}

现在,我已经对接收信号强度指示器 (rssi) 值设置了一个条件,并在近邻中接受 -60>的任何值,以使距离更可预测。因此,在附近的附近,如果 rssi> -60,我也会触发我的操作。

相关内容

  • 没有找到相关文章

最新更新