在 Ionic 框架移动应用中支持 iBeacons

   Ionic framework 构建的 Android 或 iOS 应用中使用 iBeacons

我最近购买了一些 Estimote IBeacons 模块玩,并想将它们接入到基于 Ionic Framework 创建的 Android 与 iOS 应用中。

如果你对 iBeacons 感到陌生,没关系,它其实是用于近距离数据传输的蓝牙设备。Estimote 模块的优点在于其低功耗和电池寿命,目前已经有很多制造商已经正在制造 Estimote 模块。iBeacons 通常可以以 100ms 到 1000ms 的间隔发送广播信息,其间隔因配置或其制造商不同而不同。iBeacons 发送的广播信息包括 UUID、主版本号和次版本号。

在开始讨论代码前,我分享些可以应用 iBeacons 的场景:

1.在博物馆通过特定 iBeacons 触发你的手机显示出一段文字或播放一段音频。将一个 iBeacons 放在意大利的大卫雕像旁,当人们靠近时,人们就可以得到这个作品的信息。

2.用来追踪你商店里的人流量。也许你拥有一个像沃尔玛一样大小的商店,在每个部门都安装有iBeacons,你可以通过它来查看哪个部门的人流量最多。

3.通过 iBeacons 技术,可以计算你在游乐园的排队等待时间。

iBeacons 的应用不只在这些场景。

到现在你应该对 iBeacons 有一些了解了,下面我们将讨论代码。假设在你的机器上已经有 Ionic,在终端或命令提示符里运行以下命令:
``
ionic start IonicBeacon blank
cd IonicBeacon
ionic platform add ios
ionic platform add android

如果你使用的不是 Mac,不要执行第三条命令。因为只有 Android 可以在 Linux 和 Windows 机器上运行。

插件我们使用 Peter Metz 的 cordova-plugin-ibeacan。在我写这个文档时,我可以获取的最新版本是 50315dbc。你也可以尝试使用新的版本。

打开终端或命令提示符,输入以下命令安装 IonicBeacon 插件:

cordova plugin add https://github.com/petermetz/cordova-plugin-ibeacon.git

下面我们可以开始编码了。因为 Peter Metz 的 iBeacon 插件是使用 JavaScript 编写的,在 Ionic 这并不是最好的方式。因此我们使用 AngularJS 封装了这个插件。封装后的 ng-cordova-beacon 可以在我的 GitHub 上下载。从 dist 目录下载 ng-cordova-beacon.min.js 并将它拷贝到你的工程的 www/js 目录下。

下一步,打开你的工程中 www/index.html 文件,并在 app.js 行之前添加以下 JavaScript 代码:
打开 www/js/app.js 文件并添加以下代码来引入 AngularJS:

angular.module('starter', ['ionic', 'ngCordovaBeacon'])
.run(function($ionicPlatform) {
$ionicPlatform.ready(function() {
if(window.cordova && window.cordova.plugins.Keyboard) {
cordova.plugins.Keyboard.hideKeyboardAccessoryBar(true);
}
if(window.StatusBar) {
StatusBar.styleDefault();
}
});
})
.controller("ExampleController", function($scope, $rootScope, $ionicPlatform, $cordovaBeacon) {
$scope.beacons = {};
$ionicPlatform.ready(function() {
$cordovaBeacon.requestWhenInUseAuthorization();
$rootScope.$on("$cordovaBeacon:didRangeBeaconsInRegion", function(event, pluginResult) {
var uniqueBeaconKey;
for(var i = 0; i < pluginResult.beacons.length; i++) {
uniqueBeaconKey = pluginResult.beacons[i].uuid + ":" + pluginResult.beacons[i].major + ":" + pluginResult.beacons[i].minor;
$scope.beacons[uniqueBeaconKey] = pluginResult.beacons[i];
}
$scope.$apply();
});
$cordovaBeacon.startRangingBeaconsInRegion($cordovaBeacon.createBeaconRegion("estimote", "b9407f30-f5f8-466e-aff9-25556b57fe6d"));
});
});

让我们看下这里发生了什么。

angular.module('starter', ['ionic', 'ngCordovaBeacon'])

首先我们需要将 ng-cordova-beacon 添加到 AngularJS 模块中。好了,我们可以按我们的想法去用它了。

在插件使用设备相关的代码前,我们需要在 $ionicPlatform.ready 接口中进行相关的设置。在 iOS 应用中,我们需要申请权限去访问本地服务,而 Android 应用则不必如此。

我们调用 $rootScope.$on 用来监测距离。如果我们接收到了 iBeacon,我们需要知道其距离我们有多远。我们也可以通过一个对象将广播信息显示到前端。

现在我们可以在一定范围广播我们消息了。如果你希望广播多个不同的消息,可以使用不同的配置多次调用下面代码,但我只想广播一个消息。其代码如下:

$cordovaBeacon.createBeaconRegion("estimote", "b9407f30-f5f8-466e-aff9-25556b57fe6d")



我选择使用具有可读性的描述符作为 estimote 的 UUID。UUID 中也可以包含主版本号与次版本号,但当你使用它们时需要使用通配符。你可以为每个 UUID 使用多个不同的主版本号与次版本号,这样你会得到多个结果。

最后我们要关心的是这个 APP 怎么在手机上显示出来。回到工程的 www/index.html 文件,将下面的代码加入到 <ion-content> 标签中:
            </div>
        </div>
        <div class="row">
            <div class="col">
                major:
            </div>
            <div class="col">
                minor:
            </div>
        </div>
        <div class="row">
            <div class="col">

            </div>
        </div>
    </div>
</div>
我使用的 Ionic 类中没有 truncate 方法,我们需要将其加上。打开 www/css/style.css 文件添加下面的代码:

.truncate {
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
}

因为我们使用 UUID 太长,不能完全的显示在屏幕上,过长的部分会被“...”代替。

![image](https://yqfile.alicdn.com/27e544314546b7aa97e828756fbb79b0935f34b2.png)

当我们的程序启动后探测到 iBeacons 时就会如上图一样的显示。

###结论

你可以使用 iBeacons 做很多有趣的事情,并且在 Ionic Framework 中的使用非常简单。你可以从Estimote下载开发工具,这里有很多兼容 Android 与 iOS 设备的版本。

可以通过下面的网址观看这个示例的视频:

https://youtu.be/PlDNPeG8iJo

**文章转载自 开源中国社区[https://www.oschina.net]**
时间: 2024-10-18 17:52:52

在 Ionic 框架移动应用中支持 iBeacons的相关文章

asp.net-微软最新版本ASP.NET的框架是否不完全支持SQL多表联接查询?

问题描述 微软最新版本ASP.NET的框架是否不完全支持SQL多表联接查询? 问题是这样的,我需要查询SQL数据库中多个表的字段,SQL查询语句如下式样: select t1.coid,t1.coname,t1.tel,t2.regid... from t1,t2,t3 where t1.coid=t2.regid and t1.userid='"+ userid+"' 试了很多次都报错说数据控件中没有't1'这样的属性. 我在网上搜索了一下,也有很多人说不支持这样的多表联接查询,只支

struts2.0-SSH框架搭建过程中,Struts2出现导包问题

问题描述 SSH框架搭建过程中,Struts2出现导包问题 SSH框架搭建过程中,控制台出现这个问题 Unable to load configuration. - bean - jar:file:/C:/Program%20Files/Apache%20Software%20Foundation/Tomcat%206.0/lib/struts2-core-2.3.16.3.jar!/struts-default.xml:98:128 Struts2支持包如下: C:Program FilesA

java struts2-怎样利用Java 中的struts2框架实现数据库中用户登录功能?

问题描述 怎样利用Java 中的struts2框架实现数据库中用户登录功能? 在Action中LoginAction怎样写? 配置文件中怎样写? 总体实现能够使数据库中已经存在的用户凭自己的密码与用户名登录成功呢?数据库是Oracle数据库.

如何控制网页框架页内中链接的目标

控制|链接|网页 如何控制网页框架页内中链接的目标 要在一个框架中使用链接以打开另一个框架中的文档,您必须设置链接目标.链接的 target 属性指定在其中打开链接的内容的框架或窗口. 例如,如果您的导航条位于左框架,并且您希望链接的材料显示在右侧的主要内容框架中,则您必须将主要内容框架的名称指定为每个导航条链接的目标.当访问者单击导航链接时,将在主框架中打开指定的内容. 若要设置目标框架,请执行以下操作: 在"设计"视图中,选择文本或对象. 在属性检查器("窗口"

ssh框架 application.xml中一个错误说我没有设着setter

问题描述 ssh框架 application.xml中一个错误说我没有设着setter 这是我的xml文件一部分 userdailService的get/set都写好了啊 下面是Useraction代码 package com.holy.action; import javax.servlet.http.HttpSession; import com.holy.service.*; import com.holy.modle.*; import org.apache.struts2.Servle

我在框架融合的中遇到一些问题!(DWR+EXT+Spring+mybatis )

问题描述 我在框架融合的中遇到一些问题!(DWR+EXT+Spring+mybatis ) 我的服务器是 WAS的 在服务器上的日志文件中,查看到这样输出. 输出:[16-1-15 9:53:35:449 CST] 00000070 SystemOut O 2016-01-15 09:53:35449 [INFO ]: 保存[16-1-15 9:53:35:449 CST] 00000070 ClassPathXmlA I org.springframework.context.support.

ssh框架搭建过程中的问题!

问题描述 ssh框架搭建过程中的问题!

MEF框架在Silverlight中应用(15)

原文:MEF框架在Silverlight中应用(15) MEF框架在Silverlight中应用 代码下载 MEF框架是微软提供的一个插件框架.应用概括为一句话:输入,输出,组合.下面是具体在Silverlight中应用中的关键代码. 步骤 1.Client端建立3个Silverlight项目.   MEFSilverLight4(主项目,组装部件)   SilverlightApplication1(部件)   SilverlightApplication2(部件) 2.Server建立一个测

xml-在用SSH框架开发项目中的XML配置

问题描述 在用SSH框架开发项目中的XML配置 对于我现在已经在项目开发中用到了SSH的框架,但是在项目开发过程中遇到的XML配置的问题,在XML配置文件中里面有太多的配置标签,有时会用到自己从来就没有见过的标签,又不知道它们该如何用,为什么要用?用了有啥好处?为了解决这个问题,我现在想请那位大神给我说一下,请把在SSH框架中以及SpringMVC的配置文件的总结的所有的属性以及属性值给我说一下.我好积累下来.以备以后工作中使用.谢谢! 解决方案 你这是想走捷径啊,自己慢慢积累吧.这东西 谁会给