Android10 华为推送收不到问题和厂商通道问题

本文详细介绍了在Android10上处理华为推送的问题,包括在根目录添加JSON配置文件,更新HMS Push SDK至4.0.2.300,以及如何处理高版本收不到open推送动作的问题。同时,文章提供了配置示例代码,解释了如何配置AndroidManifest.xml,解析通知内容,上报通知点击事件,以及处理不同厂商通道的通知。

需要先在根目录下添加华为后台配置好的JSON文件

具体JSON配置看官方文档https://developer.huawei.com/consumer/cn/doc/development/AppGallery-connect-Guides/agc-get-started#h1-1577930217114

//厂商通道
implementation 'cn.jiguang.sdk.plugin:vivo:3.6.0'
implementation 'cn.jiguang.sdk.plugin:xiaomi:3.6.0'
implementation 'cn.jiguang.sdk.plugin:huawei:3.6.0'
implementation 'cn.jiguang.sdk.plugin:meizu:3.6.0'
implementation 'cn.jiguang.sdk.plugin:oppo:3.6.0'
implementation 'com.huawei.hms:push:4.0.2.300'
implementation 'com.huawei.agconnect:agconnect-core:1.2.1.301'

// 极光核心组件
implementation 'cn.jiguang.sdk:jpush:3.6.0'
implementation 'cn.jiguang.sdk:jcore:2.3.4'

implementation 'com.huawei.hms:push:4.0.2.300' 要添加 否则一直报错找不到配置项

 

其他厂商通道也要相应的改变下,随着手机权限的提高,高版本是收不到open推送动作,需要我们自己设置自定义JPUSH动作

之前版本中我们都是接收open动作获取点击悬浮事件在传递,升级到高版本后都统一放到自定义JPUSH里

***示例:***  

```
demo manifest配置:
<activity android:name="com.example.jpushdemo.OpenClickActivity"
      android:exported="true">
      <intent-filter>
           <action android:name="android.intent.action.VIEW"/>
           <category android:name="android.intent.category.DEFAULT"/>
      </intent-filter>
</activity>

请求json如下:
{
    "platform": [
        "android"
    ],
    "audience": "all",
    "notification": {
        "android": {
            "alert": "在线alert003",
            "title": "在线title003",
            "uri_activity": "com.example.jpushdemo.OpenClickActivity",
        }
    },
    "message": {
        "msg_content": "自定义消息内容003"
    }
}
```


####SDK 端配置  

##### 1.AndroidManifest.xml中配置点击通知要打开的 activity  
```
<activity android:name="您配置的activity"
      android:exported="true">
      <intent-filter>
           <action android:name="android.intent.action.VIEW"/>
           <category android:name="android.intent.category.DEFAULT"/>
      </intent-filter>
</activity>
```
***注:*** android:exported 属性必须设置为 true,并增加示例中的 intent-filter,否则会导致无法收到通知。

##### 2.获取通知相关信息  
目前启动配置的 activity 都是使用 Intent.FLAG\_ACTIVITY\_CLEAR\_TOP | Intent.FLAG\_ACTIVITY\_NEW\_TASK 方式启动,只需要在您配置的 activity 中的onCreate方法中进行处理,获取通知信息。

通过 getIntent().getExtras().getString("JMessageExtra"); 获取到Intent 数据。获取到的数据是 JSON 字符串,通过解析可以获得通知相关内容。

JSON 示例如下:

```
{
    "msg_id":"123456",
    "n_content":"this is content",
    "n_extras":{"key1":"value1","key2":"value2"},
    "n_title":"this is title",
    "rom_type":0
}
```

JSON 内容字段说明:

字段|取值类型|描述
---|---|---
msg_id|String|通过此key获取到通知的msgid
n_title|String|通过此key获取到通知标题
n_content|String|通过此key获取到通知内容
n_extras|String|通过此key获取到通知附加字段
rom_type| byte|通过此key获取到下发通知的平台。得到值说明:byte类型的整数, 0为极光,1为小米,2为华为,3为魅族,4为oppo,5为vivo,8为FCM。

***注:*** rom_type 用于点击事件的上报,一般情况下开发者只需要取到该字段的值用于上报,不需要关心具体取值。


##### 3.通知点击上报
解析通知内容后,需主动调用接口来进行通知点击上报,上报接口如下:

```
/**
* context 上下文
* msgId 消息ID
* whichPushSDK 收到推送的平台,即 rom_type 字段的取值。
**/
JPushInterface.reportNotificationOpened(Context context, String msgId, byte whichPushSDK);
```
***注:*** 点击上报必须传入正确的 whichPushSDK 参数,否则会造成统计数据错误。

##### 4.Activity 示例代码

```
package com.example.jpushdemo;

import android.app.Activity;
import android.os.Bundle;
import android.text.TextUtils;
import android.util.Log;
import android.widget.TextView;

import org.json.JSONException;
import org.json.JSONObject;

import cn.jpush.android.api.JPushInterface;

/**
 * Created by jiguang on 17/7/5.
 */

public class OpenClickActivity extends Activity {
    private static final String TAG = "OpenClickActivity";
    /**消息Id**/
    private static final String KEY_MSGID = "msg_id";
    /**该通知的下发通道**/
    private static final String KEY_WHICH_PUSH_SDK = "rom_type";
    /**通知标题**/
    private static final String KEY_TITLE = "n_title";
    /**通知内容**/
    private static final String KEY_CONTENT = "n_content";
    /**通知附加字段**/
    private static final String KEY_EXTRAS = "n_extras";
    private TextView mTextView;


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        mTextView = new TextView(this);
        setContentView(mTextView);
        handleOpenClick();
    }


    /**
     * 处理点击事件,当前启动配置的Activity都是使用
     * Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_NEW_TASK
     * 方式启动,只需要在onCreat中调用此方法进行处理
     */
    private void handleOpenClick() {
        Log.d(TAG, "用户点击打开了通知");
        String data = null;
        //获取华为平台附带的jpush信息
        if (getIntent().getData() != null) {
             data = getIntent().getData().toString();
        }

        //获取fcm、oppo、vivo、华硕、小米平台附带的jpush信息
        if(TextUtils.isEmpty(data) && getIntent().getExtras() != null){
            data = getIntent().getExtras().getString("JMessageExtra");
        }

        Log.w(TAG, "msg content is " + String.valueOf(data));
        if (TextUtils.isEmpty(data)) return;
        try {
            JSONObject jsonObject = new JSONObject(data);
            String msgId = jsonObject.optString(KEY_MSGID);
            byte whichPushSDK = (byte) jsonObject.optInt(KEY_WHICH_PUSH_SDK);
            String title = jsonObject.optString(KEY_TITLE);
            String content = jsonObject.optString(KEY_CONTENT);
            String extras = jsonObject.optString(KEY_EXTRAS);
            StringBuilder sb = new StringBuilder();
            sb.append("msgId:");
            sb.append(String.valueOf(msgId));
            sb.append("\n");
            sb.append("title:");
            sb.append(String.valueOf(title));
            sb.append("\n");
            sb.append("content:");
            sb.append(String.valueOf(content));
            sb.append("\n");
            sb.append("extras:");
            sb.append(String.valueOf(extras));
            sb.append("\n");
            sb.append("platform:");
            sb.append(getPushSDKName(whichPushSDK));
            mTextView.setText(sb.toString());

            //上报点击事件
            JPushInterface.reportNotificationOpened(this, msgId, whichPushSDK);
        } catch (JSONException e) {
            Log.w(TAG, "parse notification error");
        }


    }

    private String getPushSDKName(byte whichPushSDK) {
        String name;
        switch (whichPushSDK){
            case 0:
                name = "jpush";
                break;
            case 1:
                name = "xiaomi";
                break;
            case 2:
                name = "huawei";
                break;
            case 3:
                name = "meizu";
                break;
            case 4:
                name= "oppo";
                break;
            case 5:
                name = "vivo";
                break;
            case 6:
                name = "asus";
                break;                   
            case 8:
                name = "fcm";
                break;
            default:
                name = "jpush";
        }
        return name;
    }
}

<think>嗯,用户的问题是关于阿里云厂商通道离线推送消息接收不到的原因解决方案。这个问题Android开发中很常见,尤其是在国内复杂的推送环境下。 用户可能是个Android开发者,正在集成阿里云推送服务,遇到了离线消息无法接收的问题。从ta的提问方式看,已经做了基本集成但遇到技术障碍,现在比较着急。需要给ta系统性的排查方案。 参考引用内容来看,有几个关键点值得注意: 引用[4]提到Android 8.0以上需要配置通知渠道,这是个常见陷阱。 引用[1]指出国内厂商通道的特殊性,同品牌手机可能需要单独适配。 引用[3]提到阿里云有HTTP2推送通道,可能涉及服务端配置。 深层原因可能涉及多个层面: 首先是基础配置问题,比如SDK初始化、通知权限等基本项。 其次是Android版本适配问题,特别是8.0以上的通知渠道要求。 然后是厂商通道的特殊性,同品牌手机对后台进程的限制策略同。 最后可能是服务端推送配置问题,比如证书有效性、消息格式等。 解决方案需要分层排查: 从客户端基础配置开始,逐步深入到厂商适配层。 要特别强调Android 8.0以上的通知渠道配置,这个在引用[4]有示例代码。 对于厂商通道冲突,建议参考引用[1]提到的第三方平台集成经验。 服务端方面需要检查设备注册状态消息模板,引用[3]的HTTP2通道设置可能相关。 用户可能还需要知道如何验证各环节状态,比如如何检查token注册、查看厂商通道连接状态等。这些在回复中需要给出具体操作路径。 最后要提醒用户,国内Android推送环境确实复杂,同品牌手机需要针对性测试,特别是华为、小米等主流机型。引用[1]提到的厂商通道碎片化问题确实存在。</think>针对阿里云厂商通道离线推送消息接收不到问题,以下是常见原因及系统化解决方案: --- ### **一、根本原因分析** 1. **通知渠道未适配(Android 8.0+)** Android 8.0及以上系统强制要求应用创建通知渠道(Notification Channel),否则通知无法展示[^4]。 2. **厂商通道注册失败** - 设备未安装对应厂商服务框架(如华为HMS Core) - 阿里云控制台未正确配置厂商通道密钥(华为/小米等) 3. **进程保活失效** 应用被系统或用户手动杀死后,厂商通道的长连接中断,需依赖系统级推送唤醒[^2]。 4. **离线消息有效期超时** 阿里云默认离线消息保存72小时,超时未联网则丢弃。 5. **多推送SDK冲突** 同时集成多个推送SDK(如极光+融云),厂商通道初始化互相覆盖[^1]。 --- ### **二、系统化解决方案** #### **1. 适配Android 8.0+通知渠道** ```java // 在Application的onCreate()中添加 if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { NotificationChannel channel = new NotificationChannel("aliyun_channel_id", "业务通知", NotificationManager.IMPORTANCE_HIGH); channel.setDescription("阿里云推送消息"); NotificationManager manager = (NotificationManager) getSystemService(NOTIFICATION_SERVICE); manager.createNotificationChannel(channel); } ``` **关键点**:`channelId`需与推送消息体中的`android_channel_id`字段一致[^4]。 --- #### **2. 厂商通道配置检查** | 步骤 | 操作指引 | |---------------------|------------------------------------------------------------------------| | **1. 控制台配置** | 阿里云控制台 > 移动推送 > 配置管理 > 厂商通道,填写各厂商的AppKey/AppSecret | | **2. 依赖库验证** | 检查是否引入最新版`aliyun-emas-services`(如`com.aliyun.ams:alicloud-android-push:3.8.4`) | | **3. 设备环境检测** | 华为设备需安装HMS Core 3.0+,小米设备需启用自启动权限 | --- #### **3. 进程保活策略优化** - **厂商白名单**:引导用户手动将应用加入后台运行白名单(各厂商路径同) - **关联启动链**:通过`<meta-data>`声明关联启动服务(参考华为[自动初始化文档](https://developer.huawei.com/consumer/cn/doc/development/HMS-Guides/push-basic-capability#h1-1576126480158)) ```xml <!-- AndroidManifest.xml --> <service android:name="com.huawei.hms.push.HmsMessageService" android:exported="false"> <intent-filter> <action android:name="com.huawei.push.action.MESSAGING_EVENT" /> </intent-filter> <meta-data android:name="push_kit_auto_init_enabled" android:value="true"/> <!-- 关键:允许自动初始化 --> </service> ``` --- #### **4. 消息有效期与重推机制** ```java // 设置离线消息保存时间(最长72小时) PushMessage message = new PushMessage(); message.setStoreOffline(true); message.setExpiredTime(System.currentTimeMillis() + 48 * 3600 * 1000); // 48小时 ``` > **注意**:超时未联网则消息永久丢失,需业务层实现消息补偿[^3]。 --- #### **5. 多SDK冲突解决** - **统一推送通道**:仅保留一个SDK的厂商通道初始化代码(推荐使用阿里云主通道) - **消息路由方案**:通过服务端区分消息类型,统一由阿里云通道下发 ```mermaid graph LR A[业务服务器] -->|推送请求| B(阿里云推送服务) B --> C{设备在线?} C -->|在线| D[直接下发] C -->|离线| E[通过厂商通道下发] E --> F[华为/小米等系统服务] F --> G[唤醒App进程] ``` --- ### **三、调试工具链** 1. **日志抓取** 开启SDK调试模式:`PushServiceFactory.init(context).setLogEnabled(true)` 2. **设备注册ID验证** 调用`PushServiceFactory.getCloudPushService().getDeviceId()`检查是否返回有效deviceId 3. **厂商通道状态查询** 华为:`adb logcat | grep -E 'HmsPush'` 小米:`adb logcat | grep -i 'XMPushService'` --- ### **四、典型故障场景** | 现象 | 解决方案 | |------------------------------|-----------------------------------------| | 华为设备收不到推送 | 检查`agconnect-services.json`是否包含push配置 | | 小米设备首次安装无推送 | 确认已开启【自启动】+【后台弹出界面】权限 | | OPPO/vivo设备锁屏后收不到 | 设置电池优化白名单 + 开启锁屏通知权限 | > **引用说明**:厂商通道的保活机制依赖系统级协作,需严格遵循各平台规范[^1][^2]。若问题仍存在,建议通过阿里云工单提供完整的设备日志(Logcat + 控制台消息ID)进行深度追踪。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值