¿Cómo implementa Uni-App la función de inserción de mensajes?

Enlace de texto original: ¿Cómo implementa Uni-App la función de envío de mensajes?

prefacio

Aquí usamos UniPush1.0 (un servicio push) que viene con uni-app , por lo que solo presentamos los pasos de implementación para UniPush1.0 .

Artículos sugeridos:

Por supuesto, UniPush2.0 se ha lanzado ahora (compatible con HBuilderX 3.5.1 y superior), y se recomienda usar UniPush2.0 para nuevos proyectos .

Si desea utilizar UniPush2.0 , vaya a la Guía del usuario de UniPush 2.0 .

Vista previa del efecto

inserte la descripción de la imagen aquí
inserte la descripción de la imagen aquí
inserte la descripción de la imagen aquí
inserte la descripción de la imagen aquí
inserte la descripción de la imagen aquí

inserte la descripción de la imagen aquí
inserte la descripción de la imagen aquí
Las primeras cinco imágenes son efectos de máquina real de Android (HUAWEI P30 Pro) , y las últimas tres imágenes son efectos de máquina real de Ios (iPhone XS Max) .

descripción general

Descripción del Producto

UniPush es un servicio push unificado integrado lanzado por DCloud y Getui. Tiene push integrado a nivel de sistema y push de terceros como Apple, Huawei, Xiaomi, OPPO, VIVO, Meizu, Google FCM y otros fabricantes de teléfonos móviles .

Push de Android doméstico es un mundo caótico, porque el servicio Push de Google FCM está bloqueado (a partir de HBuilderX2.7.10 , Google FCM es compatible, referencia: https://ask.dcloud.net.cn/article/37356 ), por lo tanto, algunos fabricantes nacionales de teléfonos móviles con Android han hecho su propio impulso, como Huawei, Xiaomi, OPPO, VIVO, Meizu, etc., pero todavía hay muchos fabricantes nacionales de teléfonos móviles que no han proporcionado soluciones de impulso oficiales. Una empresa independiente de tres partes, como un empuje, proporciona una solución de empuje independiente.

Antes de UniPush , si solo se usaba el empuje de tres partes , muchos teléfonos móviles domésticos no podían mantener vivo el proceso de empuje debido a la configuración de ahorro de energía, lo que resultaba en una falla del empuje.

Y si se integra y desarrolla el Push SDK oficial de cada teléfono Android, con tantas plataformas, la carga de trabajo será enorme y la gestión y el mantenimiento serán muy problemáticos.

UniPush resuelve este problema, los desarrolladores solo necesitan desarrollar una vez. El sistema seleccionará automáticamente el canal push más confiable en diferentes teléfonos móviles para enviar mensajes push para garantizar la tasa de entrega.

UniPush no solo reduce el costo de desarrollo, sino que también mejora la tasa de entrega de push , y es gratis.Es la mejor solución para push en la actualidad.

Arquitectura Tecnológica

Glosario

sustantivo explicar
mensaje de notificación Después de especificar el título y el contenido de la notificación, Getui SDK mostrará automáticamente el mensaje de la barra de notificaciones en la barra de notificaciones del sistema y, al mismo tiempo, sonará o vibrará para recordarle al usuario (el timbre y la vibración se ven afectados por el estado de configuración del sistema del teléfono móvil). ).
mensaje transparente Es decir, un mensaje personalizado, el cliente puede definir el formato del cuerpo del mensaje, como texto sin formato, cadena json, etc. El push de mensaje transparente solo transmite datos sin ningún procesamiento.Después de recibir el mensaje transparente, el cliente debe realizar un procesamiento de acción de seguimiento, como la visualización de la barra de notificación, el cuadro emergente, etc.
Identificación del cliente El ID de usuario externo en la capa empresarial de Getui se utiliza para identificar la identidad del cliente. El cliente de terceros lo obtiene y lo guarda en el servidor de terceros. Es el número de identificación único del SDK de Getui, al que se hace referencia como CDI.
Empuje en línea Cuando la aplicación se ejecuta en primer plano, envía un mensaje a través de un canal push.
Empuje fuera de línea Cuando la aplicación está en segundo plano, la pantalla está bloqueada o el proceso está cerrado, envía un mensaje a través del canal del fabricante. Si el proveedor múltiple de Android no está integrado y el certificado de inserción de ios no está configurado, el modelo no puede utilizar la inserción sin conexión.

Para obtener más explicaciones de los sustantivos, consulte: Explicación de los sustantivos .

Proceso de envío de mensajes

Abra el servicio de inserción de UniPush

UniPush ha empaquetado internamente un SDK de fabricante estándar y push, y los servicios relacionados deben activarse antes de su uso: Haga clic aquí para ver cómo activar el servicio push de UniPush .

Abra el Centro de desarrolladores de DCloud y, después de iniciar sesión, ingresará a la lista de mis aplicaciones . Haga clic en uniPush en el menú de la izquierda y luego seleccione 1.0 o 2.0 para ingresar a la página de información de Uni Push . La esquina superior izquierda muestra la aplicación actual que se va a operar. Haga clic para cambiar de aplicación. Como se muestra abajo:

Cuando los usuarios utilizan la función UniPush por primera vez, necesitan sincronizar su información de identidad con UniPush. Los usuarios que hayan pasado la autenticación de nombre real sincronizarán directamente la información de autenticación de nombre real con Getui. Como se muestra abajo:

Los usuarios que no hayan enviado información de autenticación de nombre real deben ingresar información relevante en la página y enviarla, como se muestra en la siguiente figura:

Cuando una aplicación activa la función UniPush, debe enviar información relacionada con la aplicación, como se muestra en la siguiente figura:

inserte la descripción de la imagen aquí

Nota: Al solicitar la activación de UniPush , debe asegurarse de que el nombre del paquete de Android o el ID del paquete de iOS deben ser coherentes con el configurado durante el empaquetado; de lo contrario, es posible que no se reciba el mensaje de inserción.

Plataforma Android:
el nombre del paquete de Android debe ser coherente con el nombre del paquete de Android configurado cuando la nube de la aplicación se empaqueta en HBuilderX ; la firma de la aplicación de Android debe completarse con la huella digital SHA1 del certificado utilizado para el empaquetado . Plataforma iOS: iOS BundleId debe ser coherente con **Bundle ID (AppID)** configurado cuando se empaqueta la aplicación en la nube en HBuilderX .

Si ya ha abierto UniPush , verá la siguiente página:

inserte la descripción de la imagen aquí

Si necesita admitir a los principales proveedores de Android para recibir notificaciones automáticas fuera de línea, debe completar: Configuración de múltiples proveedores de Android .

La plataforma iOS también necesita cargar el certificado de inserción en la página [Gestión de la configuración] - [Configuración de la aplicación] Para obtener información sobre cómo obtener el certificado de inserción, consulte el tutorial del documento oficial de Getui: Guía de configuración del certificado de iOS .

código central

unipush.js

// 监听push消息 以及 后台数据回复
import phoneInfo from '@/common/js/phone-info.js';
import store from '@/store'
let timer = null;
let numloop = 0;
import {
    
    
  pushEscalation // 绑定别名的接口
} from "@/api/client-notice.js"

// 消息推送 应用配置(这些给后端用的)
const uniPushObj = {
    
    
  cid: "",
  AppID: "你的AppID",
  AppKey: "你的AppKey",
  AppSecret: "你的AppSecret",
  MasterSecret: "你的MasterSecret",
}

export default {
    
    
  getInfo() {
    
    
    uni.getSystemInfo({
    
    
      success: res => {
    
    
        phoneInfo.systemInfo = res;
      }
    });
  },
  // 开启监听推送 
pushListener() {
    
    
  const token = uni.getStorageSync("token") || store.state.token;
  const platform = phoneInfo.systemInfo.platform.toLowerCase();
  // 点击推送信息
  plus.push.addEventListener('click', res => {
    
    
    // 其实在这里就可以根据你自己的业务去写了
    if (token) {
    
    
      if (platform == 'android') {
    
    
        const msg_type = res.payload.msg_type // 0 在线 || 1 离线
        // 做些什么 这里处理你的逻辑
        if (msg_type == 0) {
    
    
          console.log('安卓------在线');
        } else {
    
    
          console.log('安卓------离线');
        }
      } else {
    
    
        //  在线
        if (res.aps == null) {
    
    
          console.log('苹果------在线');
        } else {
    
    
        // 离线
          console.log('苹果------离线');
        }
      }
    } else {
    
    
      // 这里跳登录页了
      uni.redirectTo({
    
    
        url: `pages/Login-Reg/Login/email-login`
      })
    }
  });
  // 接收推送信息  在线
  plus.push.addEventListener('receive', res => {
    
    
    const messageTitle = res.title;
    const messageContent = res.content;
    if (platform == 'android') {
    
    
      /***  
        安卓监听不到  因为安卓这个格式被封装了,做成了通知栏展示
        换个格式就行(比如里面多个字段,或换个字段名)
      */
      /***
        此格式的透传消息由 unipush 做了特殊处理, 会自动展示通知栏 
        开发者也可自定义其它格式, 在客户端自己处理
      */
      //   "push_message": {
    
    
      //     "transmission": "{
    
    
      //       title:\"标题\",
      //       content:\"内容\",
      //       payload:\"自定义数据\"
      //     }"
      //   },
      // Hbulidx 版本大于 ## 3.4.18,安卓不再通知栏展示, 需要自行创建通知
      plus.push.createMessage(messageContent, res.payload, {
    
    
        title: messageTitle
      });
      // 或者在 onlaunch 写入
      // plus.push.setAutoNotification(true);
    } else {
    
    
      const type = res.type
      //【APP离线】收到消息,但没有提醒(发生在一次收到多个离线消息时,只有一个有提醒,但其他的没有提醒)  
      //【APP在线】收到消息,不会触发系统消息,需要创建本地消息,但不能重复创建
	    // 必须加msg.type验证去除死循环        
      if (res.aps == null && type == "receive") {
    
    
        //创建本地消息,发送的本地消息也会被receive方法接收到,但没有type属性,且aps是null  
        plus.push.createMessage(messageContent, res.payload, {
    
    
          title: messageTitle
        });
      }
    }
  });
  },
  // 循环获取clientid信息,直到获取到为止
  getClientInfoLoop() {
    
    
    plus.push.getClientInfoAsync(info => {
    
    
      // 如果info不存在,或者info存在,cid不存在则再次获取cid
      if (!info || !info.clientid) {
    
    
        console.log("cid为空=========================================");
        let infoTimer = null;
        infoTimer = setInterval(function() {
    
    
          if (cid) {
    
    
            clearInterval(infoTimer); //清定时器
            uni.showModal({
    
    
              content: cid
            })
            uni.setStorageSync('cid', cid); 
            uniPushObj.cid = cid 
          }
        }, 50);
      } else if (info && info.clientid) {
    
    
        let cid = info.clientid;
        uni.setStorageSync('cid', cid);
        uniPushObj.cid = cid
      }
    }, function(e) {
    
    
      console.log('Failed', JSON.stringify(e));
      let pinf = plus.push.getClientInfo();
      let cid = pinf.clientid; //客户端标识 
      if (cid) {
    
    
        uni.setStorageSync('cid', cid);
        uniPushObj.cid = cid
      }
    })
  },
  /** 
   * 向后台传送cid,绑定别名
   */
  passCid() {
    
    
    pushEscalation({
    
    
      "appid": uniPushObj.AppID,
      "cid": uniPushObj.cid
    }).then(response => {
    
    
      if (response.Code == 0) {
    
    
        console.log('----------> cid 绑定别名成功', response);
      }
    })
  },
}

teléfono-info.js

export default {
    
    
	systemInfo: {
    
    }, // 系统设备信息
	manifestInfo: "" || uni.getStorageSync("widgetInfo"), // manifest.json 应用信息
}

APP.ver

<script>
  import phoneInfo from '@/common/js/phone-info.js';
  import uniPushListener from '@/common/js/unipush.js';
  export default {
      
      
    onLaunch: function() {
      
      
      uniPushListener.getInfo();
      // #ifdef APP-PLUS
      plus.screen.lockOrientation('portrait-primary'); //锁定屏幕方向
      uni.setStorageSync('cancelUpdate', 'false'); // 进来APP 重置更新弹窗
      // 获取App 当前版本号
      if (Object.keys(uni.getStorageSync('widgetInfo')).length == 0) {
      
      
          plus.runtime.getProperty(plus.runtime.appid, widgetInfo => {
      
      
              phoneInfo.manifestInfo = widgetInfo;
              uni.setStorageSync('widgetInfo', widgetInfo);
          });
      }
      uniPushListener.getClientInfoLoop(); // 循环获取cid
      plus.runtime.setBadgeNumber(0); // 角标清空
      uniPushListener.pushListener(); // 监听通知栏信息
      //#endif
    }
  };
</script>

Supongo que te gusta

Origin blog.csdn.net/qq_41356250/article/details/128845739
Recomendado
Clasificación