h5 个推厂商消息 离线消息推送

使用Dcloud通过厂商通道给H5应用推送消息Android版

推送功能包括三个步骤:注册厂商并申请应用、打包app获取cid、测试推送功能

步骤一:注册厂商开发者账号并申请应用

Dcloud使用的是个推的推送功能,而个推集成了国内大型厂商的推送,所以在使用推送时需要在各厂商注册开发者账号并申请应用,才能使用相应厂商的推送功能。在各厂商申请应用时填写的包名必须与H5项目包名保持一致

分别在小米、华为、魅族注册开发者账号并申请应用后(可以不用申请channel),将appId,secret等信息配置在Dcloud后台。

配置成功后,就可以通过Uni Push给应用推送消息了

步骤二:打包app获取cid

注意:只有打包后的app才能收到推送,可以使用打正式包,或者自定义调试基座,已打包成功的忽略此步骤

手机安装apk后,每一个手机都会获取到一个唯一识别号cid,同一部手机安装同一个应用的编码是唯一的,卸载重新安装时cid也相同。消息推送也是根据cid将消息推送给对应的客户端,所以,如果进行测试的话需要显示的获取用户的cid,在html中加入如下代码,Hbuilder控制台打印的clientid就是手机的唯一识别号cid,在步骤三中就可以根据cid给这部手机推送消息。

document.addEventListener( "plusready", function(){
	
	var info=plus.push.getClientInfo();
console.log(JSON.stringify(info));
}
);
{"id":"unipush","token":"313a128a2c8cdd84c2226d7cd1b1264d","clientid":"313a128a2c8cdd84c2226d7cd1b1264d","appid":"pPyZWxE32a6PXba102Jq009","appkey":"b7dOalX1HR7pqwUx0hp4i13"}

 

打包时需要配置证书,使用keytool生成一个.keystore的证书,具体步骤这里不展开

 

由于每天打包次数有限,建议选择打自定义调试基座,这样改动代码后也不用再次打包,同步到手机后就可以展示运行效果

打包完成需要安装到手机,打开手机设置→关于手机(一般在设置最底部,部分手机在顶部“我的设备”)→版本号(部分手机需要打开更多参数),连续快速点击后会提示打开开发者模式成功,然后回到设置中找到开发者选项,打开USB调试模块,数据线连接电脑后,点击运行→运行到手机或模拟器,右侧会显示出手机,如果打包时选择的是打自定义调试基座,这里需要再次选择自定义调试基座。

安装完成后,手机上会出现一个应用图标。

步骤三:测试推送功能

打开Dcloud管理后台https://dev.dcloud.net.cn 测试推送消息,推送前需要从后台结束移动端的应用,然后点击Uni Push输入标题、内容,点击底部的预览,弹出预计接收人数

 

如果人数大于0,说明已经有移动端安装了应用,否则检查打包及安装过程。

手机端可以接收到推送通知,说明所有配置都是成功的,可以进行编写代码推送,如果没有接收到通知,检查通知栏是否允许应用在通知栏显示,如果允许通知依旧无法收到通知,则需要进行调试排查问题,排查方式后边单独写一篇文章介绍。

下面进行编码测试阶段:

个推官方建议使用v2版本,项目中也使用v2版本。

使用时可以直接通过maven导入相关依赖

在pom.xml中引入

<repository>
			<id>getui-nexus</id>
			<url>http://mvn.gt.getui.com/nexus/content/repositories/releases</url>
		</repository>
<dependency>
			<groupId>com.gexin.platform</groupId>
			<artifactId>gexin-rp-sdk-http</artifactId>
			<version>4.1.2.0</version>
		</dependency>

然后新建AppInfo测试类

消息推送主要分为2部分:项目信息配置、接收对象

 

1、首先需要对类进行初始化,在Dcloud后台获取项目的信息:appId,appsecret,分别进行填写

public class AppInfo {
    public PushApi pushApi;
    public StatisticApi statisticApi;
  
    public void getApi(){
        GtApiConfiguration apiConfiguration = new GtApiConfiguration();
        //填写应用配置
        apiConfiguration.setAppId("XXXXXX");
        apiConfiguration.setAppKey("XXxxxxx");
        apiConfiguration.setMasterSecret("XXXXXx");
        // 接口调用前缀,请查看文档: 接口调用规范 -> 接口前缀, 可不填写appId
        apiConfiguration.setDomain("https://restapi.getui.com/v2/");
        // 实例化ApiHelper对象,用于创建接口对象
        ApiHelper apiHelper = ApiHelper.build(apiConfiguration);
        // 创建对象,建议复用。目前有PushApi、StatisticApi、UserApi
        pushApi = apiHelper.creatApi(PushApi.class);
        statisticApi=apiHelper.creatApi(StatisticApi.class);
    }

2、配置好项目信息后,把步骤二中的cid设置为接收对象,替换代码中的cid,手机通知栏就可以收到推送通知。

 

完整代码如下:

package org.jeecg.modules.oa.mobile.msg.getui;

import com.alibaba.fastjson.JSONObject;
import com.getui.push.v2.sdk.ApiHelper;

import com.getui.push.v2.sdk.GtApiConfiguration;
import com.getui.push.v2.sdk.api.PushApi;
import com.getui.push.v2.sdk.api.StatisticApi;
import com.getui.push.v2.sdk.common.ApiResult;
import com.getui.push.v2.sdk.dto.CommonEnum;
import com.getui.push.v2.sdk.dto.req.Audience;
import com.getui.push.v2.sdk.dto.req.Settings;
import com.getui.push.v2.sdk.dto.req.Strategy;
import com.getui.push.v2.sdk.dto.req.message.PushBatchDTO;
import com.getui.push.v2.sdk.dto.req.message.PushChannel;
import com.getui.push.v2.sdk.dto.req.message.PushDTO;
import com.getui.push.v2.sdk.dto.req.message.PushMessage;
import com.getui.push.v2.sdk.dto.req.message.android.AndroidDTO;
import com.getui.push.v2.sdk.dto.req.message.android.GTNotification;
import com.getui.push.v2.sdk.dto.req.message.android.ThirdNotification;
import com.getui.push.v2.sdk.dto.req.message.android.Ups;
import com.getui.push.v2.sdk.dto.req.message.ios.Alert;
import com.getui.push.v2.sdk.dto.req.message.ios.Aps;
import com.getui.push.v2.sdk.dto.req.message.ios.IosDTO;
import com.getui.push.v2.sdk.dto.res.statistic.StatisticDTO;
import com.google.common.collect.Sets;
import org.jeecg.common.util.DateUtils;

import java.util.*;

public class AppInfo {
    public PushApi pushApi;
    public StatisticApi statisticApi;
    public static final String CID = "fa0b6ef8c8ee7e30888db8e70641a4ed";




    public static void main(String[] args) {
        new AppInfo().test();//iso+安卓
    }
    public void getApi(){
        GtApiConfiguration apiConfiguration = new GtApiConfiguration();
        //填写应用配置
        apiConfiguration.setAppId("XXXXXX");
        apiConfiguration.setAppKey("XXxxxxx");
        apiConfiguration.setMasterSecret("XXXXXx");
        // 接口调用前缀,请查看文档: 接口调用规范 -> 接口前缀, 可不填写appId
        apiConfiguration.setDomain("https://restapi.getui.com/v2/");
        // 实例化ApiHelper对象,用于创建接口对象
        ApiHelper apiHelper = ApiHelper.build(apiConfiguration);
        // 创建对象,建议复用。目前有PushApi、StatisticApi、UserApi
        pushApi = apiHelper.creatApi(PushApi.class);
        statisticApi=apiHelper.creatApi(StatisticApi.class);
    }

    /*****************************************批量推送结束*****************************************/
    public void test() {
        getApi();
        //根据cid进行单推
        PushDTO<Audience> pushDTO = pushDTO();

        // 设置接收人信息
        Audience audience = new Audience();
        pushDTO.setAudience(audience);
        audience.addCid(CID);
        //  audience.setAll("all");
        System.out.println("test:"+pushDTO.toString());
        // 进行cid单推
        ApiResult<Map<String, Map<String, String>>> apiResult = pushApi.pushToSingleByCid(pushDTO);
        System.out.println(apiResult.toString());
        if (apiResult.isSuccess()) {
            // success
            System.out.println("推送成功"+apiResult.getData());
        } else {
            // failed
            System.out.println("推送失败code:" + apiResult.getCode() + ", msg: " + apiResult.getMsg());
        }
    }
    private PushDTO<Audience> pushDTO() {
        PushDTO<Audience> pushDTO = new PushDTO<Audience>();
        pushDTO.setRequestId(System.currentTimeMillis() + "");
        pushDTO.setGroupName("fl");
        Settings settings = new Settings();
        settings.setTtl(3600000);
        //settings.setTtl(-1);
        Strategy strategy = new Strategy();
        strategy.setSt(1);
        strategy.setDef(4);//默认走厂商通道,否则android应用打开时会导致打开应用失败
        strategy.setIos(4);
        settings.setStrategy(strategy);

        pushDTO.setSettings(settings);
        PushMessage pushMessage = new PushMessage();
        GTNotification notification = new GTNotification();
        notification.setTitle("收到通知");
        notification.setBody("你1有一个待审核工作");
        notification.setClickType(CommonEnum.ClickTypeEnum.TYPE_STARTAPP.type);//打开地址

        notification.setUrl("http://www.baidu.com");
        JSONObject payload =new JSONObject();
        payload.put("openPage","/maildetail/1353550768530235394/receive/m");
        payload.put("id","1355449428499136513");
        notification.setPayload(payload.toJSONString());
        System.out.println("参入参数"+payload.toJSONString());
        pushMessage.setNotification(notification);
        pushDTO.setPushMessage(pushMessage);

        PushChannel pushChannel = new PushChannel();
        AndroidDTO androidDTO = new AndroidDTO();
        Ups ups = new Ups();
        ThirdNotification thirdNotification = new ThirdNotification();
        thirdNotification.setClickType(CommonEnum.ClickTypeEnum.TYPE_STARTAPP.type);
        thirdNotification.setTitle("mailtitle3");
        thirdNotification.setBody("mailcontent!");

        ups.setNotification(thirdNotification);


        //设置options 方式二
        Map<String, Map<String,Object>> options = new HashMap<String, Map<String, Object>>();
        Map<String,Object> all = new HashMap<String, Object>();
       // all.put("channel","default");//添加默认channel导致小米手机无法收到消息
        options.put("ALL",all);
        ups.setOptions(options);
        androidDTO.setUps(ups);
        pushChannel.setAndroid(androidDTO);
        IosDTO iosDTO = new IosDTO();
        Aps aps = new Aps();
        aps.setSound("default");//设置苹果的声音


        Alert alert = new Alert();
        alert.setTitle("消息title-" + System.currentTimeMillis());
        alert.setBody("你有一个待审核工作");
        aps.setAlert(alert);
        iosDTO.setAps(aps);
        //iphone 设置payLoad
        //iosDTO.setPayload("{openPage:/index.html-ios#/modulecontrol,name:zhangsan,id:12342412412}");
        iosDTO.setPayload(payload.toJSONString());
        pushChannel.setIos(iosDTO);
        pushDTO.setPushChannel(pushChannel);
        return pushDTO;
    }
}

以上代码可以在android上正常推送,特别需要注意的是官方示例程序中设置了channel值default,而默认通道也是default,让我误以为必须要设置通道,否则无法推送,设置后反而导致小米手机无法收到厂商推送,去掉 all.put("channel","default");后小米也可以收到推送。

原因:如果不设置channel则走默认通道,如果设置了channel则按照设置的通道发送。我在各厂商只申请了应用信息并没有申请通道,所以初学者一定不要设置channel,熟悉运行机制后可以根据实际需求申请通道。

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值