草庐IT

Uni-app实现推送Uni-push(Android)

去努力 2023-06-20 原文

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档

文章目录


前言

        国内Android的Push是一个混乱的世界,因为 Google 的 Push 服务 FCM 被墙,所以一些国内的安卓手机厂商各自做了自己的推送,比如华为、小米、OPPO、VIVO、魅族等,但还有很多国产手机厂商没有提供官方推送方案。三方独立公司如个推,则提供了独立的 push 方案。
在没有 uniPush 以前,如果只使用三方 push,会在很多国产手机上因为节电设置而无法保活 push 进程,导致无法推送。
而如果每个安卓手机的官方 Push SDK 都集成开发一遍,这么多平台,工作量会非常巨大,管理维护也很麻烦。

uniPush 解决了这个难题,开发者只需要开发一次。系统会自动在不同手机上选择最可靠的推送通道发送 push 消息,保障送达率。

UniPush 即降低了开发成本、又提高了 push 送达率,并且免费,是当前推送的最佳解决方案。


提示:以下是本篇文章正文内容,下面案例可供参考

一、UniPush是什么?

        UniPush 是 DCloud 联合个推公司推出的集成型统一推送服务,内建了苹果、华为、小米、OPPO、VIVO、魅族、谷歌 FCM 等手机厂商的系统级推送和个推等第三方推送。

二、使用步骤

1.开通Unipush推送服务

        HBuilderX 本项目中打开manifest.json,选择“App 模块配置”,向下找到Push推送功能配置,勾选 “UniPush(集成各家手机厂商系统推送及个推)” 即可。

 点击勾选的uniPush配置进入DCloud开发者中心

**注意:**在申请开通时,需要确保输入的 Android包名  Android应用签名 (签名信息可点击更多查看具体操作)必须与打包时配置的一致,否则可能会导致无法收到推送消息。

如果已经开通 Uni Push,会看到如下页面:

 

打开链接开发者中心https://dev.dcloud.net.cn/#/pages/app/push/thirdparty

Uni Push 集成并统一了各个手机厂商的系统级推送,目前支持魅族、OPPO、华为、小米、VIVO。如果需要使用厂商推送,需要先在各厂商开发者平台申请。
申请通过后厂商会提供推送的相关参数,需要将这些参数配置到 DCloud 开发者中心后台。
点击厂商推送设置选择当前应用项目页面如下图所示:

由于公司APP需求上线华为,打开AppGallery Connect网站,选择我的项目。打开刚才创建的项目,查看应用信息中相应的华为 AppID、华为 SecretKey。该信息在之后步骤中将会使用,如下图:

其他厂商具体流程点击 厂商应用开通指南-个推文档中心查看详情。

2.java服务端下发消息内容

        首先需要获取AppId、AppKey、MasterSecret参数,登录DCloud开发者中心,在“Uni Push”下的“应用配置”页面中获取,引入maven库文件,在线走内推,离线走个推,Java-sdk封装Rest-V2厂商推送示例:

完整服务端厂商推送教程参考:https://docs.getui.com/getui/server/rest_v2/common_args/

        <dependency>
            <groupId>com.gexin.platform</groupId>
            <artifactId>gexin-rp-sdk-http</artifactId>
            <version>4.1.2.1</version>
        </dependency>

        <repository>
            <id>getui-nexus</id>
            <url>http://mvn.gt.igexin.com/nexus/content/repositories/releases/</url>
        </repository>
public AjaxResult info( String commonApiModel ) {
        CommonInterfaceModel model = jsonToObject(commonApiModel,key,secret);
        if(model.isCheck()) {
            Order appPush = JSONObject.parseObject(model.getParameter(),Order.class);
            IGtPush push = new IGtPush(url, appKey, masterSecret);

            Style0 style = new Style0();
            // STEP2:设置推送标题、推送内容
            style.setTitle(appPush.getOdTitle());
            style.setText(appPush.getOdContent());
            // 设置推送图标
//            style.setLogo("./src/main/resources/static/push.png");
            // 配置通知栏网络图标
//            style.setLogoUrl("");
            // STEP3:设置响铃、震动等推送效果
            // 设置响铃
            style.setRing(true);
            // 设置震动
            style.setVibrate(true);

            // STEP4:选择通知模板
            NotificationTemplate template = new NotificationTemplate();
            template.setTransmissionType(1);
            template.setAppId(appId);
            template.setAppkey(appKey);
            template.setStyle(style);

            SingleMessage message = new SingleMessage();
            message.setOffline(true);
            // 离线有效时间,单位为毫秒
            message.setOfflineExpireTime(24 * 3600 * 1000);
            message.setData(template);
            // 可选,1为wifi,0为不限制网络环境。根据手机处于的网络情况,决定是否下发
            message.setPushNetWorkType(0);

            Target target = new Target();
            target.setAppId(appId);
            target.setClientId(appPush.getClientId());

            IPushResult ret = null;
            try {
                ret = push.pushMessageToSingle(message, target);
            } catch (RequestException e) {
                System.out.println(e.getMessage());
                ret = push.pushMessageToSingle(message, target, e.getRequestId());
            }
            if (ret != null) {
                System.out.println("返回结果=====" + ret.getResponse().toString());
            } else {
                System.out.println("服务器响应异常=====");
            }
            return AjaxResult.success(ret.getResponse().toString());
        } else {
            return AjaxResult.error("秘钥或参数错误");
        }
    }

3.测试预览

        必须打包正式App安装到手机并要保证第一步(Android包名Android应用签名)的操作没有问题,手机端通过plus.push.getClientInfo();获取CID客户端标识,也是下一步需要存到数据库的标识串,如下图:

// 获取App端cid
let CID= plus.push.getClientInfo();
console.log(CID)

 

4.手机端处理

        需求是针对用户在审核过程中下发到指定人,此人就可以在手机上获得推送消息通知。大概逻辑比较简单,App端获取到cid,通过登录判断当前人是否要接消息通知,通过接口存到对应人的数据库,服务端再通过集成的个推sdk把对应的cid,下发给App端,来完成交互。个推,批量推,群推,可根据业务需求进行更改设定。

App.vue页面:

    // #ifdef APP-PLUS
		let timer = false;
		plus.push.addEventListener("click",(msg)=>{
			clearTimeout(timer);
			timer = setTimeout(()=>{
				console.log(1111,msg);
			},1500)
		},false)
		plus.push.addEventListener("receive",(msg)=>{
			if("LocalMSG" == msg.payload){
			}else{
				if(msg.type=='receive'){
					var options = {cover:false,title:msg.title};
					plus.push.createMessage(msg.content, msg.payload, options ); 
				 }  
			}
		},false)
	// #endif

登录页面:

let pinf = plus.push.getClientInfo();
let cid = pinf && pinf.clientid || ''; //客户端标识
// 登录根据userId更新存数据库clientId
//发送网络请求
let opts = {url: '/app/*****',method: 'post'}
this.$http.httpTokenRequest(opts,{clientId:cid,userId:res.data.data.userId}).then(res => {
    if(res.data.code == 200){
        //继续执行登录逻辑
	}else{
		uni.showToast({title: '登录异常,请联系管理员。',icon: "none",})
	}
})

推荐

推荐看一下Unipush常见问题 - DCloud问答基本概括了常见的所有问题,希望能帮到你。

有关Uni-app实现推送Uni-push(Android)的更多相关文章

  1. ruby - RuntimeError(自动加载常量 Apps 多线程时检测到循环依赖 - 2

    我收到这个错误:RuntimeError(自动加载常量Apps时检测到循环依赖当我使用多线程时。下面是我的代码。为什么会这样?我尝试多线程的原因是因为我正在编写一个HTML抓取应用程序。对Nokogiri::HTML(open())的调用是一个同步阻塞调用,需要1秒才能返回,我有100,000多个页面要访问,所以我试图运行多个线程来解决这个问题。有更好的方法吗?classToolsController0)app.website=array.join(',')putsapp.websiteelseapp.website="NONE"endapp.saveapps=Apps.order("

  2. ruby - 如何根据特征实现 FactoryGirl 的条件行为 - 2

    我有一个用户工厂。我希望默认情况下确认用户。但是鉴于unconfirmed特征,我不希望它们被确认。虽然我有一个基于实现细节而不是抽象的工作实现,但我想知道如何正确地做到这一点。factory:userdoafter(:create)do|user,evaluator|#unwantedimplementationdetailshereunlessFactoryGirl.factories[:user].defined_traits.map(&:name).include?(:unconfirmed)user.confirm!endendtrait:unconfirmeddoenden

  3. ruby-on-rails - 每次我尝试部署时,我都会得到 - (gcloud.preview.app.deploy) 错误响应 : [4] DEADLINE_EXCEEDED - 2

    我是Google云的新手,我正在尝试对其进行首次部署。我的第一个部署是RubyonRails项目。我基本上是在关注thisguideinthegoogleclouddocumentation.唯一的区别是我使用的是我自己的项目,而不是他们提供的“helloworld”项目。这是我的app.yaml文件runtime:customvm:trueentrypoint:bundleexecrackup-p8080-Eproductionconfig.ruresources:cpu:0.5memory_gb:1.3disk_size_gb:10当我转到我的项目目录并运行gcloudprevie

  4. ruby-on-rails - 如何重命名或移动 Rails 的 README_FOR_APP - 2

    当我在我的Rails应用程序根目录中运行rakedoc:app时,API文档是使用/doc/README_FOR_APP作为主页生成的。我想向该文件添加.rdoc扩展名,以便它在GitHub上正确呈现。更好的是,我想将它移动到应用程序根目录(/README.rdoc)。有没有办法通过修改包含的rake/rdoctask任务在我的Rakefile中执行此操作?是否有某个地方可以查找可以修改的主页文件的名称?还是我必须编写一个新的Rake任务?额外的问题:Rails应用程序的两个单独文件/README和/doc/README_FOR_APP背后的逻辑是什么?为什么不只有一个?

  5. 华为OD机试用Python实现 -【明明的随机数】 2023Q1A - 2

    华为OD机试题本篇题目:明明的随机数题目输入描述输出描述:示例1输入输出说明代码编写思路最近更新的博客华为od2023|什么是华为od,od薪资待遇,od机试题清单华为OD机试真题大全,用Python解华为机试题|机试宝典【华为OD机试】全流程解析+经验分享,题型分享,防作弊指南华为o

  6. 基于C#实现简易绘图工具【100010177】 - 2

    C#实现简易绘图工具一.引言实验目的:通过制作窗体应用程序(C#画图软件),熟悉基本的窗体设计过程以及控件设计,事件处理等,熟悉使用C#的winform窗体进行绘图的基本步骤,对于面向对象编程有更加深刻的体会.Tutorial任务设计一个具有基本功能的画图软件**·包括简单的新建文件,保存,重新绘图等功能**·实现一些基本图形的绘制,包括铅笔和基本形状等,学习橡皮工具的创建**·设计一个合理舒适的UI界面**注明:你可能需要先了解一些关于winform窗体应用程序绘图的基本知识,以及关于GDI+类和结构的知识二.实验环境Windows系统下的visualstudio2017C#窗体应用程序三.

  7. ruby - 使用 postgres.app 在 rvm 下要求 pg 时出错 - 2

    我正在使用Postgres.app在OSX(10.8.3)上。我已经修改了我的PATH,以便应用程序的bin文件夹位于所有其他文件夹之前。Rammy:~phrogz$whichpg_config/Applications/Postgres.app/Contents/MacOS/bin/pg_config我已经安装了rvm并且可以毫无错误地安装pggem,但是当我需要它时我得到一个错误:Rammy:~phrogz$gem-v1.8.25Rammy:~phrogz$geminstallpgFetching:pg-0.15.1.gem(100%)Buildingnativeextension

  8. MIMO-OFDM无线通信技术及MATLAB实现(1)无线信道:传播和衰落 - 2

     MIMO技术的优缺点优点通过下面三个增益来总体概括:阵列增益。阵列增益是指由于接收机通过对接收信号的相干合并而活得的平均SNR的提高。在发射机不知道信道信息的情况下,MIMO系统可以获得的阵列增益与接收天线数成正比复用增益。在采用空间复用方案的MIMO系统中,可以获得复用增益,即信道容量成倍增加。信道容量的增加与min(Nt,Nr)成正比分集增益。在采用空间分集方案的MIMO系统中,可以获得分集增益,即可靠性性能的改善。分集增益用独立衰落支路数来描述,即分集指数。在使用了空时编码的MIMO系统中,由于接收天线或发射天线之间的间距较远,可认为它们各自的大尺度衰落是相互独立的,因此分布式MIMO

  9. 【Java入门】使用Java实现文件夹的遍历 - 2

    遍历文件夹我们通常是使用递归进行操作,这种方式比较简单,也比较容易理解。本文为大家介绍另一种不使用递归的方式,由于没有使用递归,只用到了循环和集合,所以效率更高一些!一、使用递归遍历文件夹整体思路1、使用File封装初始目录,2、打印这个目录3、获取这个目录下所有的子文件和子目录的数组。4、遍历这个数组,取出每个File对象4-1、如果File是否是一个文件,打印4-2、否则就是一个目录,递归调用代码实现publicclassSearchFile{publicstaticvoidmain(String[]args){//初始目录Filedir=newFile("d:/Dev");Datebeg

  10. 安卓apk修改(Android反编译apk) - 2

    最近因为项目需要,需要将Android手机系统自带的某个系统软件反编译并更改里面某个资源,并重新打包,签名生成新的自定义的apk,下面我来介绍一下我的实现过程。APK修改,分为以下几步:反编译解包,修改,重打包,修改签名等步骤。安卓apk修改准备工作1.系统配置好JavaJDK环境变量2.需要root权限的手机(针对系统自带apk,其他软件免root)3.Auto-Sign签名工具4.apktool工具安卓apk修改开始反编译本文拿Android系统里面的Settings.apk做demo,具体如何将apk获取出来在此就不过多介绍了,直接进入主题:按键win+R输入cmd,打开命令窗口,并将路

随机推荐