ps:本篇只适合已集成完毕华为推送 sdk 的开发者,在兼容上遇到的问题。 关于集成华为 hms 服务移动推送时遇到的问题:
第三方:
华为移动 hms 服务-推送服务
需求:
提高推送覆盖率
处理方案:
透传 + 自启动
权限开放:
自启动 = on
根据官方文档集成后,在华为老机型上运行时出现了崩溃.
//HuaweiApiAvailability.getInstance().resolveError(this, rstCode, REQUEST_HMS_RESOLVE_ERROR);
/**
* 代理 Activity,用于弹出解决问题的引导
*/
public class HMSAgentActivityextends BaseAgentActivity {
...
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
ApiClientMgr.INST.onActivityLunched();
Intent intent = getIntent();
finish();
if (intent !=null) {
int rstCode = intent.getIntExtra(CONN_ERR_CODE_TAG, 0);
HMSAgentLog.d("dispose code:" + rstCode);
// HuaweiApiAvailability.getInstance().resolveError(this, rstCode, //REQUEST_HMS_RESOLVE_ERROR);
}else {
HMSAgentLog.e("intent is null");
finish();
}
}
定位到这行代码,当时运行的设备时 cl-200 版本 5.1.1
如果只是兼容不报错,注释 onConnectionFailed 中的以下代码即可:
ApiClientMgr.java
/**
* 建立 client 到 service 的连接失败时调用
*
* @param result 连接结果,用于解决错误和知道什么类型的错误
*/
@Override
public void onConnectionFailed(ConnectionResult result) {
timeoutHandler.removeMessages(APICLIENT_TIMEOUT_HANDLE_MSG);
if (result ==null) {
HMSAgentLog.e("result is null");
onConnectEnd(HMSAgent.AgentResultCode.RESULT_IS_NULL);
return;
}
int errCode = result.getErrorCode();
HMSAgentLog.d("errCode=" + errCode +" allowResolve=" +allowResolveConnectError);
if(HuaweiApiAvailability.getInstance().isUserResolvableError(errCode) &&allowResolveConnectError) {
Activity activity = ActivityMgr.INST.getLastActivity();
if (activity !=null) {
try {
//
timeoutHandler.sendEmptyMessageDelayed(APICLIENT_STARTACTIVITY_TIMEOUT_HANDLE_MSG,
//APICLIENT_STARTACTIVITY_TIMEOUT);
// Intent intent = new Intent(activity, HMSAgentActivity.class);
// intent.putExtra(HMSAgentActivity.CONN_ERR_CODE_TAG, errCode);
// intent.putExtra(BaseAgentActivity.EXTRA_IS_FULLSCREEN, UIUtils.isActivityFullscreen(activity));
// activity.startActivity(intent);
return;
}catch (Exception e) {
HMSAgentLog.e("start HMSAgentActivity exception:" + e.getMessage());
timeoutHandler.removeMessages(APICLIENT_STARTACTIVITY_TIMEOUT_HANDLE_MSG);
onConnectEnd(HMSAgent.AgentResultCode.START_ACTIVITY_ERROR);
return;
}
}else {
// 当前没有界面处理不了错误
HMSAgentLog.d("no activity");
onConnectEnd(HMSAgent.AgentResultCode.NO_ACTIVITY_FOR_USE);
return;
}
}else {
//其他错误码直接透传
}
onConnectEnd(errCode);
}
到此兼容完毕。
希望这篇文章对大家有帮助,另外:
拒绝 996
1
kingiis OP 低版本太诡异 自己 sdk 都不支持 我们注释掉 它自动更新华为 hms 服务的部分 同样在低版本上放弃了这个功能
|
2
qwwuyu 2019-04-19 09:19:20 +08:00
我这边是把 ActivityMgr 相关的都注释掉,一个是 HMSAgentActivity 处理连接错误,一个是 base.aar 里面的连接成功请求公告会使用到 topActivity(HuaweiApiClientImpl 类里 onConnectionResult 调用了 showNotice)。
可以尝试使用源码,删除 base.arr 的 res、com.huawei.hms.update 包相关、hmsrootcas.bks 、UpdateSdk_release_V2.0.3.300.jar ,这样清单只需要保留 HuaweiPushRevicer 和 meta-data。 如果不需要使用透传消息通知,可以尝试删除 com.huawei.hms.support.api.push.pushselfshow 包相关和 res,这样可以尝试只打出一个 jar 包,而不是 2 个 aar 和 2 个 jar.最近尝试了一下,暂无问题,但还未全面测试... |
3
kingiis OP @qwwuyu
app 流水太大 用户太多 对于华为推送这种集成方式的不敢大改,期待官方修改。 我这边需要透传的,要拉起 app 集成的 HMS_SDK_2.6.1.301.jar ,旧版推送的 sdk 都下架了找不到. |
4
qwwuyu 2019-04-19 09:52:08 +08:00
@kingiis 我也是 2.6.1.301 ,最近才开始相关开发,透传是指应用存活才可以收到的消息,不影响系统通知点击拉活推送。像 oppo xiaomi 都没有 res,hw 还有更新。。
|
6
qwwuyu 2019-04-19 10:24:46 +08:00
@kingiis 这样啊..但是还是不明白你们流程,服务器不知道用户开启自启动权限,需要发送系统级推送,让用户点击通知拉起应用吧.溜了溜了,工作去了.
|
7
xuhaoyangx 2019-04-19 11:38:20 +08:00
你们透传 是引导用户开启自启动?
|
8
honeycomb 2019-04-19 11:49:10 +08:00 via Android
@xuhaoyangx 你看是不是很没办法,连搞个推送都是为了保活
|
9
xuhaoyangx 2019-04-19 11:51:33 +08:00
@honeycomb #8 我司要求,消息到达即可
|
10
kingiis OP |
12
xuhaoyangx 2019-04-19 22:54:17 +08:00
@kingiis #10 我司是想自己保持长连接,没了,就走远推,有厂商的推的,走厂商推
|