新来的一家公司,昨天和同事解决推送问题(工程里有集成百度推送和环信即时通讯),信誓旦旦的声称:" app在前台和后台运行时,推送触发的是didReceiveRemoteNotification事件, app在杀死状态时,推送触发的是didFinishLaunchingWithOptions事件"结果通过一阵试验之后,啪啪打脸了.居然都走了:"

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

"这个代理方法
因为众多项目中都是以这个为认知来做的,并且没有发生过任何问题,我表示不服了.在通过一系列的排查之后.冷静的去看了"

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

"的苹果相关注释.
注释是这样的:This delegate method offers an opportunity for applications with the "remote-notification" background mode to fetch appropriate new data in response to an incoming remote notification. You should call the fetchCompletionHandler as soon as you're finished performing that operation, so the system can accurately estimate its power and data cost.

This method will be invoked even if the application was launched or resumed because of the remote notification. The respective delegate methods will be invoked first. Note that this behavior is in contrast to application:didReceiveRemoteNotification:, which is not called in those cases, and which will not be invoked if this method is implemented.

话说这个方法其实7.0之后就已经有了,算是人性化的一个更新吧,然而萌萌的我并不知道.一直在分别实现didReceiveRemoteNotification和didFinishLaunchingWithOptions;

顺便提醒大家一句,现在市面上的博客里面大部分还是和我一样的认知状态,互相转载也好,没有踩到也罢.反正我这次是栽了,一顿饭出去了并且深深地毁我三观啊.

本人之前做的项目一直都是使用信鸽推送,并贴出信鸽文档如下:

iOS推送结果

  1. app在前台运行时,不弹出推送框,但是app通过代码可以获取到推送的消息。

  2. app在后台运行或者杀死状态时,会弹出推送框并且可以通过代码获取到推送的消息。

  3. app在前台和后台运行时,推送上报触发的是didReceiveRemoteNotification事件。

  4. app在杀死状态时,推送上报触发的是didFinishLaunchingWithOptions事件。

用户能接收到的如下:

  1. 用户进入App,按home键,发送信鸽消息,可以接收到弹窗和通知中心的通知;

  2. 用户进入App,按home键,进程杀掉,可以接收到弹窗和通知中心的通知;

  3. 用户进入App,保持在App中,后台可以接收到信鸽消息,但是前台没有弹窗和通知中心通知。

声明一下,这个说法确实是有问题的.虽然杀死状态下,点击推送条启动应用时didFinishLaunchingWithOptions的

launchOptions参数里确实包含推送信息.但是现在的系统原生方法并非只走didFinishLaunchingWithOptions了.切莫在didFinishLaunchingWithOptions和didReceiveRemoteNotification:fetchCompletionHandler方法中同时实现

实现方式:didReceiveRemoteNotification与didFinishLaunchingWithOptions分别实现远程推送处理或者直接didReceiveRemoteNotification:fetchCompletionHandler方法处理

顺便提醒一下萌新,即时通讯时候聊天消息注意区分远程推送和本地推送,响应代理方法不同,在此不多说了,主要记录一下今天这个坑.

iOS推送的众多坑的更多相关文章

  1. 手把手教你搞定个推iOS推送SDK集成

    以下是一位开发者在集成个推iOS推送SDK过程中的真实经历. 作者:Ezreallp 一次偶然的机会,公司的项目要用到推送,我自己本来就很懒,不愿意去弄整套APNS的流程,刚好之前跟朋友聊起过他们的产 ...

  2. iOS推送证书转pem文件

    iOS推送证书转 .pem文件. 推送证书转pem文件openssl x509 -in apns_miaobozhibo.cer -inform der -out apns_miaobozhibo.p ...

  3. IOS 推送-客户端处理推送消息

    IOS 推送-客户端处理推送消息 1.推送调用顺序 APN push的消息到达后,UIApplicationDelegate有两个方法和处理消息有关: 1)application:didReceive ...

  4. IOS 推送-配置与代码编写

    IOS 推送配置与代码编写 这里介绍IOS的推送,本文章已经在IOS6/7/8上都能运行OK,按照道理IOS9应该没问题. 大纲: 1.文章前提 2.推送介绍 3.推送文件账号设置 4.推送证书介绍 ...

  5. IOS 推送消息 php做推送服务端

    IOS推送消息是许多IOS应用都具备的功能,最近也在研究这个功能,参考了很多资料终于搞定了,下面就把步骤拿出来分享下: iOS消息推送的工作机制可以简单的用下图来概括: Provider是指某个iPh ...

  6. 友盟iOS推送配置(从真机调试到推送)

    下面我来讲解一下友盟iOS的推送配置,其实友盟只是一个示例,换做其余的第三方推送服务也会适用,只是第三方的后面服务变了而已. iOS推送(包括真机调试)所需要的步骤和文件如下: 备注:这里我将省略掉一 ...

  7. iOS 推送全解析

    本文旨在对 iOS 推送(以下简称 推送)进行一个完整的剖析,如果你之前对推送一无所知,那么在你认真地阅读了全文后必将变成一个推送老手,你将会对其中的各种细节和原理有充分的理解.以下是 pikacod ...

  8. “iOS 推送通知”详解:从创建到设置到运行

    这是一篇编译的文章,内容均出自Parse.com的iOS开发教程,同时作者还提供了视频讲解.本文将带领开发者一步一步向着iOS推送通知的深处探寻,掌握如何配置iOS推送通知的奥义. 介绍一点点背景资料 ...

  9. 转载:iOS 推送的服务端实现

    参考网址1: iOS消息推送机制的实现 http://www.cnblogs.com/qq78292959/archive/2012/07/16/2593651.html 参考网址2: iOS 推送的 ...

随机推荐

  1. vi命令的常用操作

    G:移动到底部 进入vi的命令 vi filename :打开或新建文件,并将光标置于第一行首 vi +n filename :打开文件,并将光标置于第n行首 vi + filename :打开文件, ...

  2. ServletConfig与ServletContext对象(接口)

    ServletConfig:封装servlet的配置信息. 在Servlet的配置文件中,可以使用一个或多个<init-param>标签为servlet配置一些初始化参数. <ser ...

  3. 为Android增加硬件抽象层(HAL)模块访问Linux内核驱动程序

    在Android硬件抽象层(HAL)概要介绍和学习计划一文中,我们简要介绍了在Android系统为为硬件编写驱动程序的方法.简单来说,硬件驱动程序一方面分布在Linux内核中,另一方面分布在用户空间的 ...

  4. Break on _NSLockError() to debug.

    *** -[NSCondition dealloc]: condition (<NSCondition: 0x1039a450> '(null)') deallocated while s ...

  5. [转]Android之Context和Activity互相转换

    1.context转换为activity Activity activity = (Activity) context; 2.从activity得到context 在activity的方法中用cont ...

  6. IE6 下 输入类型表单控件背景问题

    .box input{background:url(img/1.jpg) fixed} <body> <div class="box"> <input ...

  7. HDU1518:Square(DFS)

    Square Time Limit : 10000/5000ms (Java/Other)   Memory Limit : 65536/32768K (Java/Other) Total Submi ...

  8. Vim编辑器的使用和基本配置

    三种模式 1 命令模式 插入 a i o A I O 定位 gg G :n nG ngg $ 0 删除 x nx dd ndd dG 复制和剪切 yy-p dd-p 替换 r R 撤销和恢复 u Ct ...

  9. VS2013编译FileZilla0.9.44

    2014年,FileZilla更新了一下,到了44版本了,貌似也是用VS2013的工程做的项目,所以下载了server的安装包,然后安装SourceCode即可(需要安装InterFace,是安装必选 ...

  10. hdu_2688_Rotate(树状数组)

    题目连接:hdu_2688_Rotate 题意:给你n数,(n<=3e6),有两个操作,Q为 当前有多少对数,满足严格递增,R l,r为旋转l,r这个区间的数 题解:求严格递增的顺序对我们可以反 ...