iOS-iBeacon靠近/离开推送

最近用到iBeacon进行室内定位,发现这东西可以在不打开app的情况下靠近/离开iBeacon设备发送本地推送,根据网上的一些iBeacon教程搞了一天发现并不能触发这个方法,然后各种翻谷歌、论坛解决掉了。

先记录一下iBeacon的基本使用

首先需要一个能发送iBeacon信号的蓝牙芯片或者设备(我用的是一台6s测试机,在AppStore上可以下载一些能发送iBeacon信号的app或者自己写一个)

先创建一个BeaconItem.swift的文件

import CoreLocation

class BeaconItem: NSObject {
    let majorValue: CLBeaconMajorValue
    let minorValue: CLBeaconMinorValue
    let name: String
    let uuid: UUID
    
    init(name: String, uuid: UUID,
         majorValue: CLBeaconMajorValue,
         minorValue: CLBeaconMinorValue) {
        self.name = name
        self.uuid = uuid
        self.majorValue = majorValue
        self.minorValue = minorValue
    }
}

这是把iBeacon设备的一些数据进行封装

然后在ViewController里面写入(记得要先去Info.plist填写获取CoreLocation相关权限)

import UIKit
import CoreLocation

class ViewController: UIViewController {
    let locationManager = CLLocationManager()
    let beaconItem = BeaconItem(name: "test", uuid: UUID(uuidString: "FDA50693-A4E2-4FB1-AFCF-C6EB07647825")!, majorValue: 0, minorValue: 0)

    override func viewDidLoad() {
        super.viewDidLoad()
        
        locationManager.requestAlwaysAuthorization()
        locationManager.delegate = self
        startMonitoring(item: item)
    }
    
    /// 根据BeaconItem对象创建CLBeaconRegion
    ///
    /// - Parameter item: BeaconItem
    /// - Returns: CLBeaconRegion
    func beaconRegionWith(item: BeaconItem) -> CLBeaconRegion {
        let beaconRegion = CLBeaconRegion(proximityUUID: item.uuid, major: item.majorValue, minor: item.minorValue, identifier: item.name)
        
        return beaconRegion
    }
    
    /// 监听指定的iBeacon设备
    ///
    /// - Parameter item: BeaconItem
    func startMonitoring(item: BeaconItem) {
        let beaconRegion = beaconRegionWith(item: item)
        locationManager.startMonitoring(for: beaconRegion)
        locationManager.startRangingBeacons(in: beaconRegion)
    }
}

extension ViewController: CLLocationManagerDelegate {

    // 检测iBeacon设备的回调
    func locationManager(_ manager: CLLocationManager, didRangeBeacons beacons: [CLBeacon], in region: CLBeaconRegion) {
        for beacon in beacons {
            // 可以获取iBeacon的uuid、major、minor、rssi还有距离
        }
    }
}
靠近/离开推送

通过上面的代码就可以运行监测指定的iBeacon设备的距离,但是如果想做到手机靠近则触发推送的话还需要做以下操作(配置推送这里不做介绍):

在AppDelegate.swift中加入以下内容

import CoreLocation

class AppDelegate: UIResponder, UIApplicationDelegate {

    let locationManager = CLLocationManager()

    func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {
        
        locationManager.delegate = self
        
        return true
    }

extension AppDelegate: CLLocationManagerDelegate {
    
    // 用户进入iBeacon范围调用
    func locationManager(_ manager: CLLocationManager, didEnterRegion region: CLRegion) {
        // 推送代码
    }
    // 用户离开iBeacon范围调用    
    func locationManager(_ manager: CLLocationManager, didExitRegion region: CLRegion) {
         // 推送代码
    }

}

网上的很多教程基本就这样,然后运行,拿着设备靠近、走开发现根本就不会调用那两个方法,查资料后发现漏了点东西,还需要在刚刚的ViewController里面

startMonitoring(item: item)

这句之前加上

CLLocationManager.isMonitoringAvailable(for: CLBeaconRegion.self)
CLLocationManager.authorizationStatus()

完整代码如下:

override func viewDidLoad() {
        super.viewDidLoad()
    
        locationManager.requestAlwaysAuthorization()
        locationManager.delegate = self
        CLLocationManager.isMonitoringAvailable(for: CLBeaconRegion.self)
        CLLocationManager.authorizationStatus()
        startMonitoring(item: item)
    }

现在运行就可以达到预想中的效果。

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 发现 关注 消息 iOS 第三方库、插件、知名博客总结 作者大灰狼的小绵羊哥哥关注 2017.06.26 09:4...
    肇东周阅读 15,540评论 4 61
  • 人生短暂,过去的成为回忆 如果可以,同学们多聚聚吧! 致同学情:老同学《乐都一中2000届7班》,好久不见! 也许...
    心随我远行阅读 891评论 0 0
  • 上一章-阿拓之忧 小说目录 第四十章-重获新生 说完,几个野人点点头。千风立即耐不住去扶起他们。心里想:如果不能把...
    冰寒三尺阅读 442评论 2 9
  • 其实真正在乎你的人随时都有时间主动找你。所以,不要为别人找理由,不要为自己找借口。整理心情需要一个过程,别心急,慢...
    泪言丫头阅读 225评论 0 0
  • 岁月蹉跎世事华, 笑脸长开如朝阳。 一步一印不轻踏, 亦有柔情似桃花。
    老苍的浮生阅读 146评论 0 0

友情链接更多精彩内容