2017-01-09 1 views
0

Ich konvertiere ein iOS-Gerät in iBeacon und verwende dann die Location-API des Kernstandorts, um Beacon-Nähe zu erkennen. Nun, das funktioniert, aber ich sehe ein unberechenbares Verhalten wo manchmal in einer definierten Entfernung (sagen wir 10 Meter entfernt) ich manchmal Beacon manchmal Far Beacon und manchmal Beacon sehe.Inkonsistentes Verhalten durch Proximity-API - iOS iBeacon

Gibt es eine Möglichkeit, dieses Verhalten konsistenter zu machen?

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

Hier ist, wie ich meine iOS-Gerät in ein Leuchtfeuer am Umwandlung:

Und hier ist, wie ich die Nähe bin immer:

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

Antwort

0

Vorerst habe ich einen Zustand versetzt, auf empfangener Signalstärkeindikatorwert (rssi) und alles> -60 in naher Nähe annehmen, um die Entfernung etwas berechenbarer zu machen. Also, in der Nähe von Nähe trigger ich auch meine Aktion wenn rssi> -60.

Verwandte Themen