uni-app 厂商推送指定设备推送无效

uni-app 厂商推送指定设备推送无效

开发环境 版本号 项目创建方式
Windows WIN10 20H2 HBuilderX

产品分类:
uniapp/App

PC开发环境操作系统:
Windows

HBuilderX类型:
正式

HBuilderX版本号:
3.1.13

手机系统:
Android

手机系统版本号:
Android 8.1

手机厂商:
OPPO

手机机型:

页面类型:
vue

vue版本:
vue2

打包方式:
云端

项目创建方式:
HBuilderX

操作步骤:

预期结果:

根据plus.push.getClientInfo().clientid 获取的clientid 可以当做指定的RegistrationId进行指定设备推送通知

实际结果:

plus.push.getClientInfo().clientid 获取的clientid 显示在对应的厂商推送平台根据RegistrationId查找 , 显示没有注册 , 使用android原生开发获取的RegistrationId在对应厂商推送平台是可以推送到指定设备的

bug描述:

uni-app集成厂商推送 , 根据 plus.push.getClientInfo().clientid 获取的推送标识无法在oppo和vivo手机对应开放平台,使用指定RegistrationId进行推送!!! 应用已上线


更多关于uni-app 厂商推送指定设备推送无效的实战教程也可以访问 https://www.itying.com/category-93-b0.html

1 回复

更多关于uni-app 厂商推送指定设备推送无效的实战教程也可以访问 https://www.itying.com/category-93-b0.html


针对您描述的 uni-app 厂商推送中指定设备推送无效的问题,核心在于 plus.push.getClientInfo().clientid 获取的标识与厂商推送平台所需的 RegistrationId 不匹配。这通常是由于 uni-app 云端打包时集成的推送模块配置或使用方式导致的。

主要原因分析:

  1. clientid 与 RegistrationId 的区别

    • plus.push.getClientInfo().clientid 是 uni-app 推送模块(如 uni-push)内部生成的客户端标识,主要用于 uni-push 服务端向设备推送。它可能不是厂商通道(如 OPPO Push、vivo Push)原生的 RegistrationId
    • 厂商推送平台(如 OPPO 开放平台、vivo 开发者平台)要求的 RegistrationId 是设备在厂商推送服务中注册的唯一标识,由厂商推送 SDK 直接生成。
  2. 获取方式问题

    • 在 uni-app 中,如果正确集成了厂商推送并配置了对应的 AppKey、AppSecret 等,厂商通道的 RegistrationId 通常需要通过监听 plus.push.addEventListener('receive', ...) 事件,或在特定回调中获取,而不是直接使用 clientid
    • 原生 Android 开发直接调用厂商 SDK 的 API 获取 RegistrationId,因此与平台匹配。

解决步骤建议:

  1. 确认厂商推送配置

    • 检查 HBuilderX 项目中 manifest.json 的“App 模块配置”中,是否已正确勾选并配置了“Push(消息推送)”,并填写了 OPPO、vivo 等厂商的 AppKey、AppSecret(需在对应厂商开放平台申请)。
    • 云端打包时需确保这些配置已生效。
  2. 正确获取厂商 RegistrationId

    • 在 uni-app 中,尝试通过以下方式获取厂商通道的标识:
      // 监听推送事件,查看回调信息中是否包含厂商相关 ID
      plus.push.addEventListener('receive', function(msg) {
          console.log('推送消息:', JSON.stringify(msg));
          // 检查 msg 中是否有类似 'registrationId' 或厂商特定字段
      });
      
      // 或尝试从 clientinfo 的 detail 中获取
      var info = plus.push.getClientInfo();
      console.log('客户端信息:', JSON.stringify(info));
      // 查看 info 中是否有 'token'、'regid' 等字段(不同厂商可能字段名不同)
回到顶部