2017-01-09 7 views
0

iOSデバイスをiBeaconに変換してから、コアロケーションのレンジングAPIを使用してビーコンの近接を検出しています。さて、これはうまくいきますが、時には特定の距離(例えば10メートル離れたところ)で、時々遠くのビーコンと近くのビーコンが見える、予測できない現象が見られます。近接APIによる動作の不一致 - iOS iBeacon

この動作をより一貫させる方法はありますか?ここで

- (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"); 
    } 
} 

答えて

0

を、私は上の条件を入れています受信信号強度インジケータ(rssi)値を受信し、近傍を-60より大きい値に設定して距離を予測しにくくします。したがって、近くの近接内でも、rssi> -60の場合、私は自分の行動を引き起こします。