收到推送的准备:

首先至于说消息推送的原理,证书配置等等这些我在这里就不在累述,有很多写的很好的文章相信您已经可以搞定这块,这里我重点讲下各种情况下的跳转处理。
复制代码

####点击推送触发的几个方法:

ios7.0之前 - (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo{ // App 收到推送的通知

 NSLog(@"********** ios7.0之前 **********");if (application.applicationState == UIApplicationStateActive || application.applicationState == UIApplicationStateBackground) {}
else{}}
复制代码

ios 8 - 10 点击本地推送 触发的方法

/**ios 10 之前 点击本地推送 触发的方法@param application
@param notification*/-(void)application:(UIApplication *)application     didReceiveLocalNotification:(UILocalNotification *)notification{
DLog(@"本地通知 %ld",(long)application.applicationState );
// 用户在前台
if (application.applicationState == UIApplicationStateInactive ) {NSDictionary *dic = notification.userInfo;[self remoteNotificationWith:[dic objectForKey:@"payload"] ];}else{}}
复制代码

*iOS 8 - 10 点击远程消息推送 *

/**iOS 8 - 10  @param application@param userInfo@param completionHandler
*/- (void)application:(UIApplication *)application    didReceiveRemoteNotification:(NSDictionary *)userInfo fetchCompletionHandler:(void (^)(UIBackgroundFetchResult))completionHandler
{completionHandler(UIBackgroundFetchResultNewData);
// 打印到日志 textView 中
NSLog(@"********** iOS7.0之后 background **********");[GeTuiSdk handleRemoteNotification:userInfo];
// 应用在前台。
if (application.applicationState == UIApplicationStateActive) {{}
}
//后台状态下,直接跳转到跳转页面。
if (application.applicationState == UIApplicationStateInactive ||  UIApplicationStateBackground)
{//后端推送if ([userInfo[@"payload"] isKindOfClass:[NSString class]]  ) {NSData *jsonData = [userInfo[@"payload"]  dataUsingEncoding:NSUTF8StringEncoding];[self remoteNotificationWith:[NSDictionary dictionaryWithJsonData:jsonData ]];}}}
复制代码

*iOS10 之后点击推送的方法 包括本地推送 *

/**ios 10 点击消息推送的方法  包括点击本地推送前端 点击推送  后端 点击推送@param center 、@param response 、@param completionHandler 、
*/
- (void)userNotificationCenter:(UNUserNotificationCenter *)center      didReceiveNotificationResponse:(UNNotificationResponse *)response   withCompletionHandler:(void(^)())completionHandler{
NSLog(@"********** iOS10.0之后  **********");
[[UIApplication sharedApplication] setApplicationIconBadgeNumber:0];
[GeTuiSdk resetBadge];
NSDictionary * userInfo =    response.notification.request.content.userInfo;DLog(@"%@ %@",userInfo , [userInfo[@"payload"] class]);
if ([UIApplication sharedApplication].applicationState == UIApplicationStateActive) {}
//后台状态下,直接跳转到跳转页面。if ([UIApplication sharedApplication].applicationState == UIApplicationStateInactive ||  UIApplicationStateBackground){}completionHandler(UNNotificationPresentationOptionAlert);  // 系统要求执行这个 方法
}
复制代码

做消息跳转无外乎是在这几个方法中,但是上面陈述的这些方法都只是针对系统版本做的分类,对于跳转我们还要考虑下其他情况,点击消息跳转到指定的界面,这个时候要分3种情况 app 在前台(转本地推送)

这个要根据你们的需求去做,我们的需求是app在前台收到消息时候,要 转成本地推送,然后点击本地推送的消息可以做相应的跳转。

我用的是个推的,在收到个推的透传消息时候会走这个代理方法,判断如果在前台的时候就转成本地推送

这个是转成本地推送的方法,当然对于里面数据的转换你要根据你们的业务需求和后台的返回情况做转化,因为你在之后点击本地推送的时候还是要根据你转本地推送所传的值进行对应的跳转的 - (void)requestLocationNotification:(NSDictionary *)payData{

if (IOS_VERSION >= 10) {//进行用户权限的申请//通知内容类UNMutableNotificationContent * content = [UNMutableNotificationContent new];//设置通知请求发送时 app图标上显示的数字content.badge = @2;//设置通知的内容content.body = payData[@"content"];//默认的通知提示音content.sound = [UNNotificationSound defaultSound];//设置通知的副标题//        content.subtitle = @"这里是副标题";//设置通知的标题content.title = payData[@"title"];//设置从通知激活app时的launchImage图片content.launchImageName = @"icon.png";content.userInfo = @{@"payload":payData};//设置5S之后执行UNTimeIntervalNotificationTrigger * trigger = [UNTimeIntervalNotificationTrigger triggerWithTimeInterval:1 repeats:NO];UNNotificationRequest * request = [UNNotificationRequest requestWithIdentifier:@"NotificationDefault" content:content trigger:trigger];//添加通知请求[[ UNUserNotificationCenter currentNotificationCenter]      addNotificationRequest:request withCompletionHandler:^(NSError * _Nullable error) {}];}else{NSDictionary * userInfo = payData;UILocalNotification *notification=[[UILocalNotification alloc] init];if (notification!=nil) {UILocalNotification *notification = [[UILocalNotification alloc] init];//设置1秒之后NSDate *pushDate = [NSDate dateWithTimeIntervalSinceNow:1];if (notification != nil) {notification.fireDate = pushDate;notification.timeZone = [NSTimeZone defaultTimeZone];notification.repeatInterval = 0;notification.soundName = UILocalNotificationDefaultSoundName;if (userInfo[@"title"]) {notification.alertTitle = userInfo[@"title"];}if (userInfo[@"content"]) {notification.alertBody = userInfo[@"content"];}else{notification.alertBody = @"您有新的消息";}                                    if (userInfo ) {NSMutableDictionary *info = [NSMutableDictionary dictionaryWithObject:userInfo   forKey:@"payload"];notification.userInfo = info;}DLog(@"%@  %@",userInfo , notification);UIApplication *app = [UIApplication sharedApplication];[app scheduleLocalNotification:notification];}}}}
复制代码

app 在前台的时候当接收到消息推送的时候,如果你不做任何处理默认是不会有提示的,一般的处理方式就是透传的消息转化成本地消息推送,然后当用户点击的时候做相应的跳转,当然也有可以直接做弹窗提醒,然后做对应的处理。

点击本地推送触发的方法

iOS 10之前

-(void)application:(UIApplication *)application didReceiveLocalNotification:(UILocalNotification *)notification
复制代码

iOS 10 之后

- (void)userNotificationCenter:(UNUserNotificationCenter *)center didReceiveNotificationResponse:(UNNotificationResponse *)response withCompletionHandler:(void(^)())completionHandler
复制代码

app 在后台

app 在不是杀死状态 这个时候点击通知 会走如下方法

iOS 7之前 - (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo

iOS 8 - 10
- (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo fetchCompletionHandler:(void (^)(UIBackgroundFetchResult))completionHandler ios 10之后 - (void)userNotificationCenter:(UNUserNotificationCenter *)center didReceiveNotificationResponse:(UNNotificationResponse *)response withCompletionHandler:(void(^)())completionHandler

这个时候你会发现 前台后台的时候走的可能是一个方法,在这里我们就要在方法中做下区分

app被杀死

这个时候会走didReceiveRemoteNotification这些的方法(有很多人认为不会走,经过测试这个是会走的),但是这这里面写跳转什么的 ,就有点比较难处理了,因为didFinishLaunchingWithOptions这个方法没有走,先走的didReceiveRemoteNotification再走的 didFinishLaunchingWithOptions 。这时候很多app的基本设置,比如做的跟视图,自动登陆,等等很多的注册什么的都还没执行,就直接跳转这个是很麻烦的处理起来,所以在这里直接在下面的方法中做处理

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
复制代码

至此,这几种情况就处理完了,总结下就是 app 在前台,后台,杀死,点击推送为本地,远端。 做不同的处理。 1.前台在收到消息的时候做相应的处理比如转本地推送,弹窗提醒等 2.后台是在点击消息的时候做处理(因为后台的时候推送消息过来之后,的展示苹果已经帮我做好了,直接处理点击挑战就行了,当然如果是本地推送那是我们自己做处理的) 3.杀死的时候点击消息启动在 didFinishLaunchingWithOptions 做相应的跳转处理。

希望这篇文章能够帮到你,总结的有点乱,有疑问的地方欢迎留言。

转载于:https://juejin.im/post/5b4f0828e51d45195423c585

iOS 点击推送消息跳转指定界面 —总结篇相关推荐

  1. iOS点击推送消息跳到应用指定页面

    现在的推送用的越来越频繁,几乎每个应用都开始用到了.其实又有几个用户会去看推送消息呢?没办法,产品经理最大啊,只是苦了我们这一帮程序员啊!闲话少说,进入正题.兄弟我用的是极光推送,自然是以极光推送为例 ...

  2. 微信公众号消息推送开发(模板消息):点击推送消息跳转到网页或者小程序(三)

    需求场景: 点击推送的消息后跳转到小程序中的某个页面,或者跳转到某一个网页上,例如有这样一个需求,在商城平台购买产品后,需要通过公众号给用户推送订单详细并且点击消息可以看到对应的订单详情.以下我将在微 ...

  3. android点击按钮打开一个网页,Android实现H5点击打开app或跳转指定界面

    Android实现H5点击打开app或跳转指定界面 本文原创,转载请注明出处.欢迎关注我的 简书. 安利一波我写的开发框架:MyScFrame喜欢的话就给个Star 场景 H5界面中的入口 有时候为了 ...

  4. android点击通知跳转到服务,Android 接收推送消息跳转到指定页面的方法

    问题的提出 本次接入的是个推,其他家的推送没有研究过,思路应该是类似的 App在前台,这个时候需要弹出一个对话框,提醒用户有新的消息,是否要查看,查看的话跳转到指定页面 App在后台,或是App进程已 ...

  5. iOS:极光推送控制器跳转

    在前面已经做完了极光消息的推送,那么有消息了,如何跳转到需要的控制器呢?其实,主要还是在userInfo这个消息里面做判断来处理,具体如下: 下面这两个是远程推送时接收消息的方法,这是应用程序提供的方 ...

  6. Android,ios,安卓app推送消息通知,java后台向手机推送app的通知教程

    文章目录 一.业务介绍 1.1 产品简介 1.2 名词解释 1.3 消息推送流程 二.应用创建 三.客户端 SDK 集成 3.1 Android 3.2 iOS 四.服务端推送 4.1 服务端消息下发 ...

  7. 【IOS】ios8推送消息注册

    2019独角兽企业重金招聘Python工程师标准>>> @implementation AppDelegate- (BOOL)application:(UIApplication * ...

  8. 极光推送android点击跳转页面,app关闭时点击推送消息实现页面跳转

    func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: ...

  9. ios点击推送闪退_苹果推送iOS 14.2 beta 1:千万别更新,大批应用闪退

    大家好,我是佚名.苹果昨天才推送iOS14 正式版系统.而在今天又推送了iOS 14.2 beta 1 开发者测试版系统.由于这个版本问题非常明显,所以我先说结论: 千万不要更新! 千万不要更新! 千 ...

最新文章

  1. 计算机编程语言python-PYTHON之计算机语言基础知识 —— 编程语言的分类
  2. 用宏定义实现函数值互换
  3. 开源内容管理系统 php mysql_30 个很棒的PHP开源CMS内容管理系统小结
  4. mysql备份恢复出错_MySQL:MySQL备份失败,原因和解决方式
  5. iptables failed: iptables --wait -t nat -A DOCKER -p tcp -d 0/0 --dport 9443 -j DNAT
  6. 使用 GreenSock 来制作 SVG 动画
  7. oracle startup open ora 03113,Oracle 11g startup时报ORA-03113通信通道的文件结尾
  8. win7系统下使用虚拟机安装专利电子申请客户端(CPC软件)以及专利文件生成过程
  9. stmt php,PHP mysqli_stmt_free_result() 函数用法及示例
  10. 第二人生的源码分析(2)第二人生的基本功能
  11. Eric6中使用PYQT5在窗口显示图片
  12. hark others by kalilinux
  13. 两台虚拟机互相ping通(互相通讯)
  14. 开学“收心”指南来了
  15. 数据结构(C语言)-广义表
  16. 计算机可以存储人类记忆吗,神经科学:人类大脑是否100%在工作?人类记忆是否有极限?...
  17. 《肖申克的救赎》到底救赎了什么?谁在救赎?
  18. HIVE常见面试题以及实战练习(六)
  19. 图库highcharts联合jquery ajax 后端取数据前端图表渲染
  20. 二进制八进制相互转换

热门文章

  1. aws终止实例后还收费吗_因 AWS 数据中心断电,1TB 数据丢失了
  2. CAR-T治疗的临床前药理学模型
  3. 视觉SLAM学习--相机成像模型及标定
  4. 编程之美系列之一——阶乘的运算
  5. python单例_python 单例模式
  6. 与Oracle配套组件,oracle 组件和体系结构
  7. CMD中文乱码出现的原因及解决办法
  8. Python 保存数据到 Exel
  9. Python 网络爬虫笔记4 -- 信息标记与提取
  10. 工业用微型计算机(8)-指令系统(5)