华为通道接入

最近更新时间:2019-08-28 17:08:15

操作场景

华为推送通道是由华为官方提供的系统级推送通道。在华为手机上,推送消息能够通过华为的系统通道抵达终端,并且无需打开应用,即可收到推送。

注意:

  • 华为推送只有在签名发布包环境下,才可收到推送消息。
  • 华为手机中的移动推送服务,必须升级到2.5.3以上版本,华为通道会注册失败(依旧走腾讯移动推送通道)。
  • 华为通道不支持抵达回调,支持点击回调(需要自定义参数),支持透传(忽略自定义参数,但不保证到达)。

操作步骤

获取密钥

  1. 进入 华为开放平台
  2. 注册和登录开发者账号,详情请参见 账号注册认证。(如果您是新注册账号,需进行实名认证)
  3. 在华为推送平台中新建应用,详情请参见 创建应用。(应用包名需跟您在腾讯移动推送填写的包名保持一致)
  4. 获取应用的 AppID 和 AppSecret,并且复制信息,填入控制台的应用配置 > 华为通道栏目中。

配置 SHA256 证书指纹

获取 SHA256 证书指纹方法,请参见 华为推送接入文档

集成步骤

AndroidStudio 集成方法

在 App 模块下的 build.gradle 文件内,完成腾讯移动推送所需要的配置后,再增加以下的华为节点:

  1. 配置华为 AppID,示例代码如下:

    manifestPlaceholders = [
      HW_APPID: "华为的APPID"
         ]
  2. 导入华为推送相关依赖,示例代码如下:

    implementation 'com.tencent.tpns:huawei:1.1.0.2-release' //华为推送

Eclipes 集成方法

  1. 导入华为推送相关 jar 包, 将 HMSSdkBase_*.jarHMSSdkPush_*.jar 放在 libs 件夹里。
  2. Androidmanifest.xml 文件中,新增如下配置:
     <meta-data
             android:name="com.huawei.hms.client.appid"
             android:value="您的APPID(来自华为官网)" >
     </meta-data>
     <activity
             android:name="com.huawei.hms.activity.BridgeActivity"
             android:configChanges="orientation|locale|screenSize|layoutDirection|fontScale"
             android:excludeFromRecents="true"
             android:exported="false"
             android:hardwareAccelerated="true"
             android:theme="@android:style/Theme.Translucent" >
             <meta-data
                     android:name="hwc-theme"
                     android:value="androidhwext:style/Theme.Emui.Translucent" />
     </activity>
     <provider
             android:name="com.huawei.hms.update.provider.UpdateProvider"
             android:authorities="应用包名.hms.update.provider"
             android:exported="false"
             android:grantUriPermissions="true" >
     </provider>      
     <receiver android:name="com.huawei.hms.support.api.push.PushEventReceiver" >
             <intent-filter>
                     <!-- 接收通道发来的通知栏消息,兼容老版本PUSH -->
                     <action android:name="com.huawei.intent.action.PUSH" />
             </intent-filter>
     </receiver>
     <!-- 注:华为push 需要的 end -->

华为消息 receiver

  1. 自定义类,继承 com.huawei.hms.support.api.push.PushReceiver,并在 Androidmanifest.xml 中,配置相关的节点。示例代码如下:

     public class MyReceiver extends PushReceiver {
    
         @Override
         public void onEvent(Context context, Event arg1, Bundle arg2) {
             super.onEvent(context, arg1, arg2);
    
             showToast("onEvent" + arg1 + " Bundle " + arg2 ,  context);
         }
    
         @Override
         public boolean onPushMsg(Context context, byte[] arg1, Bundle arg2) {
    
             showToast("onPushMsg" + new String(arg1) + " Bundle " + arg2 ,  context);
             return super.onPushMsg(context, arg1, arg2);
         }
    
         @Override
         public void onPushMsg(Context context, byte[] arg1, String arg2) {
    
             showToast("onPushMsg" + new String(arg1) + " arg2 " + arg2 ,  context);
             super.onPushMsg(context, arg1, arg2);
         }
    
         @Override
         public void onPushState(Context context, boolean arg1) {
    
             showToast("onPushState" + arg1,  context);
             super.onPushState(context, arg1);
         }
    
         @Override
         public void onToken(Context context, String arg1, Bundle arg2) {
             super.onToken(context, arg1, arg2);
    
              showToast(" onToken" + arg1 + "bundke " + arg2,  context);
         }
    
         @Override
         public void onToken(Context context, String arg1) {
             super.onToken(context, arg1);
              showToast(" onToken" + arg1 ,  context);
         }
    
         public  void showToast(final String toast, final Context context)
             {
    
                 new Thread(new Runnable() {
    
                 @Override
                 public void run() {
                     Looper.prepare();
                     Toast.makeText(context, toast, Toast.LENGTH_SHORT).show();
                     Looper.loop();
                 }
             }).start();
             }
    
         private void  writeToFile(String conrent) {
             String SDPATH = Environment.getExternalStorageDirectory() + "/huawei.txt";
             try {
                 FileWriter fileWriter = new FileWriter(SDPATH, true);
    
                 fileWriter.write(conrent+"\r\n");
                 fileWriter.flush();
                 fileWriter.close();
             } catch (IOException e) {
                 // TODO Auto-generated catch block
                 e.printStackTrace();
             }
         }
     }

    2 . 在 AndroidManifest.xml 增加 Receiver, 配置如下:

    <receiver android:name="com.tencent.android.hwpush.HWPushMessageReceiver" >
    <intent-filter>
         <!-- 必须,用于接收TOKEN -->
         <action android:name="com.huawei.android.push.intent.REGISTRATION" />
         <!-- 必须,用于接收消息 -->
         <action android:name="com.huawei.android.push.intent.RECEIVE" />
         <!-- 可选,用于点击通知栏或通知栏上的按钮后触发onEvent回调 -->
         <action android:name="com.huawei.android.push.intent.CLICK" />
         <!-- 可选,查看PUSH通道是否连接,不查看则不需要 -->
         <action android:name="com.huawei.intent.action.PUSH_STATE" />
    </intent-filter>
    </receiver>

启动华为推送

在调用腾讯移动推送 XGPushManager.registerPush 前,开启第三方推送接口:

//打开第三方推送
XGPushConfig.enableOtherPush(getApplicationContext(), true);

注册成功的日志如下:

I/XINGE: [XGOtherPush] other push token is : 0865551032618726300001294600CN01 other push type: huawei
 I/XINGE: [a] binder other push token with accid = 2100274337  token = 17c32948df0346d5837d4748192e9d2f14c81e08 otherPushType = huawei otherPushToken = 0865551032618726300001294600CN01

代码混淆

-ignorewarning
-keepattributes *Annotation*
-keepattributes Exceptions
-keepattributes InnerClasses
-keepattributes Signature
-keepattributes SourceFile,LineNumberTable
-keep class com.hianalytics.android.**{*;}
-keep class com.huawei.updatesdk.**{*;}
-keep class com.huawei.hms.**{*;}
-keep class com.huawei.android.hms.agent.**{*;}

如遇到发布华为应用市场,发布应用时审核不通过显示“错误:28: 集成 HMS 需要将证书文件打包到 APK 中,请直接将 assets 目录拷贝到应用工程根目录”。

解决办法:下载华为官方 HMS SDK,将 assets 目录下的所有文件及子目录拷贝到开发者 App 工程的同名目录下。如果目录不存在,请先创建。