2015-10-30 3 views
0

Я купил несколько iBeacons, и я последовал учебнику, чтобы попытаться их обнаружить (http://ibeaconmodules.us/blogs/news/14279747-tutorial-ibeacon-app-development-with-corelocation-on-apple-ios-7-8).Невозможно обнаружить iBeacons в iOS9. Продолжайте получать CLRegionStateOutside

Не работает.

locationManager: (CLLocationManager *) manager didRangeBeacons всегда будет возвращать пустой массив.

Если я немного подправить код, согласно ответу этого вопроса (locationManager:didEnterRegion not called when a beacon is detected), я буду продолжать получать CLRegionStateOutside

Одна вещь, чтобы принять к сведению, что я нашел UDID мой маяк мой загрузив приложение 3 участника Светло-синий. И это приложение Light Blue может исправить распознавание всех моих маяков.

Еще одна вещь, которую следует обратить внимание, это то, что я понятия не имею, что мне помещать в поле идентификатора, поэтому я просто набрал строку, которая вставлена ​​вне физического маяка.

Это код:

- (void) locationManager:(CLLocationManager *)manager didStartMonitoringForRegion:(CLRegion *)region 
    { 
     NSLog(@"did start monitoring"); 
     [self.locationManager requestStateForRegion:self.beaconRegion]; 
    } 

    -(void)locationManager:(CLLocationManager *)manager didDetermineState:(CLRegionState)state forRegion:(CLRegion *)region 
    { 
     if (state == CLRegionStateInside) 
     { 
      //Start Ranging 
      NSLog(@"inside, start ranging"); 
      [manager startRangingBeaconsInRegion:self.beaconRegion]; 
     } 
     else 
     { 
      NSLog(@"outside, stop ranging"); 
      //Stop Ranging here 
     } 
    } 

    - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions 
    { 
     // Override point for customization after application launch. 
     NSUUID *beaconUUID = [[NSUUID alloc] initWithUUIDString:@"9B2D1BB8-25AA-8EE5-2513-7C140B6B1801"]; 
     NSString *regionIdentifier = @"MiniBeacon_04193"; 
     CLBeaconRegion *beaconRegion = [[CLBeaconRegion alloc] initWithProximityUUID:beaconUUID 
                       major:0 minor:0 identifier:regionIdentifier]; 
     self.beaconRegion = beaconRegion; 
     self.beaconRegion.notifyOnEntry=YES; 
     self.beaconRegion.notifyOnExit=YES; 
     self.beaconRegion.notifyEntryStateOnDisplay=YES; 

     switch ([CLLocationManager authorizationStatus]) { 
      case kCLAuthorizationStatusAuthorizedAlways: 
       NSLog(@"Authorized Always"); 
       break; 
      case kCLAuthorizationStatusAuthorizedWhenInUse: 
       NSLog(@"Authorized when in use"); 
       break; 
      case kCLAuthorizationStatusDenied: 
       NSLog(@"Denied"); 
       break; 
      case kCLAuthorizationStatusNotDetermined: 
       NSLog(@"Not determined"); 
       break; 
      case kCLAuthorizationStatusRestricted: 
       NSLog(@"Restricted"); 
       break; 

      default: 
       break; 
     } 

     self.locationManager = [[CLLocationManager alloc] init]; 
     if([self.locationManager respondsToSelector:@selector(requestAlwaysAuthorization)]) { 
      [self.locationManager requestAlwaysAuthorization]; 
     } 
     self.locationManager.delegate = self; 
     self.locationManager.pausesLocationUpdatesAutomatically = NO; 
     [self.locationManager startMonitoringForRegion:beaconRegion]; 
     return YES; 
    } 

    -(void)locationManager:(CLLocationManager *)manager didEnterRegion:(CLRegion *)region { 
     [manager startRangingBeaconsInRegion:(CLBeaconRegion*)region]; 
     [self.locationManager startUpdatingLocation]; 

     NSLog(@"You entered the region."); 
     [self sendLocalNotificationWithMessage:@"You entered the region."]; 
    } 

    -(void)locationManager:(CLLocationManager *)manager didExitRegion:(CLRegion *)region { 
     [manager stopRangingBeaconsInRegion:(CLBeaconRegion*)region]; 
     [self.locationManager stopUpdatingLocation]; 

     NSLog(@"You exited the region."); 
     [self sendLocalNotificationWithMessage:@"You exited the region."]; 
    } 

    -(void)sendLocalNotificationWithMessage:(NSString*)message { 
     UILocalNotification *notification = [[UILocalNotification alloc] init]; 
     notification.alertBody = message; 
     [[UIApplication sharedApplication] scheduleLocalNotification:notification]; 
    } 

    -(void)locationManager:(CLLocationManager *)manager didRangeBeacons:(NSArray *)beacons inRegion:(CLBeaconRegion *)region { 
     NSString *message = @""; 

     IMViewController *viewController = (IMViewController*)self.window.rootViewController; 
     viewController.beacons = beacons; 
     [viewController.tableView reloadData]; 

     if(beacons.count > 0) { 
      CLBeacon *nearestBeacon = beacons.firstObject; 
      if(nearestBeacon.proximity == self.lastProximity || 
       nearestBeacon.proximity == CLProximityUnknown) { 
       return; 
      } 
      self.lastProximity = nearestBeacon.proximity; 

      switch(nearestBeacon.proximity) { 
       case CLProximityFar: 
        message = @"You are far away from the beacon"; 
        break; 
       case CLProximityNear: 
        message = @"You are near the beacon"; 
        break; 
       case CLProximityImmediate: 
        message = @"You are in the immediate proximity of the beacon"; 
        break; 
       case CLProximityUnknown: 
        return; 
      } 
     } else { 
      message = @"No beacons are nearby"; 
     } 

     NSLog(@"%@", message); 
     [self sendLocalNotificationWithMessage:message]; 
    } 

ответ

3

Проблема заключается в том, что код не ищет правильный ProximityUUID маяка. Код 9B2D1BB8-25AA-8EE5-2513-7C140B6B1801 UUID в коде, созданном из приложения Light Blue, не является ProximityUUID, необходимым для обнаружения iBeacons.

Поймите, что существует много видов UUID. Приложение Light Blue обнаружит UUID для службы Bluetooth, но не обнаружит iBeacon ProximityUUID. В то время как поверхностно выглядят одинаково, они имеют разные значения и значения. Возможно, что UUID службы Bluetooth, который вы сканировали с помощью Light Blue, исходил от маяка, но он пока не работает в показанном коде, потому что это не правильный ProximityUUID.

Как вы узнаете, что ваш маячок ProximityUUID? Несколько вариантов:

  1. Спрашивайте у производителя или используйте служебную программу настройки производителя.

  2. Используйте dedicated beacon scanner for Android, OSX или Linux, который позволяет вам видеть любой маяк независимо от ProximityUUID. К сожалению, iOS только позволяет вам видеть маяки, если вы знаете ProximityUUID спереди.

После того, как вы знаете ProximityUUID, просто замените значение вместо 9B2D1BB8-25AA-8EE5-2513-7C140B6B1801 показано на рисунке.

+0

awesome. Спасибо большое! – mkto

Смежные вопросы