【iOS】iBeacon使用

1、简介

iBeacon设备是基于蓝牙进行广播的,通过发送广播信号,附近的用户当进入到设备附近的范围区域,即可通过手机与之交互。在iOS开发中,要让iBeacon设备与手机交互开发不是使用CoreBlueTooth库提供的API,而是CoreLocation库,具体来说用的类有CLLocationManager、CLBeaconRegion和CLBeacon类。

2、开发要点

  • 用户权限

       开发iBeacon,需要用户开启定位权限,在笔者实际试验中发现,用户必须开启“始终”权限。用户选择:“永不”和“在使用期间”都不行。具体代码是调用:requestAlwaysAuthorization方法

常用流程

  • 初始化CLLocationManager对象
- (CLLocationManager *)locationManager
{
    if (!_locationManager) {
        _locationManager = [[CLLocationManager alloc] init];
        _locationManager.delegate = self;
    }
    
    return _locationManager;
}
  • 初始化CLBeaconRegion对象,并且开启区域扫描
CLBeaconRegion *beaconRegion = [[CLBeaconRegion alloc] initWithProximityUUID:[[NSUUID alloc] initWithUUIDString:self.regionDictionary[key]] identifier:key];
        // 调用startMonitoringForRegion后,
        // 将执行代理方法;locationManager:didStartMonitoringForRegion
        [self.locationManager startMonitoringForRegion:beaconRegion];
  • 扫描后依次执行下面的代码方法。

用户调用requestStateForRegion后,就可以获取扫描区域的状态

#pragma mark - CLLocationMangerDelegate - ibeacom
- (void)locationManager:(CLLocationManager *)manager didStartMonitoringForRegion:(CLRegion *)region
{
    // 调用requestStateForRegion后将执行代理方法:
    // locationManager:didDetermineState:forRegion
    [manager requestStateForRegion:region];
}


- (void)locationManager:(CLLocationManager *)manager didDetermineState:(CLRegionState)state forRegion:(CLRegion *)region
{
    if ([region isKindOfClass:[CLBeaconRegion class]] && state == CLRegionStateInside) {
        [self locationManager:manager didEnterRegion:region];
    }
}

- (void)locationManager:(CLLocationManager *)manager didEnterRegion:(CLRegion *)region{
    // when devie enter region
    NSLog(@"didEnterRegion--->%@",region);
    if (region.identifier.length != 0) {
        if (@available(iOS 13.0, *)) {
//            CLBeaconRegion *beaconRegion = [[CLBeaconRegion alloc] initWithUUID:[[NSUUID alloc] initWithUUIDString:self.regionDictionary[region.identifier]] identifier:region.identifier];
//            [self.locationManager startRangingBeaconsInRegion:beaconRegion];
        } else {
            // Fallback on earlier versions
        }
    }
}

- (void)locationManager:(CLLocationManager *)manager didExitRegion:(CLRegion *)region
{
    // when devie leave region
    NSLog(@"didExitRegion--->%@",region);
    if (region.identifier.length != 0) {
        if (@available(iOS 13.0, *)) {
//            CLBeaconRegion *beaconRegion = [[CLBeaconRegion alloc] initWithUUID:[[NSUUID alloc] initWithUUIDString:self.regionDictionary[region.identifier]] identifier:region.identifier];
//            [self.locationManager stopRangingBeaconsInRegion:beaconRegion];
        } else {
            // Fallback on earlier versions
        }
        
    }
}

- (void)locationManager:(CLLocationManager *)manager didRangeBeacons:(NSArray *)beacons inRegion:(CLBeaconRegion *)region{
    
    if (beacons.count>0) {
        NSString *scanRst = @"";
        self.myBeacon = beacons.firstObject;
        if (@available(iOS 13.0, *)) {
//            scanRst = self.myBeacon.UUID.UUIDString;
//            NSLog(@"UUID:%@,major:%@,minor:%@",
//                  self.myBeacon.UUID.UUIDString,self.myBeacon.major,self.myBeacon.minor);
        } else {
            // Fallback on earlier versions
            scanRst = self.myBeacon.proximityUUID.UUIDString;
            NSLog(@"UUID:%@,major:%@,minor:%@",
                  self.myBeacon.proximityUUID.UUIDString,self.myBeacon.major,self.myBeacon.minor);
        }
    }
}

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

上面的注释描述了获取iBeacon设备的UUID.APP获取到UUID后进行一些业务的处理。

另外,APP可以通过下面的代理方法获取用户权限的变化。

- (void)locationManager:(CLLocationManager *)manager didChangeAuthorizationStatus:(CLAuthorizationStatus)status
{
    switch (status) {
        case kCLAuthorizationStatusNotDetermined:
            NSLog(@"kCLAuthorizationStatusNotDetermined");
            break;
            
        case kCLAuthorizationStatusRestricted:
            NSLog(@"kCLAuthorizationStatusNotDetermined");
            break;
            
        case kCLAuthorizationStatusDenied:
            NSLog(@"kCLAuthorizationStatusDenied");
            break;
            
        case kCLAuthorizationStatusAuthorizedAlways:
            NSLog(@"kCLAuthorizationStatusAuthorizedAlways");
            break;
            
        case kCLAuthorizationStatusAuthorizedWhenInUse:
            NSLog(@"kCLAuthorizationStatusAuthorizedWhenInUse");
            break;
            
        default:
            break;
    }
}

 

你可能感兴趣的:(iOS)