本地推送通知机制和实现步骤详解

如何发送本地推送通知

推送通知也属于UI的一部分,所以推送通知对象是以UI开头。

将发送通知的代码方法控制器的-touchesBegan: withEvent: 中测试比较合适,如果放到viewDidLoad方法,用户的注册请求还没有完成方法就调用了。

创建本地通知对象

设置本地通知属性

使用应用 UIApplication 调度本地通知

本地推送通知页面跳转

无论应用是在前台,后台还是已经关闭都能如期接收到本地通知,但是当用户点击通知进入应用的时候,我们需要根据不同情况,进行处理

AppDelegate本地通知代理方法

但是当应用已经退出的时候,点击通知进入本应用时候,不在调用application:didReceiveLocalNotification:的代理方法。难道当应用退出后,用户再进入应用我们就不再跳转指定界面了吗?

为了更好用户体验,我此时也应该让应用跳转到指定的界面,怎么才能实现这个功能呢?

我们知道当应用程序启动的时候一定会调用application: didFinishLaunchingWithOptions:的代理方法,在这里我们能拿到本地通知信息,也可以跳转相应的界面。

一个应用可能要各种不同的通but知,点击不同的通知可以跳转不同界面,这个有该怎么做呢?

在发送通知时候,设置userInfo属性

在AppDelegate本地通知代理方法中进行判断

测试launchOptions[UIApplicationLaunchOptionsLocalNotificationKey]中的内容

显示结果:

本地推送通知机制和实现步骤详解

我们从中可以出他是一个UILocalNotification对象

所以我们取出UILocalNotification对象,剩下的做法与接收到本地通知代理方法中处理相同,所以我们把它提取为一个公用的方法

在didReceiveLocalNotification方法中

在didFinishLaunchingWithOptions方法中

iOS8的不同点

你如果把上面的程序运行在iOS8上,会爆出如下错误

也就是在iOS8上要发送本地通知需要 请求用户权限 如何请求用户权限呢?

一般在新版有变化的地方,在头文件中都会有相应的说明,所以点击到scheduleLocalNotification:方法中,看看有没有我们需要信息。

意思就是说:在iOS8.0以后,在调度通知之前你需要使用UIApplication的对象方法registerUseNotificationSetting:来请求用户授权。

这种请求权限的代码一般放在didFinishLaunchingWithOptions:方法中,在用户不卸载的情况下,只需要请求一次,下次在运行就不用请求了!

运行程序

本地推送通知机制和实现步骤详解

测试点击通知,进入应用也没问题。

接下来,我们说说-[UIUserNotificationSettings settingsForTypes:categories:] 中的 categories

categories可以让我们发送通知之前预定义一些通知也就是通知上可以显示按钮,他需要是一个装有UIUserNotificationCategory类的对象的NSSet的对象.。但是官方推荐我们使用它的子类UIMutableUserNotificationCategory,来动态的添加通知的行为按钮,iOS8支持前台和后台的两种行为。

通知Action按钮以长条展示如图

本地推送通知机制和实现步骤详解

通知Action按钮以AlertView展示如图

本地推送通知机制和实现步骤详解

注册分类,并在分类中添加不同的行为 由于注册用户通知设置代码量比较大我们实现一个新的方法registerUserNotification

在发送本地推送通知时候指定通知的分类标示

监听点击通知按钮的行为,在AppDelegate中实现监听通知按钮点击方法

iOS8 基于位置的本地通知

基于位置的本地通知就是当用户进入或离开某个区域,就会给该用户发送一条本地通知,基于位置的本地通知只有在iOS8.0以后才能使用。

实现步骤:

在- (BOOL)application:(UIApplication )application didFinishLaunchingWithOptions:(NSDictionary )launchOptions 方法中注册通知权限

在发送通知之前要请求使用用户的位置权限,在info.plist增加 NSLocationWhenInUseUsageDescription 的Key,类型为String,值填写需要提示内容。

定一个 CLLocationManager 类型的属性

通过懒加载的方式其进行初始化并设置其代理

发送基于位置的推送通知之前首先判断用户是否已经拥有了访问位置的权限。如果如果没有请求权限,如果已经有就直接发送推送通知。

实现发送基于位置的通知方法

说明:

1.基于位置本地通知,提醒做不到非常精确他依赖与GPS和周围的信号基站。

2.基于位置的本地通知,只有真机才能测试。

3.基于位置的本地通知,无需编程人员主动获取用户位置,我们添加应用调度中,如果用户手机打开了定位,系统会根据用户当前的位置来决定是否要给该用户发送通知。

六阿哥

发表评论

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: