文档章节

推送随记

小黑202
 小黑202
发布于 2016/06/28 17:55
字数 1233
阅读 43
收藏 0
点赞 0
评论 0

1.有没有收到通知就立刻调用的方法

有的。如果您的App打开了background mode里的Remote Notifications项,那么当APNS的payload里指定content-available键为1时,且你的APP在后台或前台运行时/甚至你的App没有运行(但前提是用户没有通过强制关闭的方式关掉你的APP,也就是双击Home键能看到你的APP时),iOS会调用您app delegate里的

-(void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo fetchCompletionHandler:(void (^)(UIBackgroundFetchResult))completionHandler

2.如果你的程序在未启动的时候,如果用户点击通知,notification会通过didFinishLaunchingWithOptions:传递给您,如果用户未点击通知,则didFinishLaunchingWithOptions:的字典里不会有notification的信息,同理,如果你的程序正在后台运行,如果用户点击通知,则(void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo会在你的程序进入前台后才会被调用(注意是通过点按通知启动才会被调用)如果用户收到了通知但是没有点按通知,而是点击屏幕上的App图标进入的app,则(void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo不会被调用,里面的代码不会被执行。

3.补充:-(void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo不仅仅是用户点击推送进入app时候会被调用,用户在前台的时候收到推送通知的时候,推送不会显示,但是该过程也会被调用,所以需要在这个地方注意一下。可以判断一下程序是刚刚进入前台,还是已在前台。并选择是否通知viewController。

4.

如果程序通过点击推送启动,而非从后台唤醒,那么userInfo可以通过 -(BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions 这个代理方法里的 launchOptions[@"UIApplicationLaunchOptionsRemoteNotificationKey"] 得到

5.

- (void)application:(UIApplication *)application handleActionWithIdentifier:(NSString *)identifier forRemoteNotification:(NSDictionary *)userInfo withResponseInfo:(NSDictionary *)responseInfo completionHandler:(void (^)())completionHandler {

if ([identifier isEqualToString:foregroundActionidentifier]) {

NSLog(@"ios9点击了前台模式");

}

completionHandler();

}

6.App状态

根据application.applicationState的状态,判断执行哪种动作。

UIApplicationStateActive, // 激活状态,用户正在使用App
    UIApplicationStateInactive, // 不激活状态,用户切换到其他App、按Home键回到桌面、拉下通知中心
    UIApplicationStateBackground // 在后台运行

7.http://www.cocoachina.com/industry/20140528/8582.html

7.1用户看到消息之后,点击了一下action按钮或者点击了应用图标。如果action按钮被点击了,系统会通过调用application:didFinishLaunchingWithOptions:这个代理方法来启动应用,并且会把notification的payload数据传递进去。如果应用图标被点击了,系统也一样会调用application:didFinishLaunchingWithOptions:这个代理方法来启动应用,唯一不同的是这时候启动参数里面不会有任何notification的信息。

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions 
{ 
    // do initializing works 
    ... 
     
    if (launchOptions) { 
        // do something else 
        ... 
     
        [AVAnalytics trackAppOpenedWithLaunchOptions:launchOptions]; 
    } 
     
    [application registerForRemoteNotificationTypes:UIRemoteNotificationTypeBadge | UIRemoteNotificationTypeAlert | UIRemoteNotificationTypeSound]; 
 
    return YES; 
} 

7.2

如果远程消息发送过来的时候,app正在运行,这时候会发生什么呢?

app代理的application:didReceiveRemoteNotification:方法会被调用,同时远程消息中的payload数据会作为参数传递进去。

- (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo { 
    if (application.applicationState == UIApplicationStateActive) { 
        // 转换成一个本地通知,显示到通知栏,你也可以直接显示出一个alertView,只是那样稍显aggressive:) 
        UILocalNotification *localNotification = [[UILocalNotification alloc] init]; 
        localNotification.userInfo = userInfo; 
        localNotification.soundName = UILocalNotificationDefaultSoundName; 
        localNotification.alertBody = [[userInfo objectForKey:@"aps"] objectForKey:@"alert"]; 
        localNotification.fireDate = [NSDate date]; 
        [[UIApplication sharedApplication] scheduleLocalNotification:localNotification]; 
    } else { 
        [AVAnalytics trackAppOpenedWithRemoteNotificationPayload:userInfo]; 
    } 
} 

8.应用图标上红色数字消失,设置 UIApplication.applicationIconBadgeNumber 属性为0

一般我们会选择在应用启动的时候(application:didFinishLaunchingWithOptions:方法中),或者干脆一点,在应用每次被切换到前台的时候(applicationWillEnterForeground:方法中),调用这一行代码,即可立刻清除掉Badge数字了。

9.应用该怎么响应推送消息 

上面说的处理流程,只能简单展示一下远程消息,激活用户让他们重新回到app中来。但是有时候,我们希望带给用户更好的使用体验,譬如如果我们告诉用户:张三刚刚评论了你的照片。这时候用户如果点击action按钮进入app,我们是展示具体的评论页面为好,还是展示通常的启动页面然后让用户自己去找张三的评论好?我想负责任的开发者都会选择前者。

要做到灵活响应不同类型的通知消息,我们需要在通知的payload中增加更多信息,而不能仅仅只有alert出来的文字信息。对于AVOS Cloud消息推送平台来讲,就需要开发者使用更高级功能的JSON格式。譬如我们发送这样的json字符串{"action":{"type":4},"alert":"hello, everyone”} 最终在app内会收到这样的UserInfo Dictionary:

{ 
    action =     { 
        type = 4; 
    }; 
    aps =     { 
        alert = "hello, everyone"; 
        badge = 4; 
    }; 
} 

“hello, everyone”会显示到alertView中,但是整个Dictionary会通过launchOptions传递给application: didFinishLaunchingWithOptions: 方法,这样我们在程序里面就可以对不同的消息实现不同的跳转了。

© 著作权归作者所有

共有 人打赏支持
小黑202
粉丝 7
博文 119
码字总数 35405
作品 0
西安
程序员
webstorm快捷键

默认配置下的常用快捷键 查找/代替 快捷键 说明 ctrl+shift+N 通过文件名快速查找工程内的文件(必记) ctrl+shift+alt+N 通过一个字符快速查找位置(必记) ctrl+F 在文件内快速查找代码 F3...

GM_LV ⋅ 2013/07/14 ⋅ 0

Linux Deepin系统更新记录(2014-03-19)

今日,Linux Deepin 2013进行了系统更新推送,下面是系统更新解决的部分问题与软件更新情况,供大家参考。 Bug修复 0003026: 深度终端 右键菜单清屏无效. 修复bug:桌面应用程序组不能通过拖...

cxbii ⋅ 2014/03/19 ⋅ 4

Git命令小记

一、git常用命令 1、push git push <远程主机名> <本地分支名>:<远程分支名> 注意:git pull是<远程分支>:<本地分支>,而git push是<本地分支>:<远程分支>。 1.1 push当前分支: git push o......

rathan0 ⋅ 2015/07/29 ⋅ 0

推送案例

一:下面是本人在工作中的一点随记,方便以后查用,其中需要您的App打开了background mode里的Remote Notifications项,且需要APNS的payload里指定content-available键为1时 1.AppDelegate+...

小黑202 ⋅ 2016/07/12 ⋅ 0

基于Laravel的GTD Web 应用--Montage GTD

Montage GTD 一个基于Laravel 集RSS阅读、思维导图、番茄工作法于一体的GTD Web 应用 快速体验 访问 https://task.congcong.us 技术相关 支持PHP7 Mysql5.5运行环境 基于Laravel 5.2框架 实现...

EdisonAn ⋅ 2017/08/03 ⋅ 1

A/B 测试工具--PlanOut

PlanOut 是 Facebook发布的一部分A/B测试源码,帮助数据科学家和其它职工轻松构建、管理和验证A/B测试。为了搞清楚哪个功能或设计更好,每个网站或移动应程序的数据科学家都离不开A/B测试工具...

叶秀兰 ⋅ 2015/04/14 ⋅ 0

无忧之道:Docker中容器的备份、恢复和迁移

今天,我们将学习如何快速地对docker容器进行快捷备份、恢复和迁移。Docker是一个开源平台,用于自动化部署应用,以通过快捷的途径在称之为容器的轻量级软件层下打包、发布和运行这些应用。它...

奔跑的阿飞 ⋅ 2017/08/30 ⋅ 0

Git 小团队的协作 (二)

Git 分享是最好的记忆--如需转发请注明出处[强调]:共同学习 共同进步 不喜勿喷 Git 小团队的协作 (二) 小团队如何利用git协作开发呢?对此我想总结一下自己的经验, 也算是记个笔记吧。 我...

ElyarAnwar ⋅ 01/08 ⋅ 0

C#之RabbitMQ系列(二)--Hello World

生产者–消费者模式 上一篇讨论了如何搭建我们的开发环境,无论使用哪种语言,服务的部署肯定都是相同的。 摘自官网:RabbitMQ is a message broker. In essence, it accepts messages from ...

andrewniu ⋅ 05/09 ⋅ 0

我使用NHibernate在.NET中遇到的问题一记!

.Net ORM映射框架 NHibernate,本来是Java的东西,一群牛B轰轰的码农,移植到了.NET平台、是个非常不错的 ORM 映射框架、 故事开始啦 ~_~ ! 下班的钟声已经敲响了,远远望去。打卡机处排着长...

点儿都不扯 ⋅ 2015/03/27 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

linux 安装docker

通过以下命令下载安装docker wget -qO- https://get.docker.com | sh 执行以上命令后输出以下内容说明安装成功,注意红框中的内容,docker安装成功后默认只有root能使用,红框中给出的提示是...

haoyuehong ⋅ 10分钟前 ⋅ 0

482. License Key Formatting - LeetCode

Question 482. License Key Formatting Solution 思路:字符串转化为char数组,从后遍历,如果是大写字母就转化为小写字母,如果是-就忽略,如果遍历了k个字符(排除-)就追加一个-。 Java实现...

yysue ⋅ 28分钟前 ⋅ 0

聊聊spring cloud gateway的LoadBalancerClientFilter

序 本文主要研究一下spring cloud gateway的LoadBalancerClientFilter GatewayLoadBalancerClientAutoConfiguration spring-cloud-gateway-core-2.0.0.RELEASE-sources.jar!/org/springfram......

go4it ⋅ 53分钟前 ⋅ 0

详解:Nginx反代实现Kibana登录认证功能

Kibana 5.5 版后,已不支持认证功能,也就是说,直接打开页面就能管理,想想都不安全,不过官方提供了 X-Pack 认证,但有时间限制。毕竟X-Pack是商业版。 下面我将操作如何使用Nginx反向代理...

问题终结者 ⋅ 59分钟前 ⋅ 0

002、nginx配置虚拟主机

一、nginx配置虚拟主机可分为三种方式,分别为: 1、基于域名的虚拟主机,通过域名来区分虚拟主机——应用:外部网站 2、基于端口的虚拟主机,通过端口来区分虚拟主机——应用:公司内部网站...

北岩 ⋅ 今天 ⋅ 0

shell脚本之死循环写法

最近在学习写shell脚本,在练习if while等流程控制时,突然它们的死循环写法是怎么样的?经过百度与亲测记录如下: for死循环 #! /bin/bashfor ((;;));do date sleep 1d...

hensemlee ⋅ 今天 ⋅ 0

苹果的ARKit2.0有多可怕,看了就知道

序言 ARKit主要由三部分组成: 跟踪(Tracking) 跟踪是ARKit的核心组件之一,其提供了设备在物理世界中的位置与方向信息,并对物体进行跟踪,如人脸。 2.场景理解(Scene Understanding) 场...

_小迷糊 ⋅ 今天 ⋅ 0

5.1 vim介绍 5.2 vim移动光标 5.3 ,5.4vim一般模式下移动光标,复制粘贴

vim命令 vim是vi的一个升级版;vim可以显示文字的颜色 安装vim这一个包vim-enhanced 如果不知道安装包,可以使用 命令下面命令来查看vim命令是那个包安装的。 [root@linux-128 ~]# yum prov...

Linux_老吴 ⋅ 今天 ⋅ 0

vim一般模式

vim 是什么 vim是什么 ? 在之前接触Linux,编辑网卡配置文件的时候我们用过了vi ,vim简单说就是vi的升级版,它跟vi一样是Linux系统中的一个文本编辑工具。 如果系统中没有vim ,需要安装一...

李超小牛子 ⋅ 今天 ⋅ 0

docker实战

构建企业级Docker虚拟化平台实战 重点剖析虚拟化和云计算概念; 分析Docker虚拟化的概念和原理; 从0开始实战Docker虚拟化平台; 基于Docker构建Nginx WEB服务器和CentOS虚拟机; 基于开源监...

寰宇01 ⋅ 今天 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部