Objective c DidRange信标未显示任何信标设备

Objective c DidRange信标未显示任何信标设备,objective-c,xcode,ibeacon,Objective C,Xcode,Ibeacon,我是新来的灯塔编程 我继续搜索,得到了很多帮助,但有一点被卡住了 正如我的didRangeBeacons被调用一样,它总是为信标显示空数组 这是我的DidDiscovery的代码 - (void)centralManager:(CBCentralManager *)central didDiscoverPeripheral:(CBPeripheral *)peripheral advertisementData:(NSDictionary *)advertisementData RSSI:(NS

我是新来的灯塔编程

我继续搜索,得到了很多帮助,但有一点被卡住了

正如我的didRangeBeacons被调用一样,它总是为信标显示空数组

这是我的DidDiscovery的代码

- (void)centralManager:(CBCentralManager *)central didDiscoverPeripheral:(CBPeripheral *)peripheral advertisementData:(NSDictionary *)advertisementData RSSI:(NSNumber *)RSSI
{
    NSUUID *uuid = [[NSUUID alloc] initWithUUIDString:peripheral.identifier.UUIDString];

    self.beaconRegion = [[CLBeaconRegion alloc] initWithProximityUUID:uuid identifier:@"com.XXXXXX.beacon"];

    self.beaconRegion.notifyEntryStateOnDisplay = YES;

    [self.locationManager startMonitoringForRegion:self.beaconRegion];
    [self.locationManager startRangingBeaconsInRegion:self.beaconRegion];

    self.locationManager.delegate = self;
}
这是DidRange信标的代码

-(void)locationManager:(CLLocationManager *)manager didRangeBeacons:(NSArray *)beacons inRegion:(CLBeaconRegion *)region
{
CLBeacon *foundBeacon = [[CLBeacon alloc] init];
    foundBeacon = [beacons firstObject];
NSString *uuid = foundBeacon.proximityUUID.UUIDString;
     NSString *major = [NSString stringWithFormat:@"%@", foundBeacon.major];
     NSString *minor = [NSString stringWithFormat:@"%@", foundBeacon.minor];

     NSLog(@"%@",uuid);
     NSLog(@"%@",major);
     NSLog(@"%@",minor);
}
这总是给我空值。。 出什么问题了。
请帮助…

设备未检测到任何信标。行
foundBeacon=[beacons firstObject]
返回Nil,如果将代码更改为:

{
CLBeacon *foundBeacon = [beacons firstObject];
if (foundBeacon != Nil) {
   NSString *uuid = foundBeacon.proximityUUID.UUIDString;
   NSString *major = [NSString stringWithFormat:@"%@", foundBeacon.major];
   NSString *minor = [NSString stringWithFormat:@"%@", foundBeacon.minor];

   NSLog(@"%@",uuid);
   NSLog(@"%@",major);
   NSLog(@"%@",minor);
  }
  else {
    NSLog("No beacons detected");
  }
}
不清楚为什么不检测信标,但最常见的原因是用于开始测距的CLBeacon区域中的标识符与信标正在发送的不匹配。显示此设置代码可能会有所帮助

值得注意的是,显示的
didiscoverperipheral
代码不是检测信标所必需的,在基本信标检测中不起作用

更新:下面提问者的评论很关键:

我正在使用DidDiscoveryPeripheral方法查找可用的设备并获取这些UUID,然后设置,然后设置StartMonitoring for Region和StartTransingBeaconsisten Region。因为我不知道UUID是用于设备的


上述技术将不起作用,因为didiscoverperipal返回的UUID与信标proximityuid无关,即使两个UUID使用相同的字符串格式并且表面上看起来相似iOS中没有公共API可以在事先不知道的情况下获取信标的ProximityUID。有关更多信息,请参阅我的博客帖子:

问题是,您使用的是
外围设备。标识符
作为您正在测距和监视的信标区域的UUID

这是骗人的,因为它们都使用相同的版本4 UUID格式,但是外围UUIDiBeacon UUID是两个完全不同的东西:

  • 外围UUID标识特定的可扩展设备。然而,即使对于同一台设备,其外围UUID也会因iPhone而异,并且在您重新启动iPhone或蓝牙子系统后,也可能会发生变化

    您可以将其视为iPhone分配给BLE设备的短暂标识符,以便您可以在iPhone上的核心蓝牙通话之间识别它

    这是核心蓝牙子系统的一部分,用于任何非iBeacon-BLE设备

  • iBeacon UUID只是iBeacon设备广播的静态值。这对所有发现它的iPhone都是一样的,因为不太可能是外围UUID,这不是iPhone分配的东西,而是信标本身的属性

    在iOS方面,这是核心位置子系统的一部分,用于iBeacon

CLBeaconRegion
中,您需要使用信标的iBeacon UUID,而不是外围UUID。请咨询您的信标供应商,了解如何发现您的信标的iBeacon UUID。大多数供应商只是将预定义的静态值分配给他们生产的所有信标(但您通常可以将其更改为自己的)

请注意,您需要预先知道iBeacon UUID,才能发现具有该UUID的iBeacon。这是没有办法的



我也不清楚你为什么要启动iBeacon测距/监控来响应核心蓝牙扫描,除非你有非常具体的原因,你不需要这样做。您可以将所有代码移出
didDiscoveryPeripal
方法。

:-我正在使用didDiscoveryPeripal方法查找可用的BLE设备并获取这些UUID,然后设置,然后设置StartMonitoring for Region和StartRangingBeaconsisten Region。因为我不知道UUID是用于设备的…谢谢这个。。。但它总是进入else循环,导致“未检测到信标”。我明白了为什么不检测信标的问题。请查看我在回答中添加的编辑。感谢提供信息,但客户正在生产他们自己的BLE设备,我们必须连接到该设备。不知何故,我成功地检测到了BLE,并指出了您提到的要点,我现在确信外围UUID和iBeacons UUID是不同的。到目前为止,我们的Android团队正在获得另一个UUID,而我获得了不同的UUID。那么,有没有任何方法可以获得设备的准确UUID,使其对所有人都一样……?在iOS上,遗憾的是,没有,没有任何方法。核心蓝牙将只提供“短暂的”外围UUID,并过滤掉iBeacon UUID;而核心位置要求您预先知道iBeacon UUID。Android根本没有“外围UUID”,它只是直接给你iBeacon UUID,但不要求你事先知道它。