Estimote室内SDK 3.0.0-alpha.2

Estimote室内SDK 3.0.0-alpha.2

测试已测试
语言语言 Obj-CObjective C
许可证 自定义
发布上次发布2017年11月

Agnieszka KaczmarczykWiktor GworekGrzegorz Krukiewicz-GacekMichal SznajderMycekMarek SyldatkMarcin KlimekMichal Stechly维护。



Estimote室内SDK 3.0.0-alpha.2

Estimote室内定位SDK

Estimote室内定位SDK可以允许基于实时信标的地图和室内定位。

我们知道,构建下一代具有上下文感知能力的手机应用不仅仅需要iBeacon™硬件。这就是我们构建了更智能的软件,它抽象出理解特定空间中接近度和位置难度的原因。

Estimote室内定位是一个高级的软件解决方案,它使得绘制任何地点变得非常容易且快速。一旦完成,您可以使用我们的SDK来实时地在自己的应用中可视化该空间内的近似位置。

室内定位创建了一个丰富的画布,可以在此基础上构建强大的新移动体验,从场所分析到接近度营销,无缝支付和个性化购物。

Estimote室内定位仅与Estimote信标一起工作。

了解更多

目录

室内定位是如何工作的?

室内定位SDK允许通过构建器创建位置,并从位置获取位置更新。除了定位构建器之外,还有通过Estimote室内定位应用程序映射位置的选项。

映射过程很简单。首先,你需要映射形状。开始时,请绕着地点走,尽可能地靠近外围。记住将手机放在眼前以便正确映射位置。现在应用程序将建议信标数量和放置位置。将它们粘贴在墙壁上,处于胸高位置。完成过程后,再次绕着地点走一圈(再次将手机放在眼前)。在沿途的每个信标处停下来,以完成这次一次性配置过程。

YouTube上有@phillydev716制作的一个很好的视频教程,介绍了如何在您的应用程序中使用室内定位(请注意,该视频教程使用的是我们SDK的旧版本(v.1.6))

Video describing Estimote Indoor Location

安装

SDK作为EstimoteIndoorSDKCocoaPods中可用。安装只需将以下行放入您的Podfile中。

pod 'EstimoteIndoorSDK'

或者您可以手动添加SDK

  1. 将EstimoteIndooLocationSDK目录(包含libEstimoteIndoorLocationSDK.a、头文件和资源)拖放到Xcode项目中的项目中。确保选中了“如果需要则复制项目”复选框。

  2. 如果您在项目中尚未使用EstimoteSDK,请将EstimoteSDK框架添加到项目中。这是您的目录结构应如下所示

    ScreenShot LinkWithBinaryLibraries

  3. 打开您的项目设置并转到“构建阶段”标签。在“链接到二进制库”部分中,点击"+"按钮,并添加以下由EstimoteIndoorLocationSDK需要的框架

    • CoreMotion.framework
    • AudioToolbox.framework
    • MediaPlayer.framework
    • MessageUI.framework
    • libz.tbd

    当您已经在这个标签页上时,请双检查libEstimoteIndoorSDK.a是否包含在“链接到二进制库”列表中。在步骤1中,当将EstimoteIndooLocationSDK目录复制到项目中时,这应该已经自动发生。如果不小心没有发生,请将项目导航器中的libEstimoteIndoorSDK.a文件从拖放到列表中。

  4. 转到“构建设置”,找到“其他链接器标志”并添加-lc++。另外,将启用位码设置为NO

  5. 就是这样!到此为止,您的项目应该可以成功编译,您应该可以开始使用EstimoteIndoorLocationSDK了。

  6. 如果您正在编写Swift代码,还需要进行一个额外的步骤:向Swift添加Bridging头文件以暴露Objective-C头文件。

    为此,首先将新文件添加到项目中——使其成为一个《头文件》,并命名为YourProjectName-Bridging-Header.h。在此文件中,您需要导入以下EstimoteIndoorLocationSDK和EstimoteSDK头文件

    #import "EILIndoorLocationManager.h"
    #import "EILLocation.h"
    #import "EILIndoorLocationView.h"
    #import "EILLocationBuilder.h"
    

    所有这些完成后,您的Bridging头文件可能看起来像这样

    ScreenShot BridgingHeader

    最后,在项目导航器中点击您的项目根项,并转到《构建设置》标签。确保选中所有,然后查找《Objective-C Bridging Header》并将其设置为$(PROJECT_DIR)/YourProjectName/YourProjectName-Bridging-Header.h。现在您可以开始了!

关键概念

请注意,Estimote室内定位使用的是笛卡尔坐标系,这与iOS坐标系不同。

位置代表一个物理位置。这是一系列点构成的一个简单多边形。

位置有一个名为方向的属性,表示磁北和向量[0, 1]的顺时针角度。以下图像为图形描述

What is orientation?

位置边界的线段上可以放置门、窗户等,称为线性对象

使用方式

设置新位置

设置新位置有两种方法。您可以使用 ESTIndoorLocationBuilder,作为手动工具,或者使用Estimote App 并从云中获取位置。

手动使用 EILLocationBuilder

您可以选择手动创建一个 EILLocation。为此,可以使用 EILLocationBuilder 类。

为了构建一个新位置,您需要

  • 设置位置形状及其方向
  • 在边界段上添加详细信息,例如信标、墙壁、门

位置形状由其边界点定义。例如,考虑由点 (0,0),(0,5),(5,5),(5,0) 定义的正方形,以及其相对于磁北的方向。

EILLocationBuilder *locationBuilder = [EILLocationBuilder new];
[locationBuilder setLocationBoundaryPoints:@[
[EILPoint pointWithX:0 y:0],
[EILPoint pointWithX:0 y:5],
[EILPoint pointWithX:5 y:5],
[EILPoint pointWithX:5 y:0]]];

[locationBuilder setLocationOrientation:0];

定义位置形状的点也定义了其边界段。它们按与点相同的顺序索引。在这个例子中,将会有以下4个段:[(0,0),(0,5)],[(0,5),(5,5)],[(5,5),(5,0)],[(5,0),(0,0)]。

接下来一步是将信标和门放置到位置中

[locationBuilder addBeaconIdentifiedByIdentifier:@"aabbccddeeff"
atBoundarySegmentIndex:0
inDistance:2
fromSide:EILLocationBuilderLeftSide];

使用 ESTIndoorLocationBuilder,您也可以将信标放置在位置内部(添加带有标识符和位置的信标:添加带有标识符和位置的信标:添加带有标识符、位置和颜色的信标),这在室内位置应用中的映射工具中是不可能的。

注意,用于添加通过MAC地址识别的信标的方法现在已弃用。请使用通过标识符识别的方法。

通过 Estimote Indoor Location App

使用 Estimote App,该过程包括以下步骤

  • 配置信标
  • 放置信标
  • 将物理位置映射到 EILLocation 实例

如果您已经映射了一个位置,它将自动上传到您的 Estimote Cloud 账户。您可以在您的应用中从 Estimote Cloud 获取它(见章节:在云中管理位置)。

在位置内部获取位置更新

一旦您有了 EILLocation 的实例,您就可以开始监控并获取该位置的位置更新。

监控位置就是简单地确定用户是否目前在位置内部或外部。为了监控位置,首先您需要创建 EILIndoorLocationManager 的实例并开始监控该位置。

EILIndoorLocationManager *indoorLocationManager = [EILIndoorLocationManager new];
[indoorLocationManager startMonitoringForLocation:yourLocation];

要获取位置更新,您需要设置一个 代理,该代理将接收更新。

indoorLocationManager.delegate = yourDelegate;
[indoorLocationManager startPositionUpdatesForLocation:yourLocation];

除了位置外,更新还提供了有关确定位置精度的信息,这些信息可以通过 EILPositionView 或 EILPositionNode 作为具有给定半径的圆形图标来可视化,其中实际的期望位置位于其中。

请注意,您只需要一个室内位置管理器来监控多个位置。然而,位置更新同时只能为一个位置提供。如果需要为新位置启用位置更新,首先需要停止位置更新

[indoorLocationManager stopPositionUpdates];

为了尽早获取室内位置状态更改和位置更新,您应该在早期启动室内位置管理器和监控室内位置。

EILIndoorLocationManager 位置更新可以通过两种不同的模式提供。这些模式在准确性、稳定性和响应性方面不同。根据模式,系统资源的使用可能有差异。

  • EILIndoorLocationManagerModeNormal - EILIndoorLocationManager 的正常模式。以牺牲高系统资源使用为代价,提供最快速的定位更新。与轻量模式相比,这种模式可能稍微不稳定一些。正常模式需要指南针才能正常工作。为了获得最佳结果,用户应该手持手机,并保持纵向模式。
  • EILIndoorLocationManagerModeLight - EILIndoorLocationManager 的轻量模式。提供精确和稳健的定位更新。具有极低的系统资源使用率。这种模式最适合部署。这是 EILIndoorLocationManager 的默认模式。

要更改模式,只需更改 EILIndoorLocationManager 对象的 mode 属性。

indoorLocationManager.mode = EILIndoorLocationManagerModeNormal;

如果位置更新正在发送,则会使位置更新有效重启并采用新模式。

在后台获取位置更新

如果您希望您的室内定位启用的应用在应用在后台运行时也能工作,您必须使用 EILBackgroundIndoorLocationManager。它与 EILIndoorLocationManager 非常相似。您只需将以下代码添加到 AppDelegate.m 中:

EILBackgroundIndoorLocationManager *backgroundIndoorLocationManager = [EILBackgroundIndoorLocationManager new];
self.backgroundIndoorLocationManager = backgroundIndoorLocationManager;

为了在应用处于后台时提供定位,应用需要访问蓝牙。为此,您需要转到项目设置,找到“能力”标签,将“后台模式”设置为开启,并勾选“使用蓝牙低功耗配件”。

为了重启应用程序(如果被操作系统或用户终止),当用户进入位置时需要“始终使用”位置服务授权。

[self.backgroundIndoorLocationManager requestAlwaysAuthorization];

有关请求权限的最佳用户体验模式,请参阅以下链接:[如何请求用户允许使用位置](http://blog.estimote.com/post/144805191465/how-to-ask-users-for-permission-to-use-location)。您还需要转到项目设置,找到“能力”标签,将“后台模式”设置为开启并勾选“使用蓝牙低功耗配件”。

要获取位置更新,您需要设置一个将接收更新的 delegate

backgroundIndoorLocationManager.delegate = yourDelegate;
[backgroundIndoorLocationManager startPositionUpdatesForLocation:yourLocation];

要停止更新位置

[backgroundIndoorLocationManager stopPositionUpdates];

重要注意事项

  • 不需要调用 startMonitoringForLocation
  • 此代码应在 AppDelegate.m 中,这样 iOS 可以在您进入位置时恢复应用,即使它之前已经被杀掉。
  • 在后台模式下,只提供轻量模式,因此不需要设置。
  • 前台和后台位置管理器是分开的。如果想在您的应用中使用两种模式,您必须使用两个管理器。

管理 Estimote 云中的位置

要管理您的位置,可以使用允许与 Estimote 云进行通信的请求。

提供以下请求

  • EILRequestAddLocation - 将新位置保存到 Estimote 云的请求
  • EILRequestRemoveLocation - 从 Estimote 云中删除新位置的请求
  • EILRequestFetchLocation - 获取由其标识符标识的位置的请求。位置必须是公开的或属于当前授权的用户
  • EILRequestFetchPublicLocations - 获取公共附近位置的请求
  • EILRequestFetchLocations - 从 Estimote 云中获取目前授权用户的位置的请求
  • EILRequestModifyLocation - 更改 Estimote 云中已存在的位置的请求

Estimote Cloud中每个保存的位置都分配了唯一的字符串标识符,它对应于EILLocationidentifier属性。您可以在cloud.estimote.com上的“位置”屏幕上找到它,并且可以使用Indoor SDK与它一起使用,例如从Estimote Cloud获取存储的位置。以下是一个由标识符获取位置的示例:

EILRequestFetchLocation *request = [[EILRequestFetchLocation alloc] initWithLocationIdentifier:yourLocationIdentifier];
[request sendRequestWithCompletion:^(EILLocation *location, NSError *error) {

if (!error)
{
self.myLocation = location;
}
}];

请注意,为了使这些方法正常工作,您需要在Estimote Cloud中进行身份验证。为此,您必须首先调用- [ESTConfig setupAppID:andAppToken:]。

#import "EILIndoorLocationManager.h"
#import "ESTConfig.h"

[ESTConfig setupAppID:@"yourAppID" andAppToken:@"yourAppToken"];

您可以在Estimote Cloud的“应用”部分找到您的API App ID和API App Token。

您可以使用以下方法检查授权状态,该方法将返回一个BOOL值:

[ESTConfig isAuthorized]

更新日志

要了解Estimote Indoor Location SDK最近版本中的更改内容,请参阅更新日志