要运行示例项目,请克隆仓库,然后首先从 Example 目录运行 pod install
。
escaKit 通过 CocoaPods 提供。要安装它,只需将以下行添加到您的 Podfile 中:
pod "escaKit"
开始使用 escaKit 很简单。
import escaKit
如果您的应用程序尚未请求位置服务,您必须在此操作之前这样做才能使 escaKit 在真实世界中工作。escaKit 提供了一个帮助函数来请求位置服务。
escaKit.requestLocation(.Always) //or .WhenInUse
请确保在 Info.plist 中包含适当的用途描述。
NSLocationWhenInUseUsageDescription
NSLocationAlwaysUsageDescription
如果您希望当应用处于后台时从 escaKit 发送通知,您需要请求通知。
escaKit.requestNotificationsForApplication(UIApplication.sharedApplication())
请求适当的权限后,您可以启动 escaKit。
escaKit.start(delegate: self, appKey: "escakit-demo-key")
从 esca Dashboard 获取 appKey
,它应该看起来像这样:`asTyjGFHcDmgr23ICZuKGS4wTKDwnmIHx0B3RFga`。
当您在 escaKit 中创建一个体验时,它将自动显示在 esca Dashboard 上。从那里,您可以分配要发送给应用程序的内容。
要创建一个体验,创建一个 escaKit.Experience
的新子类。在您的体验中,添加 escaKit.Payload
的子类,并在体验中创建属性以持有这些有效负载。
您可以在一个体验中拥有任意数量的有效负载,并且可以拥有具有相同有效负载类型的多个属性。
import Foundation
import escaKit
class InStoreExperience: escaKit.Experience {
var currentSale = PromotionPayload()
class PromotionPayload: escaKit.Payload {
var imageUrl: String = ""
var about: String = ""
var name: String = ""
}
}
重要:您必须确保任何有效负载属性(如 currentSale
)分配了所需的类型的空有效负载。
创建完您的体验后,您需要通知 escaKit。在 escaKit.start(...)
调用之后任何地方,您都可以注册您的体验。
escaKit.registerExperience(InStoreExperience)
这将上传体验结构和有效载荷到esca Dashboard。下次您登录时,您将能够开始将内容分配到体验。
escaKit的代理,通常是ViewController或您的AppDelegate,需要符合escaKit.DiscoveryDelegate
protocol escaKit.DiscoveryDelegate {
func escaKitDidDiscoverExperience(experience: Experience)
func escaKitDidDiscoverObject(object: Object)
}
使用Experience
回调,在您的应用程序进入iBeacon区域或其他上下文时显示相关体验。
func escaKitDidDiscoverExperience(experience: Experience) {
if let experience = experience as? InStoreExperience {
print("Loading In Store Experience with Sale: \(experience.currentSale.name)")
self.modalWindow.experience = experience
self.modelWindow.open(animated: true)
}
}
您可以使用Object
回调开始跟踪哪个对象在范围内,并设置对象的代理。
func escaKitDidDiscoverObject(object: Object) {
print("\(object) discovered")
object.delegate = self
self.objects.append(object)
}
在特定时间,每个iBeacon都有一个对象与之关联。对象具有标识符和距离等信息。
标识符是一个32位整数,它将与写入iBeacon箱子的相同数字相同。
距离是一个浮点数,随着iBeacon接近扫描设备,它将接近0
。您可以使用这个数字来找出哪个对象最近,或者为对象触发某些操作设置边界。
当对象发生某些事件时,如更新距离或消失,将调用代理。请参阅ObjectDelegate
协议。
escaKit.ObjectDelegate
protocol escaKit.ObjectDelegate {
func escaKitObjectDidDisappear(object: Object)
func escaKitObjectDidChange(object: Object)
}
当扫描设备不再看到对象时将调用此操作。如果与该对象关联的iBeacon超出了范围,就会发生这种情况。您可以使用这个回调作为从您要跟踪的对象数组中删除对象的机会。
func escaKitObjectDidDisappear(object: Object) {
print("\(object) did disappear")
self.objects = self.objects.filter { currentObject in
currentObject != object
}
}
当对象的属性发生变化时(如distance
),将调用此操作。您可以使用此回调更改对象项目的列表顺序,或者检查是否达到了距离阈值。
func escaKitObjectDidChange(object: Object) {
print("\(object) changed.")
if object.distance < 100.0 {
print("\(object) is close.")
}
//sort the objects by closest at
//the beginning of the list
let objectsByDistance = self.objects.sort { object1, object2 in
//put 0s at the end of the list
if object1.distance == 0 {
return false
}
if object2.distance == 0 {
return true
}
return object1.distance < object2.distance
}
if let closestObject = objectsByDistance.first {
print("\(object) is closest.")
}
}
如果您没有用于测试的esca iBeacon,您可以模拟对象以测试您的代码。
escaKit.simulateObject(after: 2, lastingFor: 10, withId: 10130482)
escaKit.simulateObject(after: 2, lastingFor: 10) //defaults to id 10000000
escaKit包括一些辅助函数,例如用于发送通知的这个函数
escaKit.sendNotificationForApplication(UIApplication.sharedApplication(), title: "Test Alert", message: test, sound: true)
iOS限制后台可跟踪的最大iBeacon数量为20。因此,您必须明确告诉escaKit在后台时您想发现哪些beacon标识符。
escaKit.enableBackgroundDiscoveryForObject(identifier: 10130482)
当对象在后台被看到时,将像往常一样调用DiscoveryDelegate
。与sendNotification
辅助函数结合使用,当应用程序未打开时,在用户靠近iBeacon时提醒用户。
注意:您还必须请求.Always
位置使用,以在后台检测iBeacon。
escaKit 内置了平滑算法,用于防止因蓝牙干扰导致的不一致性引起的 distance
测量值的波动。尽管这种平滑可以提高测量精度,但它会降低您的应用对附近信标位置变化的响应速度。
默认的平滑值为 20
。要阻止平滑,请使用 1
。
//faster, but more erratic beacon distances
escaKit.Beacon.smoothing = 10
通过启用日志记录,可以访问 escaKit 的有用信息。
escaKit.logging = true
要停止 escaKit 扫描信标,请随时调用 escaKit.stop()
。
Tanner Nelson, [email protected]
escaKit 在 MIT 许可证下提供。有关更多信息,请参阅 LICENSE 文件。