iOS 8 基于定位的本地通知

iOS 8在推送通知的方式上做了些许改动,特别是对于推送的认证和本地通知更是改得不少。本地通知可以通过一个定时器触发,并且比较新鲜的功能就是通过定位信息来触发本地通知。

在iOS 7上,根据用户的地理信息在特定的区域给其发送通知理论上是可以实现的,但是离真的实现相去甚远。而这些功能在iOS 8里面都开放出来了,而基于定位的通知则是首当其冲要支持的内容。

下面我们要演示的这个App的名字叫做Nearly There,用户可以使用这个应用在地图上定点,设置好之后,当用户接近这个定点50米范围内的时候就会给用户发送通知。具体的实现代码在这里

请求认证

因为这个应用要申请定位和通知,所以你需要从用户的那里获得相关权限。用户通知可以是对话框、音效、图标角标,总之通知会打断用户的当前操作,但不会在前台显示出通知应用的界面。这些通知可以通过远程或者本地事件触发(或者是时间和空间上的事件)。而请求获取用户授权的时候你就需要告知用户你需要使用哪一种通知,并将其注册。下面仅仅是一个有关对话框的请求:

1
2
3
4
5
// Ask for permission for notifications
 
let notificationSettings = UIUserNotificationSettings(forTypes: UIUserNotificationType.Alert, categories: nil)
 
UIApplication.sharedApplication().registerUserNotificationSettings(notificationSettings)

呈现给用户的效果如下:

1.png

如果你没有获得授权,却要企图使用定位通知的话,你会在控制台得到如下错误:

2.png

申请定位的授权会稍微复杂一些,之前在这篇文章深入解析过。你需要创建一个CLLocationManager(),它的声明周期与视图控制器一样(也就相当于属性值)。

1
let locationManager = CLLocationManager()

然后请求权限:

1
2
3
4
5
// Ask for permission for location
 
locationManager.delegate = self 
 
locationManager.requestWhenInUseAuthorization()

有趣的是,在这里你无需请求在后台使用位置信息的权限就能实现定位通知。这是因为系统中的CoreLocation关心的只是地理围栏的信息(译者按:也就是说这里判断用户的位置依靠的不是定位而是使用地理围栏技术,国内的玩家就默泪吧),而在用户掏出手机把你的应用拿来用的时候离目的位置还远着呢。

想必你肯定记得要将info.plist中的NSLocationWhenInUsageDescription字段设置为合适的字符串,在此前的文章里面我们也说到过。呐,现在你搞定了所有要做的事,你的用户就会在启动App的时候看到如下的提示了:

3.png

如果有哪里不对的话这个地方是一定会有错误提示的,所以好好检查一下吧。

如果你还是执意不请求定位授权来使用定位通知的话,你App的很多功能都会报销,而且你还不会知道发生了什么。

创建通知

定位通知和临时通知并无二样,其实都属于本地通知。因此都以UILocalNotifiction的实例来创建:

1
2
3
let notification = UILocalNotification()
 
notification.alertBody =  "You're nearly there!"

为了将你的通知类型指定为定位通知你需要将为region属性赋上一个CLRegion对象,CLRegion有CLCircularegion和CLBeaconRegion两个实体类子类,也就是说,你用两种方式来指定你的通知的触发范围,一种是根据全球的绝对位置信息,另一种则是根据一个给定的iBeacon来介定。

下面的代码指定了一个以指定地点annotation的坐标coordinate为圆心,半径radius为50米的圆形区域:

1
2
3
notification.region = CLCircularRegion(center: annotation!.coordinate, radius: 50, identifier:  "Destination"
 
notification.regionTriggersOnce =  true

regionTriggersOnce属性限定的是在通知触发之后是否只通知一次即停止,这里是true表示只通知一次,而如果是false则表示用户在每次经过指定范围的边界时都会收到通知。

当你创建好一个通知之后你需要预置这个通知,使用UIApplication的scheduleLocalNotifiction()方法,

1
UIApplication.sharedApplication().scheduleLocalNotification(notification)

删除通知的话同样是用UIApplication的方法,分别是cancelLocalNotifition(_)和cancelAllLocalNotifictions().

所以完成之后效果应该是这样的:

QQ截图20141104094356.png

通知响应

定位通知的应用委托会在触发application(_,didiReceiveLocalNotification:)的时候调用一个方法,如果定位通知被触发,则它有一个值为nil的region属性:

1
2
3
4
5
6
7
8
9
10
11
func application(application: UIApplication, didReceiveLocalNotification notification: UILocalNotification) { 
 
println( "\(notification)"
 
if  notification.region != nil { 
 
     println( "It's a location notification!"
     
      }
      
}

无论你的应用当前在不在前台这个方法都会被调用——不过要注意的是如果你的应用此时处于前台,那系统不会显示任何UI界面——这是可以由你决定的。

当应用在后台运行的时候,系统就会显示对话框(以用户设定的任意形式,还可以是铃声,图标角标什么的)。如果用户点击一下通知,你的应用就会被启动,且有一个包含了UIApplicationLauchOptionsLocationKey的选项:

1
2
3
4
5
6
7
8
9
10
11
12
13
func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool { 
 
// Override point for customization after application launch. 
 
if  launchOptions?[UIApplicationLaunchOptionsLocationKey] != nil { 
 
     println( "It's a location event"
     
   
    
return  true
 
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值