zoukankan      html  css  js  c++  java
  • iOS开发 关于iBeacon的一些记录

    最近时间一直在研究ibeacon所以把自己遇到的一些问题写下来做个笔记。

    参考资料:https://github.com/nixzhu/dev-blog/blob/master/2014-04-23-ios7-ibeacons-tutorial.md

    iBeacon是苹果被允许能在后台运行的,不论你将应用退出到后台还是杀死,iBeacon都能激活应用不过只能激活10秒左右,但是这段时间足可以做很多事情了。

    一.iBeacon的使用

    开始监听你的Ibeacon。

    在iOS8里面苹果改变了地位的开启方式(iBeacon的使用是基于蓝牙和定位的),首先要在工程里的info.plist增加字段NSLocationAlwaysUsageDescription(这个是允许一直在后台运行的)

    接着在程序里添加

    - (void)locationManager:(CLLocationManager *)manager didChangeAuthorizationStatus:(CLAuthorizationStatus)status

    {

    if (status == kCLAuthorizationStatusAuthorizedAlways) {

    [self.locationmanager startMonitoringForRegion:self.beacon1];

    }

    }

    .h文件

    #import<UIKit/UIKit.h>

    #import<CoreLocation/CoreLocation.h>

    #import<CoreLocation/CoreLocation.h>

    @interface ViewController : UIViewController<UITableViewDataSource,UITableViewDelegate,CLLocationManagerDelegate,>

    @property (nonatomic, strong) NSArray *beaconArr;//存放扫描到的iBeacon

    @property (strong, nonatomic) CLBeaconRegion *beacon1;//被扫描的iBeacon

    @property (strong, nonatomic) CLLocationManager * locationmanager;

    @end,,,

    .m文件

    #define BEACONUUID @"12334566-7173-4889-9579-954995439125"//iBeacon的uuid可以换成自己设备的uuid

    - (void)viewDidLoad {

    [super viewDidLoad];

    self.tableView = [[UITableView alloc] initWithFrame:CGRectMake(0, 20, 320, 400)];

    self.tableView.delegate = self;

    self.tableView.dataSource = self;

    [self.view addSubview:self.tableView];

    self.beaconArr = [[NSArray alloc] init];

    self.locationmanager = [[CLLocationManager alloc] init];//初始化

    self.locationmanager.delegate = self;

    self.beacon1 = [[CLBeaconRegion alloc] initWithProximityUUID:[[NSUUID alloc] initWithUUIDString:BEACONUUID] identifier:@"media"];//初始化监测的iBeacon信息

    [self.locationmanager requestAlwaysAuthorization];//设置location是一直允许

    }

    - (void)locationManager:(CLLocationManager *)manager didChangeAuthorizationStatus:(CLAuthorizationStatus)status{

    if (status == kCLAuthorizationStatusAuthorizedAlways) {

    [self.locationmanager startMonitoringForRegion:self.beacon1];//开始MonitoringiBeacon

    }

    }

    {

    //发现有iBeacon进入监测范围

    -(void)locationManager:(CLLocationManager *)manager didEnterRegion:(CLRegion *)region{

    [self.locationmanager startRangingBeaconsInRegion:self.beacon1];//开始RegionBeacons

    }

    //找的iBeacon后扫描它的信息

    - (void)locationManager:(CLLocationManager *)manager didRangeBeacons:(NSArray *)beacons inRegion:(CLBeaconRegion *)region{

    //如果存在不是我们要监测的iBeacon那就停止扫描他

    if (![[region.proximityUUID UUIDString] isEqualToString:BEACONUUID]){

    [self.locationmanager stopMonitoringForRegion:region];

    [self.locationmanager stopRangingBeaconsInRegion:region];

    }

    //打印所有iBeacon的信息

    for (CLBeacon* beacon in beacons) {

    NSLog(@"rssi is :%ld",beacon.rssi);

    NSLog(@"beacon.proximity %ld",beacon.proximity);

    ......

    }

    self.beaconArr = beacons;

    [self.tableView reloadData];

    }

    - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section

    {

    return self.beaconArr.count;

    }

    - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath

    {

    static NSString *ident = @"cell";

    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:ident];

    if (!cell) {

    cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:ident];

    }

    CLBeacon *beacon = [self.beaconArr objectAtIndex:indexPath.row];

    cell.textLabel.text = [beacon.proximityUUID UUIDString];

    NSString *str;

    switch (beacon.proximity) {

    case CLProximityNear:

    str = @"近";

    break;

    case CLProximityImmediate:

    str = @"超近";

    break;

    case CLProximityFar:

    str = @"远";

    break;

    case CLProximityUnknown:

    str = @"不见了";

    break;

    default:

    break;

    }

    cell.detailTextLabel.text = [NSString stringWithFormat:@"%@ %ld %@ %@",str,beacon.rssi,beacon.major,beacon.minor];

    return cell;

    }

    二.ibeacon的参数

    uuid唯一标识此类iBeacon。

    proximity远近范围的,有Near(在几米内),Immediate(在几厘米内),Far(超过 10 米以外,不过在测试中超不过10米就是far),Unknown(无效)

    major和minor组合后区分同一类型下的iBeacon。

    accuracy和iBeacon的距离

    rssi信号轻度为负值,越接近0信号越强,等于0时无法获取信号强度

    三.碎碎念

    当进入iBeacon范围是会触发didEnterRegion方法,此时可能获取不到iBeacon的rssi ,proximity,accuracy值因为距离有点远,所一要在此时做些动作和这三个参数有关的话需要小心。

  • 相关阅读:
    c 中 static 关键字的作用
    关于声明变量关键字 extern 的搜索知识点
    思考在路上-虚拟机redhat系统安装tools
    一个小程序猿思考之路-头文件中#ifndef/#define/#endif作用和用法
    const 修饰的小看点(自己积点小知识)
    用css3实现闪烁效果
    icon font
    跟踪对象属性值的修改, 设置断点(Break on property change)
    setTimeout(fn, 0)引发的JavaScipt线程的思考
    "float: left;" div 不换行显示
  • 原文地址:https://www.cnblogs.com/jyking/p/5126444.html
Copyright © 2011-2022 走看看