美文网首页互联网的世界菊花党ios学习
iOS开发 关于iBeacon的一些记录

iOS开发 关于iBeacon的一些记录

作者: 沙瓦迪卡 | 来源:发表于2015-03-04 13:08 被阅读17018次

    更新下 把我之前写的demo找到了放到git上面了 地址

    最近时间一直在研究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值因为距离有点远,所一要在此时做些动作和这三个参数有关的话需要小心。

    相关文章

      网友评论

      • Deps:有没有后台ibeacon发送信号的,我不需要接收
      • 加油fight:大神。设备名称和设备地址改如何获取 ,我下了LightBeacon里面有为什么我获取不到
      • 中秋梧桐语:ibeacon 可以持续使App保持唤醒吗?或者说一直接收到硬件发过来的数据
      • Dreamhai:楼主你好,能不能在不知道uuid的情况来扫描周围的ibeacon呢,这个只能是扫描确定uuid的ibeacon设备呀
        Dreamhai:@沙瓦迪卡 哦哦 好吧 已经找了好多 大部分都是说只能扫描到指定的uuid major等信息信息才行
        沙瓦迪卡:@Dreamhai 应该是可以的,当时用的测试APP是有的,我好久都没做这个了,你查查
      • 我的时代我开创:楼主在吗?问下
        扫描i beacon 调用
        [_locationManager startMonitoringForRegion:_iBR8];
        [_locationManager startRangingBeaconsInRegion:_iBR8];
        没反应 会是什么情况啊?
      • 我的时代我开创:这是根据uuid扫描吧?是不是一次最多只能扫描20个知道uuid的ibeacon啊,如果超过20个怎么扫描啊?
      • 6054a4da381e:怎么再不知道uuid的情况下,去扫描多个ibeacon的uuid啊
      • wokenshin:大哥,你的代码 第一个方法是写在哪个类里面的?
        介是阿姐:locationManager:(CLLocationManager *)manager didChangeAuthorizationStatus:(CLAuthorizationStatus)status 这个是CLLocationManagerDelegate的代理方法,CLLocationManager这个类有个delegate准守了CLLocationManagerDelegate协议,所以你就看你的LLocationManager在哪创建和设置代理了,你就把那个方法写在哪个类里面,还是根据你的需求写的吧,
      • 无心落残梦:qq 990219310 求作者帮助,我没法在app 退到后台获取周围的ibeacon数据
        码农斯密达:36172788@qq.com 求demo 谢谢大神
        无心落残梦:@沙瓦迪卡 大神,我真的哭了,根本不知道哪里出问题了 ,求帮助啊,3天了我都没有找到哪里错了,就是退到后台搜索不到周围的ibeacon 数据了,求助啊,在做不出来要被开了
        沙瓦迪卡:@无心落残梦 你是不按这个过程最多,再仔细核对下
      • 2226b11e91fb:2320339975@qq.com 求Demo 谢谢
      • 無中生有:我对着上面写的,怎么获取不到?可以发个Demo给我吗,谢谢了。499526944@qq.com
        贪妄:@Mr_悟空 你可以先下载个 玩转Beacon 扫描下附近的IBeacon,看下是不是UUID写错了;还有个可能就是代码中的设置问题,在手机进入IBeacon信号范围内时才能搜到附近设备
        Mr_悟空:@贪妄 我修改成了附近的uuid怎么还是收不到附近的设备啊
        贪妄:@轩辕暮云 UUID需要改下,改成你附近设备的UUID
      • 巴图鲁:膜拜
      • 抹茶不加糖:请问,可以获取到iBeacon的名字么
        d0ef92fc5493:在么 macAdress 怎么获取
        抹茶不加糖:@纠结的哈士奇 macAdress?我看苹果没给我这个参数啊
        纠结的哈士奇:@抹茶不加糖 可以 除了name,一般UUID、macAddress、major、minor都是可以取到的
      • 纠结的哈士奇:楼主 最后一句的描述,的确存在,我这边有时就会发生,比如在后台情况下,触发了区域回调,然后我立即去扫描设备,但是会发生扫描不到的情况,count=0,这时就会不准,不知道有没有人也发现这个问题,又是怎么解决的,望指教。。。
        纠结的哈士奇:@Pocket 不开启 always,是不能在后台模式收到通知的

        至于你说的你在plist加了这个权限,被问起了,你写清楚你的目的一般就行了

        我这边也加了这个权限,不过没收到apple的询问。
        Pocket:您好,我想问一下设备支持iBeacons,如果我项目不开启NSLocationAlwaysUsageDescription,还能在程序没启动或者后台休眠状态下检测到吗。因为上架的app被审核人员问及了NSLocationAlwaysUsageDescription使用目的。希望给予答复,谢谢!
        宁哈哈哈:@纠结的哈士奇 求demo啊1659918210@qq.com,谢谢
      • 纵横四海:同求demo 295876514@qq.com 谢谢了 :flushed:
      • 9d8bd178a546:楼主,- (void)locationManager:(CLLocationManager *)manager didRangeBeacons:(NSArray<CLBeacon *> *)beacons inRegion:(CLBeaconRegion *)region;// 我按照你说的 写的,打印出来 beacons 为空
        72fdcf2bb6be:我的也是空,请问是哪里的问题?
        宁哈哈哈:我也不触发
        淡默无痕:@9d8bd178a546为什么我这个代理方法都不触发的啊?
      • 站住二狗子:求demo 1123143614@qq.com
      • 小王子sl:我罩着博客写为什么获取不了ibeacon信息呢
        喔酃:@小王子sl 最近在做iBeacon能发个demo吗,547539226@qq.com,谢谢
        a4f514157622:@小王子sl你获取到了么
      • Ray_win:楼主 可以发下demo吗 877966129@qq.com 谢谢
      • 0x0F:您好,我想问一下,可不可以获取到iBeacon设备的UUID。
        0x0F:@潘柏信 我没获取到的,项目紧,没去研究蓝牙
        沙瓦迪卡:应该是可以的,获取到周围的设备用uuid去匹配,我好久都没弄这个了有点忘
        潘柏信:@Manloff 同问,你能获取到吗?
      • 6b9270bfa953:您好,我最近也在做ibeacon的相关,但是我是新手,英语也很差,能发您的demo到我的邮箱吗? 简单的就好 谢谢349872481@qq.com。
      • 尼枚哉:markdown里面代码块可以用```

      本文标题:iOS开发 关于iBeacon的一些记录

      本文链接:https://www.haomeiwen.com/subject/lointttx.html