Android SDK 调试指南
SDK 启动过程
- 检查 AndroidManifest.xml 中是否有配置 AppKey,如果没有,则启动失败
- 检查 Androidmanifest.xml 文件配置的正确性,必须要保证 “Android SDK 集成指南”中所有标注 “Required” 的部分都正确配置,否则启动失败
- 检查 JPush SDK 库文件的有效性,如果库文件无效,则启动失败
- 检查网络是否可用,建议使用 4G 测试,如果网络可用则连接服务器登录,否则启动失败
- 登陆成功后可以从 logcat 中看到如下 log
测试确认
- 确认 Androidmanifest.xml 中所需的所有 “Required” 项都已经添加。如果有 “Required” 项未添加,日志会提示错误。
- 确认 AppKey (在 Portal 上生成的) 已经正确的写入 Androidmanifest.xml 中,没写会有日志提示错误。
- 确认在程序启动时候调用了 init(context)接口
- 确认测试手机(或者模拟器)的网络可用,如果网络正常可用,客户端调用 init 后不久,应有登录成功(Login succeed)的日志信息,如 SDK 启动过程所示
- 启动应用程序,登陆 Portal 系统,并向应用程序发送自定义消息或者通知栏提示。在几秒内,客户端应可收到下发的通知或者正定义消息.
别名与标签设置异常处理
由于网络连接不稳定的原因,有一定的概率 JPush SDK 设置别名与标签会失败。 App 开发者合理地处理设置失败,则偶尔失败对应用的正常使用 JPush 影响是有限的。
以下以 Android SDK 作为示例。
基本思路:
- 设置成功时,往 SharePreference 里写状态,以后不必再设置
- 遇到 6002 超时,则稍延迟重试。
// 这是来自 JPush Example 的设置别名的 Activity 里的代码。一般 App 的设置的调用入口,在任何方便的地方调用都可以。
private void setAlias() {
EditText aliasEdit = (EditText) findViewById(R.id.et_alias);
String alias = aliasEdit.getText().toString().trim();
if (TextUtils.isEmpty(alias)) {
Toast.makeText(PushSetActivity.this,R.string.error_alias_empty, Toast.LENGTH_SHORT).show();
return;
}
if (!ExampleUtil.isValidTagAndAlias(alias)) {
Toast.makeText(PushSetActivity.this,R.string.error_tag_gs_empty, Toast.LENGTH_SHORT).show();
return;
}
// 调用 Handler 来异步设置别名
mHandler.sendMessage(mHandler.obtainMessage(MSG_SET_ALIAS, alias));
}
private final TagAliasCallback mAliasCallback = new TagAliasCallback() {
@Override
public void gotResult(int code, String alias, Set<String> tags) {
String logs ;
switch (code) {
case 0:
logs = "Set tag and alias success";
Log.i(TAG, logs);
// 建议这里往 SharePreference 里写一个成功设置的状态。成功设置一次后,以后不必再次设置了。
break;
case 6002:
logs = "Failed to set alias and tags due to timeout. Try again after 60s.";
Log.i(TAG, logs);
// 延迟 60 秒来调用 Handler 设置别名
mHandler.sendMessageDelayed(mHandler.obtainMessage(MSG_SET_ALIAS, alias), 1000 * 60);
break;
default:
logs = "Failed with errorCode = " + code;
Log.e(TAG, logs);
}
ExampleUtil.showToast(logs, getApplicationContext());
}
};
private static final int MSG_SET_ALIAS = 1001;
private final Handler mHandler = new Handler() {
@Override
public void handleMessage(android.os.Message msg) {
super.handleMessage(msg);
switch (msg.what) {
case MSG_SET_ALIAS:
Log.d(TAG, "Set alias in handler.");
// 调用 JPush 接口来设置别名。
JPushInterface.setAliasAndTags(getApplicationContext(),
(String) msg.obj,
null,
mAliasCallback);
break;
default:
Log.i(TAG, "Unhandled msg - " + msg.what);
}
}
};
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 调试指南。