unipush2.0实现APP消息推送(1)

news2024/9/24 11:25:53

一、 基础概念

1.1 首先理解什么是消息推送?

比如:你手机收到未读消息后会在通知栏显示,该条消息便是某APP的消息推送。多用于有需要从服务端主动发出消息提醒到客户端的场景。

1.2 uniPush & 个推 & 厂商推送的区别

方式个推uniPush(推荐2.0)厂商推送
简介个推提供移动端消息推送服务uniapp集成了个推的各个功能,更好地与uniapp结合各个厂商上也有自己的推送(五大厂商)~华为、小米、OPPO、VIVO、魅族
特点需要收费相当于收费版的个推免费给开发uniapp的人使用免费,但有的厂商有使用条件,比如vivo需要上架应用市场后才可开通

注意大坑:当APP在线时,走个推通道;APP离线时,走厂商推送。(除此之外,每个厂商推送还要需要申请消息分类,在消息推送时下发标识)

结论

uni-push是DCloud推出的、全端的、云端一体的统一推送服务。

当我们使用 uni-app 开发应用时,使用 uni-push 是最方便的,如下:

  • unipush 拥有个推的收费功能
  • 集成了个推和厂商推送两种推送方式,会自动根据判定APP是否在线,来决定采用哪种方式推送,以保证推送消息的送达率。
  • 尽管使用 unipush,但服务端需使用的文档参考,仍然是个推官网的文档。
  • 推荐使用unipush2.0,集成了一些推送方法,服务端不需要很麻烦了,但这其中有一些坑,下面我会提到。

1.3 理解通知消息 & 透传消息的区别

通知消息透传消息
不同官方 封装 了消息模板、以及客户端点击消息后的事件,若只需要简单地发出消息推送,不处理复杂的点击后的逻辑,使用通知消息即可。完全 可自定义 模板及点击消息后事件的消息,若需要处理自定义的点击后的逻辑,使用透传消息更佳。

1.4 理解cid & 在线推送 & 离线推送的区别

ClientId在线推送离线推送
简介个推业务层中的对外用户标识,用于标识客户端身份,由第三方客户端获取并保存到第三方服务端,是个推 SDK 的唯一识别号。app 在前台打开运行时,通过个推渠道下发消息。app在后台、锁屏、进程关闭时,通过厂商渠道下发消息。
特点简称CID在线走个推若未集成 android 多厂商、未配置 ios 推送证书,则该机型无法使用离线推送。

 1.5 消息下发流程

 二、uniPush2.0推送流程

注意:unipush 内部封装好了个推及主流厂商 SDK,开发者在使用前必须开通相关服务。

2.1 登录开发者中心配置应用信息(这里我使用的云打包自有证书

2.2 开启消息推送服务

2.3  开通离线厂商推送服务(因为我个人使用华为手机,方便起见以华为为例)

若未完成开通离线厂商推送,只有在 app 在线时才能收到消息

  • Android 多厂商开通:个推与主流安卓厂商合作融合了厂商推送 SDK,在后台配置 “厂商推送设置” 、并云打包后,可以同时使用 “离线推送”,能提高在安卓厂商设备上的消息到达率。

    • 目前华为、荣耀、魅族、oppo(测试环境)不要求上架应用商店;vivo 、小米、oppo(正式环境)必须上架应用商店后才可使用离线厂商推送。
  • iOS 推送证书生成:iOS 支持的推送通知功能,从苹果开发者官网导出证书并配置在后台的 “厂商推送设置” 后,可以同时使用 “离线推送”,能提高在 iOS 设备上的消息到达率。

    • iOS 使用推送无需上架 Appstore

参数统一配置在下图所示位置,且云打包后 app 端才会生效:

注意:厂商配置需要填写的信息均在各个厂商创建完应用生成了,注意包名要正确哦

各个厂商配置文档icon-default.png?t=N7T8https://uniapp.dcloud.net.cn/unipush_vendor_config.html

 2.4 进行云打包测试(建议测试阶段打基座,可以打印出cid方便测试)

打开 HBuilderX (3.5.1及其以上版本),双击项目中的 “manifest.json” 文件,选择“App 模块配置”,向下找到“Push(消息推送)”,勾选后,点击 “uniPush” 下面配置。

如图所示:

2.5 开发者中心后台验证是否可进行推送

2.5.1 客户端获取 cid (一般在app.vue应用启动后就拿到)

启动 app 后成功获取 cid 则说明云打包 “在线推送” 成功,支持在线推送。

先跟着示例代码简单体验,详细的uni.getPushClientId API介绍 详情参考 代码示例:

// uni-app客户端获取push客户端标记,代码可以实现在App.vue中  
uni.getPushClientId({  
    success: (res) => {  
        let push_clientid = res.cid  
        console.log('客户端推送标识cid:',push_clientid)  
    },  
    fail(err) {  
        console.log(err)  
    }  
})

2.5.2 厂商配置完成后进行校验厂商离线推送是否集成成功

输入上方获取的 cid ,查询到对应的 Device Token 则说明云打包 “离线推送” 成功,同时支持离线推送。

如果未查询到 device token,则只能 “在线推送” 。若需要使用 “离线推送” 请重新检查 ”1.2 开通离线厂商推送服务“ 。

2.6 服务端推送消息

注意:使用 uni-push 2.0,服务端不支持用个推 api 推送,只能用 dcloud 提供的 服务端(云函数)推送 。

2.6.1 创建云函数

a.点击项目右键创建云函数

b.创建完成后右键关联云空间,生成俩文件

c.点击右键创建云函数

d.管理依赖模块选择要关联的依赖库,点击确定

e:创建表

注意:扩展库依赖 3 张 opendb 表opendb-tempdata,opendb-device,uni-id-device。公测版 uniCloud,执行扩展库会自动创建。如果你使用的是 uniCloud 正式版需要自己在 uniCloud 的 web控制台 创建这3张表。

f.这样可以来在云函数里面来调用unipush2.0的方法了

unipush2.0调用服务端api

2.6.2 云函数执行

在云函数文件目录右键(或按快捷键ctrl + r)-> 上传并运行云函数,此时你的客户端将收到推送消息(应用关闭时为通知栏消息,在线时代码监听到推送消息)。 

云函数中调用uni-cloud-push扩展库的sendMessage方法,向客户端推送消息

'use strict';  
const uniPush = uniCloud.getPushManager({appId:"__UNI__B88"}) //注意这里需要传入你的应用appId  
exports.main = async (event, context) => {  
    return await uniPush.sendMessage({  
        "push_clientid": "9811ea13bf6ef53a68c97658222a00e0",     //填写上一步在uni-app客户端获取到的客户端推送标识push_clientid  
        "force_notification":true,  //填写true,客户端就会对在线消息自动创建“通知栏消息”。  
        "title": "通知栏显示的标题",      
        "content": "通知栏显示的内容",  
        "payload": {  
            "text":"体验一下uni-push2.0"  
        },
        "options":{  
            "HW": {  
                 // 1 表示华为测试消息,华为每个应用每日可发送该测试消息500条,此target_user_type 参数请勿发布至线上。  
                  "/message/android/target_user_type":1  
              }  
        }  
    })  
};

在线消息无额度限制。离线推送各厂商的限额,详见: 厂商通道限额

如果你希望当应用在线时,也通过“通知栏消息”来提醒用户;可以通过以下两种方式实现:

  1. 监听到消息内容后,根据业务需要自己判断是否要创建“通知栏消息”,需要就调用创建本地消息API uni.createPushMessage手动创建通知栏消息。
  2. 服务端执行推送时,传递参数force_notification:true,客户端就会自动创建“通知栏消息”(此时你监听不到消息内容),当用户点击通知栏消息后,APP才能监听到消息内容。

先跟着示例代码简单体验,详细的 uniPush.sendMessage API介绍 详情参考
检查确认当前 app 的通知栏权限开启后,则可以开始进行推送测试。

 2.6.3 手机测试收到消息

大功告成,如果您已经成功收到 在线 和 离线 的消息展示,那说明已经集成推送成功啦!

2.6.4 云函数url化(上线必须的,测试时可不用

在 uniCloud 的云函数中,加载扩展库 uni-cloud-push,直接调用相关 API,无需额外的服务端配置。

传统服务器开发者(例如:Java、php、python等)需要把这个 云函数URL化 后变成 http 接口,再由代码调用这个 http 接口。

云函数URL化 步骤如下

a.修改后的云函数代码本地运行测试没问题了就需要上传部署

b.去云空间找到创建的云函数,点击详情,拿到自动生成的云函数url化添加后缀

c.测试时可直接拿这个地址,上线需要更改哦,自己配置云函数url化

使用场景 | uni-app官网 (dcloud.net.cn)

 8.去postman进行测试,请求成功代表大功告成了 

云函数代码示例

'use strict';  
const uniPush = uniCloud.getPushManager({  
appId: "你的__UNI__开头的AppId"  
})  
exports.main = async (event) => {  
    let obj = JSON.parse(event.body)  //这是重点 解析json字符串
        const res = await uniPush.sendMessage({  
        "push_clientid": obj.cids, // 设备id,支持多个以数组的形式指定多个设备,如["cid-1","cid-2"],数组长度不大于1000  
        "title": obj.title, // 标题  
        "content": obj.content, // 内容  
        "payload": obj.data, // 数据  
        "force_notification": true, // 服务端推送 需要加这一句  
        "request_id": obj.request_id ,//请求唯一标识号,10-32位之间;如果request_id重复,会导致消息丢失  
        "options":obj.options //消息分类,没申请可以不传这个参数  
    })  
    return res;  
};

apifox请求示例

{  
"cids":"",  
"title": "华为测试",  
"content": "体验一下华为测试2",
"data": {  
"text":"体验一下uni-push2.0"
},
"options":{
"HW": {  
"/message/android/category": "DEVICE_REMINDER"  
} 
}, 
"request_id": "9643577510101953780112"  
}

2.7 客户端接收消息

客户端监听推送消息

如果您需要对接收到的消息进行自定义处理,可以再阅读一下本文开头的 “消息下发流程图”。

客户端监听推送消息的代码,需要在收到推送消息之前被执行。所以应当写在应用一启动就会触发的 应用生命周期 onLaunch中。

//文件路径:项目根目录/App.vue  
export default {  
    onLaunch: function() {  
        console.log('App Launch')  
        uni.onPushMessage((res) => {  
            console.log("收到推送消息:",res) //监听推送消息  
        })  
    },  
    onShow: function() {  
        console.log('App Show')  
    },  
    onHide: function() {  
        console.log('App Hide')  
    }  
}
 详细的 uni.onPushMessage API介绍 详情参考

三、注意事项:

3.1上架规则

app 若需要上架应用商店,须配置 隐私弹窗 提示用户。

3.2 一路走来踩了很多坑,参考文档如下

unipush2.0官网

个推官网

参考个推官网指南

各个厂商配置官方文档

3.3 注意大坑

1.离线推送必须配置厂家消息分类,在opotions参数对应每个厂家的消息分类标识。

2.调用uniPush服务端api时必须解析json字符串格式,否则会出错。

3.注意如果想要在一个云函数里面让传统服务端调用多个不同方法,参考我下篇文章有写到具体实现方法unipush2.0实现APP消息推送(2)云函数多个方法的创建与使用

 

        记录一下使用uniPush2.0过程中踩的坑,希望能帮助到大家,奥利给!!! 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/986025.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

js摄像头动态检测

利用摄像头每一秒截图一次图像。然后计算2次图像之间的相似度。 如果相似度低于98%就会报警。 var video document.getElementsByClassName(inputvideo)[0]; video.innerHTML "<video classinput_video idcamera autoplay width640px height380px></video>…

LeetCode 1123. Lowest Common Ancestor of Deepest Leaves【树,DFS,BFS,哈希表】1607

本文属于「征服LeetCode」系列文章之一&#xff0c;这一系列正式开始于2021/08/12。由于LeetCode上部分题目有锁&#xff0c;本系列将至少持续到刷完所有无锁题之日为止&#xff1b;由于LeetCode还在不断地创建新题&#xff0c;本系列的终止日期可能是永远。在这一系列刷题文章…

2023高教社杯数学建模C题思路模型 - 蔬菜类商品的自动定价与补货决策

# 1 赛题 在生鲜商超中&#xff0c;一般蔬菜类商品的保鲜期都比较短&#xff0c;且品相随销售时间的增加而变差&#xff0c; 大部分品种如当日未售出&#xff0c;隔日就无法再售。因此&#xff0c; 商超通常会根据各商品的历史销售和需 求情况每天进行补货。 由于商超销售的蔬菜…

X86_64函数调用汇编程序分析

X86_64函数调用汇编程序分析 1 X86_64寄存器使用标准2 对应代码的分析2.1 main函数及其对应的汇编程序2.1.1 main的C代码实现2.1.2 main函数对应汇编及其分析2.1.3 执行完成之后栈的存放情况 2.2 test_fun_a函数及其对应的汇编程序2.2.1 test_fun_a函数的C实现2.2.2 test_fun_a…

【工作技术栈】【源码解读】一次springboot注入bean失败问题的排查过程

目录 前言现象分析原因解决方法思考感悟 前言 对这次的过程排查如果要形容的话&#xff0c;我觉得更像是悬疑剧&#xff0c;bean not found 这种错误&#xff0c;已经看腻了&#xff0c;甚至有时候都看不起这种错误&#xff0c;但是似乎这个想法被springboot听见了&#xff0c…

spring-security-源码解析+自定义拓展

1.参考文档 https://docs.spring.io/spring-security/reference/5.7/servlet/architecture.html 1.1.各种filterchain 1.1.1.SecurityFilterChain 1.1.2.springSecurityFilterChain 1.1.3.Security Filters 2.几个重要的注解 2.1.EnableXXX EnableWebMvcSecurity–deprecate…

C语言之初阶总结篇

目录 NO.1 NO.2 NO.3 NO.4 NO.5 NO.6 NO.7 NO.8 NO.9 NO.10 NO.11 NO.12.概念tips NO.13.求最小公倍数 NO.14.最大公因数 NO.15.输入读取字符串 NO.16.倒置字符串 今天是一些C语言题目&#xff0c;最近天气炎热&#xff0c;多喝水。 NO.1 下面程序执行后&am…

浅谈泛在电力物联网、能源互联网与虚拟电厂

导读&#xff1a;从能源互联网推进受阻&#xff0c;到泛在电力物联网名噪一时&#xff0c;到虚拟电厂再次走向火爆&#xff0c;能源领域亟需更进一步的数智化发展。如今&#xff0c;随着新型电力系统建设推进&#xff0c;虚拟电厂有望迎来快速发展。除了国网和南网公司下属的电…

LLMs之Baichuan 2:《Baichuan 2: Open Large-scale Language Models》翻译与解读

LLMs之Baichuan 2&#xff1a;《Baichuan 2: Open Large-scale Language Models》翻译与解读 导读&#xff1a;2023年9月6日&#xff0c;百川智能重磅发布Baichuan 2。科技论文主要介绍了Baichuan 2&#xff0c;一个开源的大规模语言模型&#xff0c;以及其在多个领域的性能表现…

与 vmx86 驱动程序的版本不匹配: 预期为 410.0,实际为 401.0

与 vmx86 驱动程序的版本不匹配: 预期为 410.0&#xff0c;实际为 401.0。 驱动程序“vmx86.sys”的版本不正确。请尝试重新安装 VMware Workstation。 我电脑历史上装过几个版本的vmware workstation: 怀疑是不兼容版本生成的vmx.86.sys 在系统中和该软件冲突&#xff0c;又没…

【完整代码】2023数学建模国赛C题代码--蔬菜类商品的自动定价与补货决策

C 题 蔬菜类商品的自动定价与补货决策 在生鲜商超中&#xff0c;一般蔬菜类商品的保鲜期都比较短&#xff0c;且品相随销售时间的增加而变差&#xff0c; 大部分品种如当日未售出&#xff0c;隔日就无法再售。因此&#xff0c;商超通常会根据各商品的历史销售和需 求情况每天进…

java+ssh+mysql智能化办公管理系统

项目介绍&#xff1a; 本系统为基于jspsshmysql的OA智能办公管理系统&#xff0c;包含管理员、领导、员工角色&#xff0c;功能如下&#xff1a; 管理员&#xff1a;公告信息&#xff1b;工作计划&#xff1b;公司资料&#xff1b;部门管理&#xff1b;员工管理&#xff1b;员…

软件测试/测试开发丨Linux进阶命令

点此获取更多相关资料 本文为霍格沃兹测试开发学社学员学习笔记分享 原文链接&#xff1a;https://ceshiren.com/t/topic/27139 一、Linux进阶命令学习 curljq 二、curl简介 curl 是一个发送请求数据给服务器的工具 curl支持的协议有&#xff1a;FTP、FTPS、HTTP、HTTP、SFTP…

深度学习推荐系统(七)NFM模型及其在Criteo数据集上的应用

深度学习推荐系统(七)NFM模型及其在Criteo数据集上的应用 1 NFM模型原理及其实现 1.1 NFM模型原理 无论是 FM&#xff0c;还是其改进模型FFM&#xff0c;归根结底是⼀个⼆阶特征交叉的模型。受组合爆炸问题的困扰&#xff0c;FM 几乎不可能扩展到三阶以上&#xff0c;这就不…

sonarqube的基本使用

操作截图 下载一个中文插件。 插件安装成功&#xff0c;提示需要重启sonarqube。 通过maven的命令对代码进行测试 找到maven。 修改apache-maven-3.6.1\setting.xml。 通过以下命令对当前代码进行质量检测。 检测完毕。 回到sonarqube&#xff0c;看到刚刚检测的结果…

【Unity3D赛车游戏优化篇】【十】汽车粒子特效和引擎咆哮打造极速漂移

&#x1f468;‍&#x1f4bb;个人主页&#xff1a;元宇宙-秩沅 &#x1f468;‍&#x1f4bb; hallo 欢迎 点赞&#x1f44d; 收藏⭐ 留言&#x1f4dd; 加关注✅! &#x1f468;‍&#x1f4bb; 本文由 秩沅 原创 &#x1f468;‍&#x1f4bb; 收录于专栏&#xff1a;Uni…

Nginx 学习(十)高可用中间件的配置与实现

一 Keepalived热备 1 概述 调度器出现单点故障&#xff0c;如何解决?Keepalived实现了高可用集群Keepalived最初是为LVS设计的&#xff0c;专门监控各服务器节点的状态Keepalived后来加入了VRRP功能&#xff0c;防止单点故障 2 运行原理 Keepalived检测每个服务器节点状…

湖南省副省长秦国文一行调研考察亚信科技

9月5日&#xff0c;湖南省人民政府党组成员、副省长秦国文一行到亚信科技调研考察&#xff0c;亚信科技高级副总裁陈武主持接待。 图&#xff1a;双方合影 在亚信科技创新展示中心&#xff0c;秦国文了解了亚信科技在5G、算力网络、人工智能、大数据等前沿领域的创新探索&…

LeetCode 865. Smallest Subtree with all the Deepest Nodes【树,DFS,BFS,哈希表】1534

本文属于「征服LeetCode」系列文章之一&#xff0c;这一系列正式开始于2021/08/12。由于LeetCode上部分题目有锁&#xff0c;本系列将至少持续到刷完所有无锁题之日为止&#xff1b;由于LeetCode还在不断地创建新题&#xff0c;本系列的终止日期可能是永远。在这一系列刷题文章…

AVLTree模拟实现

一、常用的搜索逻辑 1、暴力搜索 O(N) 2、二分搜索 前提是有序&#xff0c;可以先用O(NlogN)排序一次&#xff0c;后续每次查找都是logN。 缺点&#xff1a;快排需要容器有随机访问功能&#xff0c;即为顺序表等。 如果不仅要搜索&#xff0c;还要插入删除&#xff0c;此时…