Enviando notificaciones push a dispositivos Huawei
Tags: hmscore, huaweimobileservic, android, kotlin
Published: 2020-10-05 23:23:54

Cuando escuchamos hablar sobre las notificaciones push, regularmente pensamos en Firebase Cloud Messaging, pero, ¿qué pasa con los dispositivos que vienen sin GMS? Para llegar a los usuarios de Huawei con notificaciones push, podemos usar el Huawei Push Kit.
Con el kit Push, podemos enviar notificaciones push o mensajes de datos a los usuarios de nuestra app desde App Gallery Connect Console o mediante la API Push. En esta publicación, quiero mostrar cómo enviar notificaciones y mensajes de datos con el kit.
Requisitos

1. Un dispositivo Huawei con conexión a Internet y EMUI 4 o posterior (los dispositivos que no son Huawei también pueden recibir notificaciones instalando el APK principal de HMS, pero la tasa de entrega puede ser menor)
2. Un proyecto de aplicación en AGC
3. Habilitar el servicio
4. Habilitar el API yendo a mis proyectos>Administrar API

![0 hRflxc33Ke39ChEB](https://dev-to-uploads.s3.amazonaws.com/i/cy20gb368cqygu0jvuxb.png)

Habilitar el servicio Push en la sección Mis proyectos>Crecer>Kit de push
![0 hRflxc33Ke39ChEB](https://dev-to-uploads.s3.amazonaws.com/i/e90sop8hby9p5burgioh.png)

Integrando el SDK
Agregue el SDK de Push Kit al nivel de aplicación build.gradle
Implementation ‘com.huawei.hms: push: 4.0.2.300’

Crea una clase que extienda desde HmsMessageService, este servicio recibirá el token de inserción y los mensajes de datos.
```
classMyHuaweiPushService: HmsMessageService() {
    overridefunonNewToken(p0: String?) {
        super.onNewToken(p0)
        
    }overridefunonMessageReceived(message: RemoteMessage?) {
        if(message!=null){ 
            val map=message.dataOfMap
            for( key in map.keys){
                //explore the KV fields
            }
        }
    }
}
```
Agrega el servicio al Android Manifest 

```
<uses-permissionandroid:name="android.permission.INTERNET" /> <uses-permissionandroid:name="android.permission.ACCESS_NETWORK_STATE" /> <uses-permissionandroid:name="android.permission.ACCESS_WIFI_STATE" /> <uses-permissionandroid:name="android.permission.READ_PHONE_STATE" />  <service     android:name="com.hms.example.dummyapplication.service.MyHuaweiPushService"     android:enabled="true"     android:exported="false">     <intent-filter>         <actionandroid:name="com.huawei.push.action.MESSAGING_EVENT" />     </intent-filter> </service>  <meta-data     android:name="com.huawei.hms.client.appid"     android:value="appid=xxxx">     <!-- Replace the value of xxxx with the actual app ID applied, sourced from Service Details, HUAWEI Developer. --> </meta-data>
```
Obteniendo el push token

Para enviar mensajes a dispositivos específicos, necesitas conocer el token de inserción del dispositivo, este token es un ID de cliente para el kit de inserción.

Usa un hilo separado para obtener el token de inserción
```
fungetToken() {
    val tokenThread = Thread {
        try {
            val appId = AGConnectServicesConfig.fromContext(context).getString("client/app_id")
            val pushtoken = HmsInstanceId.getInstance(context).getToken(appId, "HCM")
            if (!TextUtils.isEmpty(pushtoken)) {
                Log.i("GetToken", "push token:$pushtoken")
            }
        } catch (e: Exception) {
            Log.e("Token Exception", "getToken failed, $e")
        }
    }
    tokenThread.run()
}
```
El token puede cambiar con el tiempo, por lo que se recomienda solicitar un token en cada inicio de la aplicación.

Si no se puede llamar al método getToken, HUAWEI Push Kit almacena en caché automáticamente la solicitud del token y vuelve a llamar al método. Luego se devolverá un token a través del método onNewToken.
También podemos habilitar la inicialización automática, después de configurar esta capacidad, el token aplicado se devuelve a través del método onNewToken ().

Agrega estos metadatos bajo la aplicación en el Android Manifest para habilitar el inicio automático de inserción.
```
<meta-data
    android:name="push_kit_auto_init_enabled"
    android:value="true" />
```

Enviando mensajes

Hay 2 tipos de mensajes.

    Mensajes de notificación
    Mensajes de datos

Puedes enviar mensajes utilizando la consola AGC o enviando una solicitud a la API Push

Enviar mensajes desde la consola

Ve a tu proyecto > Crecimiento > Push Kit y luego hazclic en Agregar notificación
![0 hRflxc33Ke39ChEB](https://dev-to-uploads.s3.amazonaws.com/i/8ihqtuyn86euqza49eyn.png)

Enviando notificaciones
![0 hRflxc33Ke39ChEB](https://dev-to-uploads.s3.amazonaws.com/i/gkktaxp4blnro233clr9.png)

Para las notificaciones, podemos editar el contenido y ver una vista previa. Agrega una acción que se realizará cuando el usuario toque la notificación. Escoge entre una de las siguientes opciones:

1.-Abrir aplicación: abre la actividad desde el Home o establecer un deeplink para abrir una actividad específica.
2.-Abrir página web: abre un navegador en la página especificada por la URL.

Si eliges la aplicación abierta, podrás enviar pares de clave-valor personalizados que se entregarán a la aplicación en la intención adicional de la actividad abierta.

Si deseas proporcionar más acciones a tu notificación, puedes agregar botones para realizar una de las siguientes acciones:

1. Abrir aplicación: abre la aplicación en la página especificada.
2. Abrir página web: abre la url dada en un navegador.
3. Borrar: borra la notificación del panel.
4. Compartir: realiza la acción compartida para el contenido dado. Por ejemplo: compartit el contenido por mensaje instantáneo

Envío de mensajes de datos

Usa este método si deseas activar tu aplicación para realizar una operación específica con los datos. El mensaje activará el método onMessageReceived de tu HmsMessageService y puedes recuperar los datos del objeto RemoteMessage.

```
overridefunonMessageReceived(message: RemoteMessage?) {
    if(message!=null){
        Log.i("OnNewMessage",message.data)
        val map=message.dataOfMap
        for( key in map.keys){
            Log.e("onNewMessage",map[key]!!)
        }
    }
}
```
Probando

Para verificar el comportamiento de nuestro mensaje, podemos hacer clic en probar efecto y enviar el mensaje a los tokens especificados

![0 9-D8e0hFAU-yImUj](https://dev-to-uploads.s3.amazonaws.com/i/t06elx8ux84x5ebg2egy.png)
 
Ingresa el token o los tokens y haz click en OK

![0 RIsotTU6F3A_a6xd](https://dev-to-uploads.s3.amazonaws.com/i/m3pqu0avykm5odsz6kty.png)
 

Cuando estés listo para enviar el mensaje, podrás configurar el alcance de envío para enviar el mensaje a tokens específicos, audiencia de Huawei Analytics, suscriptores de temas o todos sus usuarios.

Para el tiempo de inserción, puedes configurar “ahora” o programar el envío del mensaje.

![0 RIsotTU6F3A_a6xd](https://dev-to-uploads.s3.amazonaws.com/i/hohu0abe3jlgg2ve0g40.png)

Haz clic en enviar para enviar tu mensaje o Guardar como borrador para usarlo más tarde.
![0 3RhgL_fxFmBng9uG](https://dev-to-uploads.s3.amazonaws.com/i/3gjs3vj44dzqvpig34c7.png)
 
```
Request
Host: https://oauth-login.cloud.huawei.com/oauth2/v2/token
Request Method: POST
Request Headers:
'Content-Type': 'application/x-www-form-urlencoded'
Request Body (encoded in urlEncode mode):
grant_type=client_credentials&client_id=YOUR_APP_ID&client_secret=APP_SECRET
```
Response ejemplo:

```
HTTP/1.1200 OK
Content-Type: text/html;charset=UTF-8
{"access_token":"CFyJ7eTl8WIPi9603E7Ro9Icy+K0JYe2qVjS8uzwCPltlO0fC7mZ0gzZX9p8CCwAaiU17nyP+N8+ORRzjjk1EA==","expires_in":3600,"token_type":"Bearer"}
```
Enviando mensajes
```
Request
Host: https://push-api.cloud.huawei.com/v1/[appid]/messages:send
Request Method: POST
Request Headers:
Content-Type: application/json
Accept: application/json
Authorization: Bearer ACCESS_TOKENRequest Body: body = {         message: {             android: {                 notification: {                     title: title,                     body: message,                     click_action: {                         type: 1,                         intent: "https://dummyapp.com/target?param1=hello&param2=world",                         action: "ACTION_VIEW"                     }                 },                 data: "Data payload in string format"              },             token:["token1","token2"]         } };
```

Conclusión

Si envías los datos sin un objeto de notificación, el mensaje activará por default el método onMessageReceived.

Si deseas probar el push kit, crear plantillas de notificación o si no tienes tu propio servidor, escoge la consola de inserción.

Si deseas enviar notificaciones generadas dinámicamente, escoge la API