极光推送实战感受
最近公司的项目新增一个消息中心的功能,使用的是极光推送,现在项目上线了,分享一下做这个功能的感受。写的不好,希望大家多多指正
第一步: 集成极光SDK
集成极光文档主要的还是按照极光文档一步步来,导入一些系统框架,添加极光的.a文件和极光头文件,然后在相应的地方添加代码。添加代码极光文档都写的很详细,极光也有案例,可以参考案例
第二步:创建应用,获取appKey
创建应用需要到登陆自己的极光账号(没有注册一个),到控制台创建一个应用,填写应用相应的信息。其中涉及到开发环境和开发环境的p12文件,这就需要到苹果开发者平台去配置推送证书,我这儿有一个网址 http://jingyan.baidu.com/article/5d6edee20f3ae599eadeec35.html 。 推送证书配置好了下载下来之后,双击会放到钥匙串中,在钥匙串中,选中推送证书右键,就有一个导出的选项,导出之后就是p12文件,这时候就可以选择了。创建完应用之后便可以拿到一个appKey,在程序的didFinishLaunchingWithOptions 集成的极光代码中,需要使用的这个appKey. 此时极光推送也就集成好了,在极光的后台也可以测试推送。 推送是根据程序bundle Id来识别某个app的,所以在极光上创建应用的时候跟配置证书的时候bundle Id 一定要跟程序bundle ID 一致
第三步:点击通知栏进行页面跳转
推送的目的就是为了增加用户的活跃度,所以推送推到用户手机上之后,点击通知栏应该进行相应的页面跳转。页面跳转就设计到程序内部的了,每一个程序结构和内容都不一样,所以我就不做详细介绍了。我讲解一下我是如何进行页面跳转的吧。 首先后台开发人员会给客户端提供他们推送的数据包含哪些字段,这些字段分别都表示什么,有什么作用。当点击通知栏的时候这些数据会传递过来,这里又分为几种清空。
第一种程序没有杀死,app在后台的时候,并且手机系统为10.0以下的时候,点击通知栏会调用下面这个方法,后台推送的数据会包含在userInfo这个字典当中
- (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo fetchCompletionHandler:(void (^)(UIBackgroundFetchResult))completionHandler
10.0 以上的系统调用下面这个方法,后台推送的数据包含在response.notification.request.content.userInfo里面
- (void)jpushNotificationCenter:(UNUserNotificationCenter *)center
didReceiveNotificationResponse:(UNNotificationResponse *)response
withCompletionHandler:(void (^)())completionHandler
第二种程序没有杀死,app在前台的时候,这种情况咱就不考虑了,因为app在前台的时候通常是不会进行界面跳转的
第三种情况就是程序杀死了,点击通知栏会调用didFinishLaunchingWithOptions 方法,后台推送的数据包含在launchOptions[UIApplicationLaunchOptionsRemoteNotificationKey],launchOptions这个字典的这个UIApplicationLaunchOptionsRemoteNotificationKey字段中
我们需要进行界面跳转,以及数据展示,那么就必须把这些数据保存起来,我的做法是定义一个单例模型,用KVC的方式,为模型赋值,将数据保存到单例模型中。然后跳转的话,可以通过通知的方式,在app首页接收通知,一律在首页进行界面跳转,因为首页一定是存在的(app登陆之后到退出的这段时间)。然后实现通知观察者的方法,在根据推送数据模型的数据进行页面跳转。
说到这儿,我不得不提出我在开发当中遇到的两个比较严重的问题
1. 页面连续跳转多次
2. 当程序杀死的时候,收到通知,点击通知栏无法进行跳转
第一个问题跳转多次的原因是通知观察者没有移除的原因。或许跟我的项目框架有关系,我们的项目框架是从登陆控制器push到tabBar控制器,这样就可能导致退出登陆之后首页控制器没有及时被销毁,然后再次登陆,首页就注册了两个通知观察者,就会导致重复跳转的清空,所以通知观察者一定要记得移除,还有推送数据单利模型的值在退出登陆之后也应该清空
第二个问题程序杀死了收不到通知,这就涉及到程序的生命周期了。程序杀死了,收到通知,点击通知栏进入的是didFinishLaunchingWithOptions这个方法,推送的数据也是在这个方法中进行存储的。然后程序启动进入到首页(因为程序杀死了之后一定会进入到首页,所以这里就不发送通知了),在首页我们手动在调一次接收到推送通知后执行的方法进行界面跳转,当然在这个方法中需要做判断,判断单例模型的某一个属性的值是否为空(这个值必须确保有推送的时候一定是不为空的),然后在进行页面跳转。不然的话,即使没有通知,首页进行初始化也进行跳转的话就出问题了。但是!!!!! 这个但是很重要,主动调用接收到通知的方法 这是一定要加的,还要将这个方法放到异步主线程中执行。因为程序杀死之后点击通知栏需要重新初始化首页控制器,而在viewDidLoad调用界面跳转的方法跳转的时候,首页控制器还没有初始化完毕,需要等到viewDidLoad执行完毕之后才能进行跳转,所以要加一个异步主线程,这样才能在程序杀死之后也能进行界面跳转