2017-01-09 2 views
0

Je convertis un appareil iOS en iBeacon, puis j'utilise l'API de localisation de base pour détecter la proximité de la balise. Maintenant, cela fonctionne mais je vois un comportement imprévisible où parfois à une distance définie (disons 10 mètres plus loin) je vois No Beacon parfois Far Beacon et parfois Near Beacon.Comportement incohérent par proximité API - iOS iBeacon

Existe-t-il un moyen de rendre ce comportement plus cohérent?

- (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]; 
    } 
} 

Voici comment je suis en train de convertir mon appareil iOS dans une balise:

Et voici comment je reçois sa proximité:

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

Répondre

0

Pour l'instant, je mets une condition la valeur de l'indicateur de force du signal reçu (rssi) et l'acceptation de n'importe quoi> -60 dans la proximité de proximité pour rendre la distance un peu plus prévisible. Donc, à proximité proximité également, je déclenche mon action si rssi> -60.