记录接入友盟SDK时的一些问题

App推送

1. 推送消息显示已送达,但实际无通知

问题定位

在一顿官方文档FAQ查看后无果 , 于是查看日志 , 会看到这样的错误

1
java.lang.IllegalArgumentException: ResClass未初始化 , 请确保你已经添加了必要的资源.

看到这里 , 应该知道是资源文件找不到 , 要么是被混淆了 , 要么是路径不对 . 在确认不是混淆问题后 , 就得去找为什么资源路径出现错误

在代码定位后发现 , 以context.getPackageName(...) 为基础路径拿到的资源为 null .

通过 context.getPackageName(...) 获取到的是 applicationId . 默认情况下 applicationId 与 清单文件 AndroidManifest 文件中的 packageName 相同的 . 但是有些业务情况下是会进行修改 , 这样的话两者值就不一定相等了. 实际上的 packageName 是项目的父路径 , 所以需要相应修改 , 还好友盟有提供这样的 api

1
2
PushAgent mPushAgent = PushAgent.getInstance(context);
mPushAgent.setResourcePackageName("com.abc"); // 修改为真实路径
参考链接

2. 厂商离线推送无通知

在集成过程中发现 , 偶发性设备接送不到厂商离线推送 . 后面查找资料发现卸载重装生成新的 Device Token 后又正常了 , 纯属玄学

参考链接

简书

3. 华为离线推送始终收不到

集成过程中发现 , 几乎按照文档去接入的 , 却始终无法接受到离线推送 .

最终参考华为官方文档 , 需要配置 SHA256 证书指纹 . 最新的友盟文档应该也强调了需要配置这个.

参考链接

华为官方:配置AppGalleryConnect

App分享

QQ

当使用友盟分享 SDK 分享到 QQ 后 , 某些情况下自己的 app 会被销毁 , 而此时返回自己的 app ,发现界面展示没有问题 , 但是屏幕点击事件一点效果都没 . 经过仔细测试发现底部物理键和 app 的手机系统栏却可以正常点击 , 且点击一次返回键后当前 app 界面也可以正常点击了 . 有点神乎其神 , 咨询了友盟技术支持 , 他们的回答无用 , 不知道是友盟的问题 , 还是 QQ 的问题.

调试过后发现 , 在分享回来时 , 栈顶的 activity 不是自己的 , 而是 com.tencent.connect.common.AssistActivity 腾讯的 activity .

此 acitvity 在 app 未被销毁时正常关闭自己 , 但是还在 app 被销毁后变量还原 , 导致某些状态丢失而无法正常关闭自己 (从分享成功后 app 再销毁 , AssistActivity 还是无法正常关闭可知并不是通过广播来关闭界面 ,而是设置了某些状态来关闭自己)

解决方案:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
// 执行onCretae是否是带有savedInstanceState启动的
private boolean isFromActivityReCreate = false;

@Override
protected void onCreate(Bundle savedInstanceState) {
super.oncreate(savedInstanceState);
if (savedInstanceState != null){
isFromActivityReCreate = true;
}
}

@Override
protected void onPause() {
super.onPause();
if (isFromActivityReCreate && isNeedRestart()){
Intent intent = new Intent(mContext, this.getClass());
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); //清除栈顶的activity
intent.addFlags(Intent.FLAG_ACTIVITY_NO_ANIMATION);//不显示多余的动画,假装没有重新启动
//记得带需要的参数
intent.putExtra(WEB_TITLE, mTitle);
intent.putExtra(WEB_URL, mUrl);
startActivity(intent);
}
isFromActivityReCreate = false;

}

private boolean isNeedRestart(){
ActivityManager am = (ActivityManager) mContext.getSystemService(Context.ACTIVITY_SERVICE);
List<ActivityManager.RunningTaskInfo> tasks = am.getRunningTasks(1);
if (!tasks.isEmpty()) {
ComponentName topActivity = tasks.get(0).topActivity;
ActivityManager.RunningTaskInfo taskInfo = tasks.get(0);
if (topActivity.getPackageName().equals(mContext.getPackageName())) {
// 若当前栈顶界面是AssistActivity,则需要手动关闭

if (topActivity.getClassName().equals("com.tencent.connect.common.AssistActivity"))
return true;
}
}
return false;
}
参考链接

CSDN

其他

CSDN:接入友盟厂商push通道的坑