华为推送通知栏消息功能及 intent 说明文档

华为推送通知栏消息功能及 intent 说明文档
发布时间: 2017-09-28 11:26

回答:

华为推送分为透传推送和通知栏推送两种方式。 两种方式的区别如下:

透传推送:华为推送服务会将原始 json 数据发给目标客户端,客户端内嵌的融云 SDK 接受到该 json 数据后,会进行解析并在通知栏显示。

通知栏推送:由华为操作系统直接弹通知栏。

融云默认为透传推送方式,如需要使用通知栏推送方式,则需要在融云开发者后台 -》 应用标识 -》华为推送设置下面,勾选“开启华为推送通知栏消息”开启。

拦截通知点击事件

华为通知栏推送方式下,当用户点击通知时,华为系统会通过隐式调用的方式,发出 intent 事件,您可以拦截该事件,获取用户点击行为以及携带的数据。

默认传递的 intent 如下:

intent://包名/conversationlist?isFromPush=true#Intent;scheme=rong;launchFlags=0x4000000;end

您需要在 AndroidManifest.xml 中进行如下配置,点击通知时,即会启动对应的 Activity。

<activity android:name=".ui.activity.ConversationListActivity" android:launchMode="singleTask" android:screenOrientation="portrait" android:windowSoftInputMode="stateHidden|adjustResize">    
    <intent-filter>        
        <action android:name="android.intent.action.VIEW" />        
        <category android:name="android.intent.category.DEFAULT" />        
        <data android:host="包名" 
        android:path="/conversationlist" 
        android:scheme="rong" />    
    </intent-filter>
</activity>

该 intent 会同时携带一些附加数据,比如您在调用 RongIMClient.getInstance.sendMessage() 时传递的参数 pushData, 比如您在使用开发者后台的广播推送功能时,自定义的键值对等。

您可以参考以下示例获取数据,并进行相应的业务处理。

Intent intent = getIntent();if (intent.getData().getScheme().equals("rong") && intent.getData().getQueryParameter("isFromPush") != null) 
{    
    if (intent.getData().getQueryParameter("isFromPush").equals("true")) {        
    String options = getIntent().getStringExtra("options"); // 获取 intent 里携带的附加数据        
    NLog.d(TAG, "options:", options);        
    try{            
        JSONObject jsonObject = new JSONObject(options);            
        if(jsonObject.has("appData")) {   
            // appData 对应的是客户端 sendMessage() 时的参数 pushData                
            NLog.d(TAG, "pushData:", jsonObject.getString("appData"));            
            }            
        if(jsonObject.has("rc")) {                
            JSONObject rc = jsonObject.getJSONObject("rc");                
            NLog.d(TAG, "rc:", rc);                
            String targetId = rc.getString("tId"); // 该推送通知对应的目标 id.                        String pushId = rc.getString("id");  // 开发者后台使用广播推送功能发出的推送通知,会有该字段,代表该推送的唯一 id, 需要调用下面接口,上传用户打开事件。                
            if(!TextUtils.isEmpty(pushId)) {                    
                RongPushClient.recordNotificationEvent(pushId); // 上传用户打开事件,以便进行推送打开率的统计。                    
                NLog.d(TAG, "pushId:", pushId);                
            }                
            if (rc.has("ext") && rc.getJSONObject("ext") != null) {                                   String ext = rc.getJSONObject("ext").toString(); // 使用开发者后台的广播推送功能时,填充的自定义键值对。                    
                NLog.d(TAG, "ext:", ext);                
            }            
         }        
    } catch(JSONException e) 
    {        
    }        
    enterActivity();    
  }
}

自定义 intent:

您也可以自定义点击通知时,发出的 intent,自定义的 intent 获取方式可以参考如下代码:

Intent intent = new Intent(Intent.ACTION_VIEW);
Uri uri = Uri.parse("rong://" + this.getPackageName()).buildUpon().appendPath("conversationlist").appendQueryParameter("isFromPush", "true").build();
intent.setData(uri);
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
String intentUri = intent.toUri(Intent.URI_INTENT_SCHEME);

将上面代码中最终生成的 intentUri 填写到开发者后台即可。

通知栏推送支持的版本信息如下:

1、通知栏消息对于 EMUI 4.1 及以上的系统不用开启自启动。
2、华为移动服务 2.5.2.300,EMUI 不同版本到达率不同。
3、EMUI 3.0 版本上,华为系统的 Push 广播有很大概率被限制,如: Mate7 3.0 版本,荣耀 6plus,P7 3.0 版本,4X, 4A 等。
4、EMUI 3.1 版本上,Push 广播基本不被限制,但个别型号机型存在问题,如:荣耀 5x 等。
5、EMUI 4.0 及以上,Push 广播有较高概率被限制,不被限制的机型如:荣耀畅玩 4C,荣耀畅玩 4X,Mate S,P8 MAX 等。
6、EMUI 4.1 版本 , ROM 升级到了最新版本的(80%已升),通知消息不走广播,不会被限制,透传消息走广播,会被限制。
7、EMUI5.0 以上版本 ,通知消息不走广播,不会被限制,透传消息走广播,会被限制解决方法开启应用相关权限。