Android SDK 调试指南

SDK 启动过程

  • 检查 AndroidManifest.xml 中是否有配置 AppKey,如果没有,则启动失败
  • 检查 Androidmanifest.xml 文件配置的正确性,必须要保证 “Android SDK 集成指南”中所有标注 “Required” 的部分都正确配置,否则启动失败
  • 检查 JPush SDK 库文件的有效性,如果库文件无效,则启动失败
  • 检查网络是否可用,建议使用 4G 测试,如果网络可用则连接服务器登录,否则启动失败
  • 登陆成功后可以从 logcat 中看到如下 log
    Android SDK 调试指南 - 图1

测试确认

  • 确认 Androidmanifest.xml 中所需的所有 “Required” 项都已经添加。如果有 "Required" 项未添加,日志会提示错误。
  • 确认 AppKey (在 Portal 上生成的) 已经正确的写入 Androidmanifest.xml 中,没写会有日志提示错误。
  • 确认在程序启动时候调用了 init(context)接口
  • 确认测试手机(或者模拟器)的网络可用,如果网络正常可用,客户端调用 init 后不久,应有登录成功(Login succeed)的日志信息,如 SDK 启动过程所示
  • 启动应用程序,登陆 Portal 系统,并向应用程序发送自定义消息或者通知栏提示。在几秒内,客户端应可收到下发的通知或者正定义消息.

别名与标签设置异常处理

由于网络连接不稳定的原因,有一定的概率 JPush SDK 设置别名与标签会失败。App 开发者合理地处理设置失败,则偶尔失败对应用的正常使用 JPush 影响是有限的。

以下以 Android SDK 作为示例。

基本思路:

  • 设置成功时,往 SharePreference 里写状态,以后不必再设置
  • 遇到 6002 超时,则稍延迟重试。
  1. // 这是来自 JPush Example 的设置别名的 Activity 里的代码。一般 App 的设置的调用入口,在任何方便的地方调用都可以。
  2. private void setAlias() {
  3. EditText aliasEdit = (EditText) findViewById(R.id.et_alias);
  4. String alias = aliasEdit.getText().toString().trim();
  5. if (TextUtils.isEmpty(alias)) {
  6. Toast.makeText(PushSetActivity.this,R.string.error_alias_empty, Toast.LENGTH_SHORT).show();
  7. return;
  8. }
  9. if (!ExampleUtil.isValidTagAndAlias(alias)) {
  10. Toast.makeText(PushSetActivity.this,R.string.error_tag_gs_empty, Toast.LENGTH_SHORT).show();
  11. return;
  12. }
  13. // 调用 Handler 来异步设置别名
  14. mHandler.sendMessage(mHandler.obtainMessage(MSG_SET_ALIAS, alias));
  15. }
  16. private final TagAliasCallback mAliasCallback = new TagAliasCallback() {
  17. @Override
  18. public void gotResult(int code, String alias, Set<String> tags) {
  19. String logs ;
  20. switch (code) {
  21. case 0:
  22. logs = "Set tag and alias success";
  23. Log.i(TAG, logs);
  24. // 建议这里往 SharePreference 里写一个成功设置的状态。成功设置一次后,以后不必再次设置了。
  25. break;
  26. case 6002:
  27. logs = "Failed to set alias and tags due to timeout. Try again after 60s.";
  28. Log.i(TAG, logs);
  29. // 延迟 60 秒来调用 Handler 设置别名
  30. mHandler.sendMessageDelayed(mHandler.obtainMessage(MSG_SET_ALIAS, alias), 1000 * 60);
  31. break;
  32. default:
  33. logs = "Failed with errorCode = " + code;
  34. Log.e(TAG, logs);
  35. }
  36. ExampleUtil.showToast(logs, getApplicationContext());
  37. }
  38. };
  39. private static final int MSG_SET_ALIAS = 1001;
  40. private final Handler mHandler = new Handler() {
  41. @Override
  42. public void handleMessage(android.os.Message msg) {
  43. super.handleMessage(msg);
  44. switch (msg.what) {
  45. case MSG_SET_ALIAS:
  46. Log.d(TAG, "Set alias in handler.");
  47. // 调用 JPush 接口来设置别名。
  48. JPushInterface.setAliasAndTags(getApplicationContext(),
  49. (String) msg.obj,
  50. null,
  51. mAliasCallback);
  52. break;
  53. default:
  54. Log.i(TAG, "Unhandled msg - " + msg.what);
  55. }
  56. }
  57. };

Android SDK 网络问题解析

Android 客户端网络不稳定,会导致 App 有时候无法及时收到 Push 消息。很多开发者认为这是因为 JPush 推送不稳定、延迟,甚至有时候认为 JPush 后台推送系统出问题了。本文目的是从各个方面来分析 Android 网络导致的 JPush 不能正常工作的问题。

JPush 正常工作的必要条件

首先,我们需要知道,JPush SDK 并不是集成到 App 后就必然一直工作的。

其正常工作的必要条件是:JPush SDK 与 JPush Server 的网络保持着连接。请参考这篇文章来做进一步的理解:极光推送技术原理:移动无线网络长连接。

而 Android 设备的网络的复杂性、不稳定性,是 Android 设备开发最复杂的地方之一。

另外,每款手机的网络能力也是千差万别的。国内很多杂牌手机在网络方面甚至会有严重的问题。大品牌厂商的手机则要好很多。

只要 JPush 的网络连接是正常的,则:

  • JPush 收到消息一定是及时的。其延迟是秒级的,一般在 1 秒之内。如果超过 10 秒,则一定是客户端网络出了问题。
  • 手机休眠时,也能够及时地收到推送消息。

部分系统的特殊处理导致问题

MIUI V5 系统

  • 自启动管理:默认情况下,手机开机后,只有系统默认的服务可以启动起来。除非在自启动管理界面,设置允许第三方程序自启动。
  • 网络助手:可以手动禁止已安装的第三方程序访问 2G/3G 和 WIFI 的网络和设置以后新安装程序是否允许访问 2G/3G 和 WIFI 的网络。

4.0 以上的 android 系统

  • 在设置->应用,强行停止 应用程序后该程序无法再自启动,就算重新开机也一样,一定要手动开启才能运行起来。

让我们从目前得到的反馈来整理调试的思路

1、手机休眠时收不到 JPush 消息,解锁或屏幕灯亮则可以成功接收

这个现象表明,手机休眠时,JPush SDK “被迫”与服务器端的网络失去了连接。

JPush SDK 的工作原理是要确保在手机休眠时也能正常的工作,即休眠时也可以及时地收到 Push 消息。实际上 JPush 在大部分上手机上都能达到此效果。

这个“被迫”,是由 Android 设备的环境所导致的。涉及的原因有如下几个方面:

  • 手机本身的网络设置。标准版本的 Android ROM 是没有这个设置的,但某些特殊的 ROM 可能会有这方面的设置。
  • 手机上的安全、省电工具软件额外做的事情
    上述的特殊机制会关闭网络。网络一旦连接上,JPush 也会连接上服务器,从而 Push 消息就会收到。

2、有时候收到 JPush 消息很及时,有时候则要等几分钟

JPush 会监听网络切换广播。当网络关闭时,把原来 JPush 连接关闭。当有新的网络时,创建 JPush 连接。

另外,RTC 会定时发送心跳。如果之前的网络已经断了,则会重新连接。

应该说,当前的网络连接策略还是相对简单的,这样做的目的是:省电、省流量。

不好之处就是:网络没有切换时,因为当时网络过差,JPush 连接会被中断。这种情况下,就只能等 RTC 心跳去触发连接。这也是有时候 JPush 无法及时接收 Push 消息的原因。根据网络条件的不同,出现这个情况的概率也会不同。但据我们自己的测试,90% 的时候是可以及时地收到 Push 消息的。

JPush 目前在网络策略方面没有像微信这种聊天工具做得积极。如果这样做到,电量和流量的消耗必然会成倍地增加。

3、完全收不到 JPush 消息

如果集成之后就完全收不到 Push 消息,则很有可能是某个地方配置错误,优先查看客户端日志,配合文档进行定位:Android SDK 集成指南iOS SDK 集成指南,或者参考教程:Android SDK 调试指南iOS SDK 调试指南