@end
与之前一样,你需要初始化位置管理器并设置它们的 delegate 。
在 application:didFinishLaunchingWithOptions: 的顶部添加如下语句:
self.locationManager = [[CLLocationManager alloc] init];
self.locationManager.delegate = self;
乍一看,这好像有些太简单了。当你的应用加载时,新分配的 CLLocationManager 实例有什么用?它又如何知道要监视的区域?
回想到在你的应用中任何你使用 startMonitoringForRegion: 添加的监视区域都被所有的位置管理器共享。所以你免费得到的一点持久化,实在是极有帮助。
若没有这个功能,就将由你来找出哪些区域正在被监视并在应用加载时重新开始监视它们。但就算这样也不够,因为你的应用还不知道在遇到某个区域时就醒过来。
感谢 Apple 在 Core Location 中已经为你做了许多繁重的工作。这里的最后一步只是简单地在 Core Location 遇到某个区域并唤醒你的应用时做出响应即可。
添加如下方法到 RWTAppDelegate.m 地底部:
- (void)locationManager:(CLLocationManager *)manager didExitRegion:(CLRegion *)region {
if ([region isKindOfClass:[CLBeaconRegion class]]) {
UILocalNotification *notification = [[UILocalNotification alloc] init];
notification.alertBody = @"Are you forgetting something?";
notification.soundName = @"Default";
[[UIApplication sharedApplication] presentLocalNotificationNow:notification];
}
}
你的位置管理器将在你离开某个区域时调用上面的方法,这就是这个应用有用的时刻。你不需要在你接近你的电脑包时被告知,只需在你离开它太远时通知你。
此处你检查区域是否是一个 CLBeaconRegion ,因为如果你同时也在执行地理定位区域监视的话,它还可能是一个 CLCircularRegion 。然后你就发送一个本地通知,附带一个消息“Are you forgetting something?” 。
编译并运行你的应用;离开某个你的注册的 iBeacon,然后一旦你离开得足够远,你就会看到通知弹出来。
ForgetMeNot-notification
如果你实际上不可能离开你的 iBeacon 太远(译者注:房间太小?),那就将它的电源关掉或者移除它的电池以便测试这个功能。
注意:最后关于 iBeacon 和 iOS 行为的记录:
iOS 7.1 添加了当它遇到被监视的 iBeacon 时从后台唤醒应用的能力。之前,用户需要打开应用以响应通知,但现在全都免费工作了!
Apple 以未文档化的方式推迟“退出通知(exit notifications)”。这可能是特别设计的,以便你的应用不会过早收到通知,比如你在某个范围的边缘游荡或者这个 iBeacon 的信号暂时中断。在我的经验里,“退出通知”通常在某个 iBeacon 离开范围的一到两分钟之后才发生。
译者注:这是不是也太迟了?
下一步怎么走?
现在你有一个有用的应用帮你监视那些你很难找到和监控的事物。
你可以在此下载最终的项目。
用一些想像力和编码能力,你给此应用带来了许多真正有用的特性:
当条目离开区域时通知用户
重复通知确保用户看到
在 iBeacon 回到区域时提示用户
……或者其它任何你能想像到的事
这个 iBeacon 教程只是碰到 iBeacon 的可能性的一点皮毛而已。在本教程的开头,我提供了一些文章链接显示职业棒球大联盟和商场正在如何以非常参与的方式(in very engaging ways)使用着 iBeacon 。
iBeacon 并不局限于自定义应用;你也可以将它们与 Passbook 的通行证一起使用。试想一下,当你跑进电影院;你就能用 Passbook 得到电影票。当顾客走近验票人员时,他们的应用将自动在 iPhone 上显示票据。
如果你有关于本教程的任何问题或评论,或着任何使用 iBeacon 的新点子,欢迎加入下面的讨论!