您的位置:首页 > 移动开发

iOS 消息推送 点击app图标 app icon如何获取推送信息 leanCloud 点击app图标 获得推送消息

2015-12-31 10:35 1041 查看
  最近在做消息推送,点击app图标的时候获取不到推送内容,相当的蛋疼,还有就是如果接收到了多条推送信息,那么点击一个推送提示框,只能显示一个,其他的就没有,这个问题困扰很久了,现在有了解决的方法:

  当应用是被通知打开的时候,你可以通过 
application:didFinishLaunchingWithOptions:
方法的
launchOptions
 参数所使用的
dictionary 访问到数据:

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
. . .
// Extract the notification data
NSDictionary *notificationPayload = launchOptions[UIApplicationLaunchOptionsRemoteNotificationKey];
// Create a pointer to the Photo object
NSString *photoId = [notificationPayload objectForKey:@"p"];
PhotoVC *viewController = [[PhotoVC alloc] initWithPhoto:object];
[self.navController pushViewController:viewController animated:YES];
}
如果当通知到达的时候,你的应用已经在运行,那么你可以通过
application:didReceiveRemoteNotification:
 方法的 
userInfo
 参数所使用
dictionary 访问到数据:

- (void)application:(UIApplication *)application
didReceiveRemoteNotification:(NSDictionary *)userInfo{

NSString *photoId = [userInfo objectForKey:@"p"];

//然后在这里面处理
}


上面这些大家都知道,现在关键来了,怎么样在点击app图标的时候获取信息呢,

 
  不管是应用在后台运行,还是完全关闭,只要点击应用图标,应用肯定会走,applicationdidbecomeactive 这个方法,那么我们就在这个方法里面进行操作,前提是,后台必须有保存推送信息的表(当后台进行推送的时候,推送完成之后,将推送的内容保存在数据库中,供客户端在需要的时候进行查找)比如一个notification_log表,具体的操作:

 
   1,后台创建表,保存数据


 
   2,客户端在应用进入前台的时候在 上面那个 delegate方法中进行如下代码的操作


 
      a,
NSInteger notificationBadge =  application.applicationIconBadgeNumber;这个是badge
就是现在的应用收到的推送数量

       b,如果notificationBadge == 0 那就不进行操作,如果不等于零,那就在数据库中进行查询,然后获得这个数据里面的最后notificationBadge个数据,

       c,当然推送的群体可能不同,可能是给某些用户推送的信息,那就在查询数据的时候添加筛选条件,把符合当前用户能够接收的消息查找出来,之后再获取最后的notificationBadge个数据, 

 
     d,之后,就是进行数据的判断操作,和相应的跳转

下面是我用leanCloud平台的API写的demo:

- (void)getNotifigationFromData:(UIApplication *)app{
NSInteger notificationBadge =  app.applicationIconBadgeNumber;
ZYSystemPushManager *manager = [ZYSystemPushManager manager];//写的一个单例类,用来存储数据
if (notificationBadge == 0) {
[self viewControllerIRootViewController];
}else{
[[LZPushManager manager] findNotification:^(NSArray *objects, NSError *error) {
//这个是封装的一个方法,用来回调查找结果
if (error) {
NSLog(@"查找通知失败%@",error);
}else{
//我的数据库的表里面有个data字段,data字段存储的json字符串,把他转成字典格式
for (NSInteger i = notificationBadge; i > 0; i--) {
NSString *notiStr = [objects[objects.count - i] objectForKey:@"data"];
NSLog(@"notistr...........%@",notiStr);
if (notiStr) {
NSData *jsonData = [notiStr dataUsingEncoding:NSUTF8StringEncoding];
NSError *err ;
NSDictionary *dic = [NSJSONSerialization JSONObjectWithData:jsonData options:NSJSONReadingMutableContainers error:&err];
if (err) {
NSLog(@"有错误%@",err);
}else{
NSLog(@"%@",dic);
if(dic){
NSString *toWhere = [dic objectForKey:@"page-path"];
if([toWhere isEqualToString:@"systemMessage"]){
[manager.noticeAry addObject:dic];//在这里进行数据的判断,然然添加啊到数组里面,在相应的页面进行调用
}
}

}

}

}
[[NSNotificationCenter defaultCenter] postNotificationName:@"NotificationUpdata" object:nil];
}
}];
[self viewControllerIRootViewControllerToPushMessageVC];

}

}
- (void)findNotification:(AVArrayResultBlock)callback{
AVQuery *query = [AVQuery queryWithClassName:@"NotificationLog"];
//在channels 字段的数据,要被包含在后面那个数组里面,
[query whereKey:@"channels" containedIn:@[@"normaluser",@"all"]];//查找条件

[query findObjectsInBackgroundWithBlock:callback];
}


仅供参考,具体的思想就是,建立一个表,在表里面取得当前消息个数的数据,进行保存,显示,

如果对您有帮助,请帮忙赞一个,谢谢,

注:在我的应用中可用.
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息