iOS开发——推送跳转到指定页面

眨眼2016年就这么走到了结尾,再过两天新年就要开始了。回顾从2016年开始养成的写博客的习惯,一直能延续下来,保持了一整年,还是比较欣慰的一件事情。希望2017年自己的技术能够继续稳步的提升。

今天在这2016年的最后一篇博客里,咱来聊聊推送通知的跳转。

当推送通知到达时,点击推送通知跳转到指定界面,是很多应用都会碰到的一个需求,而要实现这个功能,解决的方法也很多,若是去谷歌搜索,有一个万能跳转的文章可能会进入您的眼帘,但是我实际的去看了这个项目的源码之后,感觉这个库有一定的局限性,用runtime实现跳转这不假,但是在请求字段里加上了ViewController的类名,这其实就是局限的地方了,毕竟除了服务咱们iOS端,你也得考虑考虑安卓端的攻城狮不是,然而如果你换一个约定的字段再来解析,那倒不如用URL来作为判断依据更为方便。

之前的几篇文章,我也在研究iOS开发的组件化的架构模式,也有的应用在走组件化的道路上使用了URL来跳转界面完成解耦,在实现推送时,我们也能沿用这个思路,用URL实现界面的跳转。关于使用哪个Router框架,其实真的是萝卜青菜各有所爱,很成熟的 JLRoutesroutable-iosHHRouterMGJRouter,在经过比较已经实际使用之后,我选择了MGJRouter这款蘑菇街开源的组件应用到项目中。为什么会选择MGJRouter这款组件呢,其实理由就跟他简单的介绍一样,高效、灵活。

来说一说这个基本的使用方式,首先你得跟后台约定推送的参数,比如我在跟后台的约定里,参数名就是url,那么我在拿到推送的userInfo时,就需要把url解析出来。在

 func application(application: UIApplication, didReceiveRemoteNotification userInfo: [NSObject : AnyObject], fetchCompletionHandler completionHandler: (UIBackgroundFetchResult) -> Void)

 func application(application: UIApplication, didReceiveRemoteNotification userInfo: [NSObject : AnyObject])

这两个方法中,你可以获取到userInfo,例如后端给我传了这样的推送消息

[aps: {
   alert = "\U6d4b\U8bd5\U7cfb\U7edf\U6d88\U606f";
   badge = 1;
   category = system;
   sound = "";
}, redirect: {
   data = "<null>";
   target = article;
   "target_id" = 5397;
   "target_url" = "lix://cms/articles/3333";
}, _j_msgid: 5228988433]

很清楚的看到我们需要拿到target_url这个字段,至于怎么解析JSON,我就不啰嗦了,假设此时我们已经拿到了urlurl其实为 lix://cms/articles/:id这个格式,3333是我们需要根据这个id跳转到的文章界面。

#pragma mark - 推送地址
static NSString *ARTICLES_URL = @"lix://cms/articles/:id";   //资讯详情

在定义好url的情况下,我们需要先用MGJRouter注册我们的url

+ (void)registerArticlePush {
   [MGJRouter registerURLPattern:ARTICLES_URL toHandler:^(NSDictionary *routerParameters) {
      //打印URL
       LixLog(@"routerParameterURL:%@", routerParameters[MGJRouterParameterURL]);
       //获取URL中的id
       NSString *id = routerParameters[@"id"];
       ArticleModel *model = [[ArticleModel alloc] init];
       model._id = id;
       ArticleDetailViewController *articleViewController = [[ArticleDetailViewController alloc] init];
       articleViewController.articleModel = model;
       //界面跳转
       [LixObjcRouter pushController:articleViewController];
   }];
}

这段代码可以当成一个完整的业务逻辑的范例,在写好业务逻辑之后,我们需要去AppDelegatefunc application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool里注册url

LixObjcRouter.registerArticlePush()

做完这些之后,咱们只要

 func application(application: UIApplication, didReceiveRemoteNotification userInfo: [NSObject : AnyObject], fetchCompletionHandler completionHandler: (UIBackgroundFetchResult) -> Void)

 func application(application: UIApplication, didReceiveRemoteNotification userInfo: [NSObject : AnyObject])

这两个方法里处理推送通知就好了,非常简单的一个Api

[MGJRouter openURL:url];

到这里,推送之后的页面跳转也就差不多完成了,只要再注意badge的数值处理,前台时推送通知的处理等情况就可以了。

用完蘑菇街的Router组件,又让我想接着啰嗦上次的组件化的思考了,用完这种方式,我还是觉得,如果把这个框架引入进行组件化,那么每次启动,都必须去注册这些url,如果小工程也没有组件化的必要,可是大工程,管理url又是一件费神的事情。

所以推送跳转,我选择MGJRouter,因为足够方便高效,可是组件化的道路,我更看好CTMediator这样彻底解耦的方式。感兴趣的自己搜索研究吧。

年前最后一篇,新年快乐,鸡年大吉吧。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏开源项目

Git 项目推荐 | 基于 C# 的极速 WEB + ORM 框架

NFine 是基于 C# 语言的极速 WEB + ORM 框架,其核心设计目标是开发迅速、代码量少、学习简单、功能强大、轻量级、易扩展,让Web开发更迅速、简单...

59880
来自专栏Youngxj

[安卓软件]sCploit黑客工具分享

35140
来自专栏H2Cloud

Base PyQt4, Simple Web APP Framwork

  长时间以来,一直针对Linux 服务器开发后台程序,每天面对的是黑框框,输出只有日志文件。偶尔需要模拟客户端测试,要么是写几行php代码,在浏览器上点一点,...

42540
来自专栏SAP最佳业务实践

SAP最佳业务实践:联产品的生产(235)-4联合生产

1、MIGO/MB31主产品、联产品收货 此活动的目的是过帐生产订单的收货。现在一个事务内可建议所有订单项目,并可同时进行过帐,而不再是一个产品。 角色仓库文员...

515100
来自专栏假装我会写代码

也来扯扯 Vue 单元测试

31630
来自专栏V站

Emlog丨西顾Grace主题免费开源-一款超卡哇伊的ACG主题

由一梦发布,主题如其名,和WordPress版的Grace主题有十分多的共同之处。

69750
来自专栏我叫刘半仙

高效访问海量地图数据--GeoServer手动发布本地Shapefile地图

地图数据以海量著称,传统的做法是建立空间索引,优化查询等,这些并没有解决如何有效的组织地图数据,提高地图访问效率的问题。用GeoServer可以在用户之间迅速共...

64070
来自专栏Android机动车

程序员必定会爱上的10款软件

TrueCrypt可能很多人没用过,它是一个加密软件,能够对磁盘进行加密。还在担心自己电脑中的重要文件、私密档案被人查看。什么,你以为把文件设置了隐藏属性别人就...

12420
来自专栏IMWeb前端团队

初尝 Jest 单元测试

最近的几次发布都犯了小错,都是缺乏或者忽视了测试所导致的。通常来说,一个新功能上线的时候,开发和测试都投入比较多,各项测试都是比较全面的。然而,发布上线也并非意...

33180
来自专栏我叫刘半仙

原 高效访问海量地图数据--GeoServer手动发布本地Shapefile地图

首先,本文实现的结果图给大家展现一下: ? 放大的样子: ? 颜色是通过属性中某个字段值来分级的,可以自定义。 上面功能是用ArcGIS切片好数据,在Geose...

49860

扫码关注云+社区

领取腾讯云代金券