uni-app的unipush实现通知栏推送服务全过程

背景

说明文档这个事情官方应该提供出来,可惜官方觉得是多余的,免费的东西凭啥给你做好。于是我在这里叙述一下实现消息通知推送的步骤。

uni-app官方文档入口
https://uniapp.dcloud.io/api/plugins/push

uniPush官方使用指南
https://ask.dcloud.net.cn/article/35622

推送H5+API接口:
https://www.html5plus.org/doc/zh_cn/push.html

基础环境准备

2.1 DCLOUD平台配置

参考官方教程在dcloud中配置各个厂商的api和secret,这部分不是难点,有问题留言。
https://ask.dcloud.net.cn/article/35716
在这里插入图片描述

为啥要配置厂商呢:
为了在app关闭的时候,可以通过厂商的服务器推送消息给手机通知系统。第三方的消息推送会被阻挡,最好的方式就是按照厂商的要求接入各个推送服务。庆幸的事情,这部分DCLOUD已经帮你做好了。你只需要注册下各个厂商的开发平台,按到appid和secret登录dcloud后台即可。
在这里插入图片描述

2.1 Uni-app权限配置

在这里插入图片描述

2.3 准备自定制测试基座或者云打包

Hbuilder的基座配置的信息都是dcloud的,所以用被人的app是没办法测试推送服务的。解决这个问题有两种
1,云打包时打包成为自己的app后测试
2,制作自定义的基座(很简单),这个基座的信息都是自己的,所以可以测试
运行的时候选择自定制基座,或者直接云打包后的的apk安装到手机测试。

以上就准备好了基本环境

3 体验推送(帮助理解推送的过程)

3.1 APP端代码

代码位置只能在app.vue的onLaunch中,其他地方可能会有问题。

 //#ifdef APP-PLUS  
			 var info = plus.push.getClientInfo();
			console.log( JSON.stringify( info ) );
			 /* 5+  push 消息推送 ps:使用:H5+的方式监听,实现推送*/  
			plus.push.addEventListener("click", function(msg) {  
						console.log("click:"+JSON.stringify(msg));  
						console.log(msg.payload);  
						console.log(JSON.stringify(msg));  
						//这里可以写跳转业务代码
					}, false);  
						// 监听在线消息事件    
					plus.push.addEventListener("receive", function(msg) {  
						// plus.ui.alert(2);  
							//这里可以写跳转业务代码
						console.log("recevice:"+JSON.stringify(msg))  
			   }, false);  

		   //#endif  

这里就是官方文档比较恶心的地方,自己生命onpush之类的api废弃了,但是给的demo还是用的废弃的方式。推荐的H5+api却不给demo。要知道demo对我们就是api文档啊。

这里listener监听的两种事件

  • “click”-从系统消息中心点击消息启动应用事件;
  • “receive”-应用从推送服务器接收到推送消息事件。

上面方法准备好了app端的基本代码,这段代码实现了从推送中心获取消息的能力。具体的实现方式我们可以先不关注。

3.1 测试消息推送(无需服务器代码)

打开dcloud的后台,打开消息推送,填写消息,并点击预览
在这里插入图片描述
这里填写的cid就是APP代码段获取到的clientId,填入后预览系统提示发送成功。

 var info = plus.push.getClientInfo();
			console.log( JSON.stringify( info ) );

在这里插入图片描述
注意:

  1. 手机必须是云打包或者自定义基座运行的app
  2. 填写正确clientId,这个id定位了你的手机,可以理解为手机的ip。
  3. 手机通知权限要打开,要不你就等到天荒地老吧

服务器端代码java版本

step1:个推sdk导入

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

<repositories>
    <repository>
        <id>getui-nexus</id>
        <url>http://mvn.gt.igexin.com/nexus/content/repositories/releases/</url>
    </repository>
 </repositories>

java代简单版

下面代码填入后台申请的appId 、appKey 、masterSecret 后运行即可实现上述等同效果。

import com.gexin.rp.sdk.base.IPushResult;
import com.gexin.rp.sdk.base.impl.AppMessage;
import com.gexin.rp.sdk.http.IGtPush;
import com.gexin.rp.sdk.template.NotificationTemplate;
import com.gexin.rp.sdk.template.style.Style0;

import java.io.IOException;
import java.util.ArrayList;
import java.util.List;

public class PushTest {

    // STEP1:获取应用基本信息
    private static String appId = "";
    private static String appKey = "";
    private static String masterSecret = "";
    private static String url = "http://sdk.open.api.igexin.com/apiex.htm";

    public static void main(String[] args) throws IOException {

        IGtPush push = new IGtPush(url, appKey, masterSecret);

        Style0 style = new Style0();
        // STEP2:设置推送标题、推送内容
        style.setTitle("请输入通知栏标题");
        style.setText("请输入通知栏内容");
        style.setLogo("push.png");  // 设置推送图标
        // STEP3:设置响铃、震动等推送效果
        style.setRing(true);  // 设置响铃
        style.setVibrate(true);  // 设置震动


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


        // STEP5:定义"AppMessage"类型消息对象,设置推送消息有效期等推送参数
        List<String> appIds = new ArrayList<String>();
        appIds.add(appId);
        AppMessage message = new AppMessage();
        message.setData(template);
        message.setAppIdList(appIds);
        message.setOffline(true);
        message.setOfflineExpireTime(1000 * 600);  // 时间单位为毫秒

        // STEP6:执行推送
        IPushResult ret = push.pushMessageToApp(message);
        System.out.println(ret.getResponse().toString());
    }
}

参考文档

DCLOUD完全依赖个推,所以个推的官方文档在uniapp的push模块完全适用。
官方API文档地址:http://docs.getui.com/getui/server/java/guide/
java后端github地址:https://github.com/GetuiLaboratory/getui-pushapi-java-demo
https://www.html5plus.org/doc/zh_cn/push.html#plus.push.PushReceiveCallback
https://ask.dcloud.net.cn/article/35622

感谢这个朋友提供了APP端的入口
https://ask.dcloud.net.cn/article/35630

<think>好的,我现在需要帮助用户解决在uni-app中不依赖UniPush实现消息推送(包括离线推送)的替代方案的问题。首先,我要理解用户的需求。用户希望绕过UniPush,使用其他方法来实现消息推送,特别是离线推送,这可能涉及到不同厂商的推送服务以及跨平台的处理。 接下来,我应该回顾一下用户提供的引用内容。引用[1]提到UniPush需要登录DCloud后台,用户觉得麻烦,想要在自己的后台系统直接操作。引用[2]和[3]分别涉及华为和OPPO的离线推送配置,说明用户可能已经了解过厂商特定的方法,但想找到更通用的解决方案。 首先,我需要考虑uni-app的特点,它是一个跨平台框架,支持多个移动端平台,如Android和iOS。消息推送通常需要处理不同平台的推送机制,尤其是离线推送,因为应用在后台或关闭时,需要系统级的支持才能唤醒。 用户希望不依赖UniPush,所以可能的替代方案包括: 1. 使用各厂商的推送服务直接集成,比如华为的HMSPush、小米的MiPush、OPPO的Push等。但这样可能需要为每个平台单独配置,增加了开发复杂度。 2. 使用第三方推送服务,如极光推送、个推、阿里云移动推送等。这些服务通常提供统一的API,简化多平台适配,但可能需要集成SDK,并处理各厂商的离线通道。 3. 对于iOS,直接使用APNs(Apple Push Notification service),这是官方唯一的推送途径,必须集成。 接下来,我需要考虑如何将这些方案整合到uni-app中。由于uni-app基于Vue.js,并且可以编译到各平台,可能需要使用原生插件或Native.js来调用原生API。或者,寻找支持uni-app的第三方推送库。 另外,离线推送的关键在于各Android厂商的推送服务,因为Google的FCM在国内不可用,所以必须对接各厂商自己的推送SDK。这需要为每个厂商申请账号,配置应用信息,获取必要的密钥或ID,并在代码中初始化对应的SDK。 还需要处理消息到达后的处理逻辑,比如点击通知栏打开应用特定页面,传递参数等。这涉及到Intent配置,如引用[3]中的OPPO推送的Intent格式,可能需要针对不同厂商进行适配。 此外,用户提到要在自己的后台系统推送消息,而不是通过DCloud的后台。因此,需要搭建一个后端服务,调用各推送服务的API发送消息。例如,使用Node.js服务器调用极光推送的API,或者直接调用华为、小米等厂商的HTTP接口。 可能遇到的挑战包括: - 不同厂商的推送服务配置流程复杂,需要注册多个开发者账号,上传应用信息,处理签名和包名等。 - 需要处理Android和iOS的差异,特别是iOS必须使用APNs,且需要处理证书和权限问题。 - 离线推送的可靠性,各厂商可能有不同的限制和配额,需要考虑消息送达率和稳定性。 - 需要维护多个推送渠道的代码,增加开发和测试的工作量。 可能的解决方案步骤: 1. 选择第三方推送服务(如极光推送)作为主要集成对象,因为它们通常已经集成了各厂商的离线通道,减少开发工作量。 2.uni-app项目中集成第三方推送的SDK,可能需要使用原生插件,或者通过uni-app的Native.js调用原生方法。 3. 配置各厂商的推送服务,如华为、小米、OPPO、vivo等,获取AppID和AppKey,配置到第三方推送平台。 4.uni-app中编写代码,初始化推送服务,获取设备标识(如Registration ID),并上传到自己的服务器。 5. 搭建后端服务(如Node.js),接收需要推送的消息,调用第三方推送服务的API发送通知。 6. 处理客户端收到的推送消息,解析参数并跳转到相应页面。 需要验证这些步骤的可行性,比如查看uni-app是否支持原生插件,或者是否有现成的第三方推送插件可用。例如,极光推送可能有uni-app的插件,或者需要自己封装原生模块。 另外,需要考虑离线推送的配置是否正确,比如华为推送需要上传安装包(引用[2]),确保包名和签名一致,否则无法收到推送。对于iOS,需要生成APNs证书,并在推送服务中配置。 总结下来,替代UniPush的方案主要是利用第三方推送服务或直接集成各厂商SDK,配合后端服务发送消息。这需要处理多平台配置、SDK集成、后端开发等工作,但能够实现不依赖UniPush的消息推送,包括离线推送。</think>在uni-app实现不依赖UniPush的消息推送(含离线推送),可通过以下方案实现--- ### 一、主流替代方案 #### 1. **第三方推送服务集成** - **极光推送(JPush)** 支持Android/iOS多平台,集成厂商离线通道(华为、小米等)。需在uni-app中通过原生插件或Native.js调用SDK[^1]。 ```javascript // 示例:初始化极光推送 const jpush = uni.requireNativePlugin('jcore-plugin'); jpush.init(); ``` - **个推(Getui)** 提供uni-app插件,支持离线推送。需在各厂商开放平台注册应用并配置密钥[^2]。 #### 2. **直接对接厂商推送服务** - **华为HMSPush** 需在华为开发者后台配置包名、上传APK,并集成HMS Core插件。 - **小米MiPush/OPPO Push等** 分别注册厂商开发者账号,配置推送权限后,通过原生模块调用推送接口。 #### 3. **iOS APNs推送** - 使用苹果开发者账号生成APNs证书,通过后端调用APNs接口发送推送--- ### 二、实现步骤(以极光推送为例) #### 1. **配置推送服务** - 注册极光开发者账号,创建应用并获取`AppKey`。 - 在华为、小米等厂商后台配置相同包名,启用离线推送。 #### 2. **uni-app端集成** - 安装极光推送原生插件: ```bash npm install jpush-weapp --save ``` - 初始化SDK并获取设备标识: ```javascript // App.vue中初始化 onLaunch() { const JPush = require('jpush-weapp'); JPush.init({ appKey: 'your_app_key' }); JPush.getRegistrationID(res => { console.log('设备标识:', res.registrationId); }); } ``` #### 3. **后端推送消息** - 使用Node.js调用极光API发送推送: ```javascript const axios = require('axios'); axios.post('https://api.jpush.cn/v3/push', { platform: 'all', audience: { registration_id: ['设备标识'] }, notification: { alert: '测试消息' } }, { headers: { Authorization: 'Basic ' + Buffer.from('appKey:masterSecret').toString('base64') } }); ``` #### 4. **处理厂商离线通道** - 华为需在`AndroidManifest.xml`添加配置: ```xml <meta-data android:name="com.huawei.hms.client.appid" android:value="appid=your_huawei_app_id" /> ``` --- ### 三、注意事项 1. **多厂商适配** Android需针对华为、小米、OPPO等分别配置,否则离线推送可能失效[^2][^3]。 2. **iOS证书** APNs需使用生产/开发环境证书,且与App Bundle ID匹配。 3. **推送格式兼容** 厂商通道对通知标题、内容长度有限制(如OPPO标题≤32字符)。 --- ### 相关问题 1. 如何解决Android厂商推送的包名冲突问题? 2. iOS APNs推送证书如何生成和配置? 3. 第三方推送服务如何保证消息的高到达率?
评论 57
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值