为什么接入了极光推送后,测试却收不到消息?是客户端配置问题?还是服务端推送的问题?

一、官网推送正常收到,调 API 推送收不到,或反之

说明:其中之一推送可以正常收到,代表客户端集成没有问题。

对比 web 与 API 推送历史 - 详情中的推送内容的区别,常见情形如下:

  1. iOS 环境不一致问题:API 推送消息给 iOS,需要设置 apns_production 指定推送的环境,false 为开发,true 为生产。
  • 消息详情中,推送平台 ios 代表开发,ios-product 代表生产,还可以从 options →"apns_production 字段的值来辨别。

  • 如果 API 推送传的是 true,但消息详情中却显示的 false(官网详情显示的内容是实际传递给极光的值),那么需要检查 API 推送的代码,是否有覆盖、引用、修改的代码和实际调用的代码不一致等问题

  1. Appkey 不一致:官网在应用设置中查看 Appkey,调 API 推送在调用验证处查看所传 Appkey,客户端配置的 Appkey 会在 log 中打印出来。推送使用的 Appkey 必须和客户端配置的一致。

  2. 推送目标不一样:例如官网是给 registrationID 推送 / 广播推送,API 是给别名推送

  3. 没有给 Android 或者 iOS 传值:推送的有效目标只有 iOS 设备,但 Notification 中只给 Android 传参,则 iOS 肯定收不到,或反之。

  4. alert 为空(通知内容为空):若该字段为空(或 iOS 的 alert 中的 body 为空),则 Notification 消息不会展示。

  5. 其中一个推送的是自定义消息:自定义消息默认不展示,阅读本帖

二、收到了通知消息但是不展示

这种情况一般是在客户端日志中已看到打印的消息内容,但是手机通知栏上就是没有提醒。

2.1 通用检查项

  1. alert 为空,则默认不展示 ,在控制台里就是此处应填:

null

  1. 请首先注意 测试手机 对 App 通知展示 的各种设置是否有打开。

  2. 手机是否开启了 勿扰模式

  3. 极光在 Android 或 iOS 新系统发布之后会以最快的速度发布兼容版本,请注意更新到最新版本的 SDK

2.2 Android 检查

  1. Android 8 系统,设置 targetSDKVersion>=26 时,华为手机可能不弹出通知,因为华为未兼容 Android 8.0 通知 Channel ,后续他们的修复情况暂时未知。可以尝试降低 targetSDKVersion

  2. 小米手机,muui10 有通知过滤功能。在设置->通知和状态栏 关闭通知过滤。

  3. 「魅族和小米:有个消息盒子」,将一些不重要的信息或者屏蔽的信息放在里面(如何让消息盒子的消息正常显示在通知栏

null

2.3 iOS 检查

  1. iOS 10 以前的系统,只能当 App 处于后台或杀死状态,收到消息才会有提醒。
  • iOS 10 可以实现当 App 处于前台时 展示通知,如下方法:(若不想展示,则不实现即可)

- (void)jpushNotificationCenter:(UNUserNotificationCenter *)center willPresentNotification:(UNNotification *)notification withCompletionHandler:(void (^)(NSInteger))completionHandler
  • 前台展示通知,可添加三种提醒(可自行选择几种实现,不写 alert 则不会有横幅提醒)

completionHandler(UNNotificationPresentationOptionBadge | UNNotificationPresentationOptionSound | UNNotificationPresentationOptionAlert);
  1. iOS杀死或者后台状态下的横幅声音等的控制
  • 注册 apns 代码中有提供类型选择:

entity.types = JPAuthorizationOptionAlert|JPAuthorizationOptionBadge|JPAuthorizationOptionSound;
  • 可能出现的问题:在之前开发过程中,选择过某提醒类型安装在 iOS 8 系统上 ,之后去掉该类型重新安装依旧有这个类型提醒,这是因为 iOS 8 的特性:

  • iOS 8 如果之前安装请求过通知权限,允许,之后一段时间内(具体不详)都不会再提示,会记住你之前的选择。

  • 你可以试着先把通知提醒的开关都关掉,然后卸载重装下;或者换一台没有安装过的 iOS 8 安装测试。

三、Android 设备收不到消息

3.1 首先确认推送是否是成功的,消息是否是正确的

  1. 调 API 推送或官网推送时,官网是否显示已成功, API 是否返回 HTTP code 200 和 msgid

  2. 是否调用的是推送校验的 API ,消息实际没有推送出去

  3. 若失败,官网会在页面上方提示,API 会返回错误码,根据错误码在列表中 找到报错原因,在社区搜索该报错有更详细的排查步骤。

  4. 你 API 推送消息所使用的 Appkey 是否与你客户端配置的 Appkey 不一致?请仔细检查。

  5. 推送时 通知内容(Alert)是否为空 ,官网图示,为空则不展示

  6. 你是否推送的是自定义消息而不是通知消息,自定义消息默认不展示

3.2 其次确认客户端是否已经集成成功

  1. 确认 AppKey(在官网创建应用时生成的)已经正确的写入 Androidmanifest.xml

  2. 是否可以获取到 RegistrationID 的值 (能取到表示集成成功),若取不到 ID 请获取一下客户端日志信息,是否有报错内容,将日志信息提供给官方分析。

3.3 最后确认客户端是否可以正常接收 / 展示推送消息

  1. 确认测试手机(或者模拟器)已成功连入网络(可以切换网络来判断是否该网络运营商有问题)

  2. 请使用接口 isPushStopped 来检查 是否调用了stoppush,若是请调 resumepush 进行恢复

  3. 检查手机的应用高级设置中是否设置了“允许推送时间”

  4. 手机的应用中是否勾选了“显示通知”

  5. 手机 - 设置 - 通知栏 -是否选择了横幅提醒

  6. Android 8 系统,设置 targetSDKVersion>=26 时,华为手机可能不弹出通知,因为华为未兼容 Android 8.0 通知 Channel ,后续他们的修复情况暂时未知。可以尝试降低 targetSDKVersion

  7. 小米手机,muui10 有通知过滤功能。在设置->通知和状态栏 关闭通知过滤。

3.4 Android 处于后台 / 黑屏状态下收不到推送

  1. 确认此时长连接是不是已经断开,Android 是长连接的机制,必须 App 和极光服务器建立了连接才能收到推送;断网(或连的是内网,网络有限制,网络有波动,弱网环境)、关机、进程不在、主动调用了 stopPush 服务等,长连接都会断开,都没法收推送。

  2. 长连接状态的判断

  3. 极光的 SDK 会有自启动机制(心跳时间间隔是 4 分 50 秒),也支持进程间互相拉起功能,但是会受到系统本身的限制,即不保证一定能自启动和拉起成功。

  4. 极光从 3.1.6 版本开始提供通道共享功能 ,建议更新。

3.5 Android 中极光推送后台服务被杀死后不能自动重启

  1. Android 原生系统,没有 root,用 home 键上滑杀进程等其他系统自带的停止方式,都可以自启动,一般 10s 内恢复。但如果是强行停止就只能用户自己手动开启应用

  2. 如果是 miui 等第三方系统,杀了进程默认无法自启动

  3. 如果是 root 过的原生系统,杀了进程也是没有办法自启动的

3.6 手机系统限制说明

  1. 「关于应用长存的探讨」

  2. 「Android 第三方 Rom 的限制说明」

  3. 「部分系统的特殊限制问题」

  • 测试时,设置了权限不代表划掉应用马上推送应用就马上可以收到

  • 给权限的目的是让进程、服务可以重启,但是能不能重启,什么时间后才重启成功,重启后对长连接还有没有连接限制等都是要考虑的

  • 最终能和极光服务器建立起长连接 才是他是否可以收到消息的评判标准

  1. 「EMUI 4.1手机系统权限说明」 :需要注意手机自带的手机管家里面,有省电选项

  2. 「魅族和小米:有个消息盒子」,将一些不重要的信息或者屏蔽的信息放在里面(如何让消息盒子的消息正常显示在通知栏

null

  1. 「奇酷【360 OS】手机默认是不允许通知:」
  • 应用通知管理:开启“允许通知”后才能显示通知。

  • 冷藏室:应用被加入冷藏室后,会被自动结束进程,就收不到消息了。

  1. Android 8 系统,设置 targetSDKVersion>=26 时,华为手机可能不弹出通知,因为华为未兼容 Android 8.0 通知 Channel ,后续他们的修复情况暂时未知。可以尝试降低 targetSDKVersion

3.7 为什么微信或者 QQ 等应用看似可以保证不被杀死或者杀死后可以收到消息

  1. 如果将他们完全彻底的杀死,也是收不到的,这是肯定的

  2. 只是:他们很难被杀死,即便杀死后也会以较快的速度重启:我们(用户)会下意识的在手机里开启对他们的保护;他们是不少手机系统的自带软件。

3.8 手机系统厂商通道接入

  1. 我们已接入「小米推送」、「华为推送」「魅族推送」「Google FCM」「OPPO 推送」等市场上已有的 5 种系统推送,在 App 杀死时,你通过极光推送发的消息,在这 4 种手机上,会自动走系统推送下发消息。

  2. 有该功能需求,可联系商务获取资料和开通,联系渠道:

  • 商务渠道:QQ 公众号:800024881,电话:400-612-5955,邮箱:sales@jpush.cn

  • 在 QQ 群私信 JPush 提供如下信息

  • 公司名称:

  • 地区(我们是分区域进行联系的,如果是有总公司、分公司,那么提供您将会付费的公司所在区域):

  • 您贵姓:× 先生/女士

  • 联系方式(为迅速联系,请提供您的电话):

  • 您的需求(所需开通的服务,需要咨询的内容):

  • 您的应用是什么类型的,有没有上线,应用的 Appkey:

  1. 该功能的技术支持请直接对接 VIP 支持,官方 QQ 群对此不作支持。

  2. 当然,你也可以自己单独的去集成每个系统推送的官方 SDK ,只是这样你需要分别手动进行推送。

四、iOS 设备收不到消息

4.1 首先确认推送是否是成功的,消息是否是正确的

  1. 调 API 推送或官网推送时,官网是否显示已成功, API 是否返回 HTTP code 200 和 msgid

  2. 是否调用的是推送校验的 API ,消息实际没有推送出去

  3. 若失败,官网会在页面上方提示,API 会返回错误码,根据错误码在列表中 找到报错原因,在社区搜索该报错有更详细的排查步骤。

  4. 你 API 推送消息所使用的 Appkey 是否与你客户端配置的 Appkey 不一致?请仔细检查。

  5. 你是否推送的是自定义消息而不是通知消息自定义消息只有当 App 处于前台时才会接收,且默认是不展示的

  6. 推送时 通知内容(Alert)是否为空 ,官网图示,为空则不展示

  7. 推送时选择的环境与测试设备的打包环境必须一致两种环境的正确测试姿势点我

  8. API 推送的时候通过参数 apns_production 来指定推送环境,false 为开发环境,true 为生产环境。V3 api不带此参数则默认为生产环境,V3 API 封装的 SDK 默认设定为开发环境。如果调 API 时有手动传 apns_production 则以此值为准。参数的文档说明

4.2 其次确认客户端是否已经集成成功

  1. 确认 AppKey 在 SDK 客户端的设置与 官网应用信息 上的是一致,其他环节也按照文档正确地操作。

  2. 检查 官网 上上传的证书,是 APNs (Push) 证书,参考 iOS 证书设置指南 ,且官网证书状态为已验证。

  3. 是否可以获取到 RegistrationID 的值 (能取到表示集成成功),若取不到 ID 请获取一下客户端日志信息,是否有报错内容,将日志信息提供给官方分析。

  4. 是否可以取到 token 值并上报 token 给极光成功?从 3.0.9 版本开始 ,在未取到 token 的情况下也会取到 registrationID ,可以使用自定义消息,但无法收到通知,请务必查看客户端日志检查 token 的获取情况。取不到 token 的排查点我

  5. 初始化代码中 apsForProduction:isProduction 的值需要与客户端的证书环境保持一致。

  6. 客户端配的 bundleID 和极光官网配的 bundleID 必须一致才能收到 Notification 通知消息。着重注意检查 Bundle ID 的一致性

4.3 最后确认客户端是否可以正常接收 / 展示推送消息

  1. 在官网推送历史详情中看到目标已送达,代表极光已成功的将信息发给了 Apple 服务器,等待 Apple 服务器的处理

  2. 确认测试手机已成功连入网络(可以切换网络来判断是否该网络运营商有问题),如果设备离线,期间推送多条,APNs 服务器只会离线保留一条(极光服务器对自定义消息离线可保留 5 条)

  3. Apple 服务器对 apns 消息并不保证 100% 送达,特别是高峰期、网络波动时做高频推送会出现漏消息的情况。Apple 网络要求

  4. iOS 不支持在模拟器上测试推送功能,因为没法获取到 token 值。

  5. 检查是否调用了反注册代码 [[UIApplication sharedApplication] unregisterForRemoteNotifications];

  6. 客户端处于前台运行状态还是后台,iOS 10 系统以下处于前台,收到通知不会提醒。

  7. 是否在某种操作下调用了清除角标的 API ,角标清除,通知栏消息就会马上消失

  8. 手机端—设置—通知—提醒方式是否设置了横幅提醒

  9. 初始化注册时的提醒类型选择了 alert 了没有:entity.types = JPAuthorizationOptionAlert|JPAuthorizationOptionBadge|JPAuthorizationOptionSound;

  10. XCode 8 以上有一个新的功能,开启后才能收到推送通知

null

  1. 「使用 JPush iOS SDK 注意事项」 ,强烈建议阅读。

  2. 可以对比测试 官网推送 和 API 推送,若只有某一方收不到,请对比推送历史—详情—找到两条消息的区别

  3. 安装的应用同一时间只能收到一个环境的 APNS 消息。如果能收到生产的通知,说明应用当前环境是生产的,那此时就无法收到开发环境的通知,反之亦然。

五、联系官方排查所需信息

如根据上述说明自查未果,提供收不到消息的设备的 registrationID(必要!) 和推送的消息的 MessageID(收到的和未收到的)给官方人员查询定位。

  1. Message ID(调用 API 请求成功后会返回 msgid ,官网 - 推送历史 - 操作 - i 详情里面也可以查看该信息,如果查不到历史请注意筛选条件,历史只保存 30 天)
    null
  2. 测试设备的 registrationID(不管是广播、别名、标签还是其他方式推送,均必须提供该信息,只有 registrationID 才能精准定位到你的设备),该信息只能在客户端调 API 获取,服务端无法取到,服务端若需存储请让客户端获取后上传 。

如果对你有帮助,点个赞呗 ლ(╹◡╹ლ)

不吹不黑,关注「常见问题」专栏可以解决你 90% 的问题 (ノ◕ω◕)ノଘ_ଘ

如果还有你想知道的问题没有总结方案,来评论区跟我交流交流吖