2015-09-22 3 views
0

Я работаю над передатчиком и приемником iBeacon. Я успешно выполнил часть передатчика, но в другой части приемник не распознал передаваемый сигнал. Может ли какой-либо орган помочь мне определить, где я ошибся? Есть ли что-то еще, что мне нужно добавить в .plist. Я попробовал ответы stackoverflow, но извините, что ничего не работал.iBeacon Receiver не распознает передаваемый сигнал

#import "ViewController.h" 

@interface ViewController() 

@end 

@implementation ViewController 

- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 
    // Do any additional setup after loading the view, typically from a nib. 

    // Initialize location manager and set ourselves as the delegate 
    self.locationManager = [[CLLocationManager alloc] init]; 
    self.locationManager.delegate = self; 

    // Create a NSUUID with the same UUID as the broadcasting beacon 
    NSUUID *uuid = [[NSUUID alloc] initWithUUIDString:@"A77A1B68-49A7-4DBF-914C-760D07FBB87B"]; 

    // Setup a new region with that UUID and same identifier as the broadcasting beacon 
    self.myBeaconRegion = [[CLBeaconRegion alloc] initWithProximityUUID:uuid identifier:@"xx.xxxxxx.xxxxxxxx"]; 

    // Tell location manager to start monitoring for the beacon region 
    [self.locationManager startMonitoringForRegion:self.myBeaconRegion]; 

    // Check if beacon monitoring is available for this device 
    if (![CLLocationManager isMonitoringAvailableForClass:[CLBeaconRegion class]]) { 

     UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Monitoring not available" message:nil delegate:nil cancelButtonTitle:@"Ok" otherButtonTitles: nil]; 
     [alert show]; 
     return; 
    } 
} 

- (void)didReceiveMemoryWarning 
{ 
    [super didReceiveMemoryWarning]; 
    // Dispose of any resources that can be recreated. 
} 

- (void)locationManager:(CLLocationManager*)manager didEnterRegion:(CLRegion *)region 
{ 
    // We entered a region, now start looking for our target beacons! 
    self.statusLabel.text = @"Finding beacons."; 
    [self.locationManager startRangingBeaconsInRegion:self.myBeaconRegion]; 
} 

-(void)locationManager:(CLLocationManager*)manager didExitRegion:(CLRegion *)region 
{ 
    // Exited the region 
    self.statusLabel.text = @"None found."; 
    [self.locationManager stopRangingBeaconsInRegion:self.myBeaconRegion]; 
} 

-(void)locationManager:(CLLocationManager*)manager 
     didRangeBeacons:(NSArray*)beacons 
       inRegion:(CLBeaconRegion*)region 
{ 
    // Beacon found! 
    self.statusLabel.text = @"Beacon found!"; 

    CLBeacon *foundBeacon = [beacons firstObject]; 

    // You can retrieve the beacon data from its properties 
    //NSString *uuid = foundBeacon.proximityUUID.UUIDString; 
    //NSString *major = [NSString stringWithFormat:@"%@", foundBeacon.major]; 
    //NSString *minor = [NSString stringWithFormat:@"%@", foundBeacon.minor]; 
} 

@end 

ответ

1

Вам необходимо спросить разрешения на использование Bluetooth.

Используйте requestAlwaysAuthorization (для местоположения фона) или requestWhenInUseAuthorization (на переднем плане).

Вам также нужен ключ NSLocationAlwaysUsageDescription или NSLocationWhenInUseUsageDescription в Info.plist с сообщением, которое будет отображаться в приглашении пользователю, например «Мне нужно ваше разрешение на доступ к Bluetooth» или что-то еще.

+0

Большое спасибо #playitgreen. он работал как шарм. Ты спас свой день. :) – Xplorer

+0

Добро пожаловать! Примите мой ответ, чтобы вопрос был «разрешен», – r4id4

0

В предыдущих версиях системы он автоматически уведомляет пользователя о разрешении на использование службы определения местоположения. В iOS 8 Apple обновила стратегию авторизации, которая требует вызова функции для запроса авторизации пользователя. Соответствующий SDK также предоставил альтернативную функцию.

1.requestAlwaysAuthorization Во-первых, требуется содержание уведомлений. При вызове функции система будет подталкивать этот абзац текста пользователю, если он/она не разрешат приложению использовать эту услугу. Возможно, вам понадобится добавить следующий ключ в Info.plist:

NSLocationAlwaysUsageDescription Между тем необходимо добавить письменное описание, без которого вызов функции будет недействительным. Во-вторых, вызовите функцию авторизации.

[locationManger requestAlwaysAuthorization];

0

Только сторона думала попробовать и отладить проблему (хотя из вашего кода все, кажется, написано правильно).

Во-первых, давайте посмотрим, есть ли у вас ошибка при инициализации вашего слушателя. Чтобы сделать это, позволяет реализовать эти делегаты и посмотреть, если вы получите ошибку здесь:

- (void)locationManager:(CLLocationManager *)manager didFailWithError:(NSError *)error 
- (void)locationManager:(CLLocationManager *)manager monitoringDidFailForRegion:(CLRegion *)region withError:(NSError *)error 

Во-вторых, осуществить ниже делегата, чтобы проверить, если менеджер место начала мониторинга вашего региона. Вы можете NSLog свой регион 'UUID и идентификатор, чтобы быть в полной уверенности.

- (void)locationManager:(CLLocationManager *)manager didStartMonitoringForRegion:(CLRegion *)region 

Далее, если вы перезвоните, тогда все будет хорошо на вашем слушателе. Попробуйте пару вещей сейчас:

  1. Действительно ли ваш вещатель транслирует?
  2. Если да, то он передает тот же UUID, который ожидает ваш слушатель.
  3. Если да, попробуйте отключить прослушиватель и вещатель. Перезагрузите устройство, а затем включите вещатель, а затем слушатель.

У меня есть опыт, управление местоположением не работает мгновенно. Например, как только вы обнаружили запись в регионе, если вы вышли из региона, вы можете не получить немедленный вызов, а затем, если вы снова войдете в тот же регион, не получив вызов выхода, вы не получите входной вызов. Я видел # 3, работая во многих ситуациях.

Кроме того, совет, который я не помню, откуда я попал :). Начните изменять свои маяки вместе с мониторингом. Иногда это дает лучшие результаты.

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