需求
点击push notification 消息进入应用,直接跳转到相应页面!
最近有遇到了上面这个常见的需求:
网上找了一些方法,觉得这篇博客模块化方式最好,这里搬运过来,并且针对JavaPNS,来说明实现思路。相对于Push Notification(一) 改动不大:
1、以javapns搭建的服务端为例,需要定制化地对payload进行封装;
2、手机端对服务端发送的payload进行解析
3、要确定好协议,即payload(在手机端为userInfo)的封装内容
本文使用的方法定制性比较好,前提是一定要和服务器确定好协议1、需要手机push的视图控制器的名称,如下面的HSFeedsViewController 2、HSFeedsViewController中定义的属性;
推送过程结束后,也就完成了将服务端封装的ID和type,赋值给HSFeedsViewController的ID与type属性,至于要用这两个属性干啥就看具体需求了,如作为网络请求的参数,页面直接显示该参数指定的内容。
服务端
选用javapns作为推送框架的服务端,之前的博客中是这样的写的:
1 | import java.util.ArrayList; |
红色的代码是推送的主要内容(然后在手机端的userInfo字段可以收取以便后面解析,这是后话),注意,推送的内容可以包括:1)推送消息的具体内容 2)推送消息的提示音类型 3)应用图标左上角表示消息数量的数字4)自定义内容
自定义内容的实现方法就是上面被注释掉的那句,该方法有三个重载方法
1 | payload.addCustomDictionary(String key, int value); |
1 | payload.addCustomDictionary(String key, String value); |
1 | payload.addCustomDictionary(String key, List value); |
这个消息会以键值对的方式传到手机端,所以如果想要向手机端发送什么自定义的键值对,用这种方法就可以了
如想要手机端接收的userInfo为如下内容:
1 | userInfo:{ |
只需要在封装时使用下面的语句即可:
1 | List<HashMap<String,String>> propertyList = new ArrayList<HashMap<String,String>>(); |
可能看着挺麻烦的,但是没有办法,addCustomDictionary不能直接将HashMap发送,只能将HashMap的内容装好后,放在一个List中,发出去即可。
手机端
然而由于List是一个数组,所以手机端接收到的内容其实是
1 | class = HSFeedsViewController; |
property对应的value是一个数组,我们要在手机端做一下简单的处理就好:取数组的第一个元素,重新封装为一个dictionary。
下面引用这篇博客的内容,并稍加改动。
HSFeedsViewController.h:
- 进入该界面需要传的属性
1 |
|
AppDelegate.m:
- 推送过来的消息规则
1 | // 这个规则肯定事先跟服务端沟通好,跳转对应的界面需要对应的参数 |
- 接收推送消息
1 | - (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo |
- 跳转界面
1 | - (void)push:(NSDictionary *)params |
- 检测对象是否存在该属性
1 | - (BOOL)checkIsExistPropertyWithInstance:(id)instance verifyPropertyName:(NSString *)verifyPropertyName |