美文网首页对接第三方
集成极光推送-服务端

集成极光推送-服务端

作者: 垃圾简书_吃枣药丸 | 来源:发表于2020-03-12 17:06 被阅读0次
  1. 客户端集成(略)
    将生成一个 Registration ID,形如 171976fa8ae931b4e93

  2. 服务端集成:

  • 依赖
"cn.jpush.api:jpush-client:3.4.3"
  • 推送代码

package com.wise.service.configuration;

import cn.hutool.core.util.RandomUtil;
import cn.jiguang.common.resp.APIConnectionException;
import cn.jiguang.common.resp.APIRequestException;
import cn.jpush.api.JPushClient;
import cn.jpush.api.push.PushResult;
import cn.jpush.api.push.model.Message;
import cn.jpush.api.push.model.Options;
import cn.jpush.api.push.model.Platform;
import cn.jpush.api.push.model.PushPayload;
import cn.jpush.api.push.model.audience.Audience;
import cn.jpush.api.push.model.notification.AndroidNotification;
import cn.jpush.api.push.model.notification.IosAlert;
import cn.jpush.api.push.model.notification.IosNotification;
import cn.jpush.api.push.model.notification.Notification;
import com.alibaba.fastjson.JSON;
import com.wise.framework.exception.Excep;
import com.wise.model.proxy.ProxyErrMsgs;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.collections4.CollectionUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.env.Environment;

import javax.annotation.PostConstruct;
import java.util.Collection;

/**
 * @author futao
 * @date 2019/12/20.
 */
@Slf4j
@Configuration
public class JpushClientConfiguration {

    @Autowired
    private Environment environment;
   
    private static Environment environmentHolder;

    /**
     * @PostConstruct 注解的方法将会在依赖注入完成后被自动调用。
     */
    @PostConstruct
    public void injectEnvironment() {
        JpushClientConfiguration.environmentHolder = environment;
    }

    /**
     * 推送消息给指定的用户
     *
     * @param jPushClient         客户端配置
     * @param registrationIds     要推送的目的用户
     * @param message             提示消息
     * @param title               标题
     * @param noVisualableMessage 透传消息
     */
    public static void push(JPushClient jPushClient, Collection<String> registrationIds, String title, String message, Object noVisualableMessage) {
        String messageUUID = RandomUtil.simpleUUID();
        PushPayload.Builder builder = PushPayload.newBuilder()
                //接收设备类型
                .setPlatform(Platform.all())
                //消息ID--用于防止 api 调用端重试造成服务端的重复推送而定义的一个标识符。
//                .setCid("03b6bf760c86f9fe77c0caef-")
                //此部分内容不会展示到通知栏上--透传给 App
                .setMessage(Message.newBuilder().setMsgContent(noVisualableMessage != null ? JSON.toJSONString(noVisualableMessage) : "{}").build())
                //title是标题,alert是内容
                .setNotification(Notification.newBuilder()
//                        .setAlert(message)
                        .addPlatformNotification(
                                IosNotification
                                        .newBuilder()
                                        //子标题展示不出来
                                        .setAlert(IosAlert.newBuilder().setTitleAndBody(title, null, message).build())
                                        //IOS角标
//                                        .incrBadge(1)
                                        //推送唤醒
                                        .setContentAvailable(true)
                                        //通知声音
                                        .setSound("default")
                                        .build()
                        )
                        .addPlatformNotification(
                                AndroidNotification
                                        .newBuilder()
                                        .setTitle(title)
                                        .setAlert(message)
                                        //消息,振动,呼吸灯类型           doc:  https://community.jiguang.cn/question/150550
                                        .setAlertType(7)
                                        .build()
                        )
                        .build())
                .setOptions(Options.newBuilder().setApnsProduction(environmentHolder.acceptsProfiles("pro")).build());
        if (CollectionUtils.isNotEmpty(registrationIds)) {
            //接收对象
            builder.setAudience(Audience.registrationId(registrationIds));
        } else {
            builder.setAudience(Audience.all());
        }
        PushPayload payload = builder
                .build();
        try {
            log.info("【{}】before极光消息推送-body:{}", messageUUID, JSON.toJSONString(payload));
            PushResult pushResult = jPushClient.sendPush(payload);
            log.info("【{}】极光消息推送成功结果:{}", messageUUID, JSON.toJSONString(pushResult));
        } catch (APIConnectionException | APIRequestException e) {
            log.error("【{}】消息推送失败", messageUUID, e);
            throw Excep.le(ProxyErrMsgs.ERR_100300100009);
        }
    }
}

  • 注意点:
    IOS区分开发环境与生产环境,需要设置.setOptions(Options.newBuilder().setApnsProduction(environmentHolder.acceptsProfiles("pro")).build());。且IOS打包的时候需要选择是开发环境还是正式环境,否则消息推送不到。Android不区分环境。
  • 环境问题:可以将IOS获取到的 Registration ID到管理后台查看注册到了什么环境,从而得知IOS的打包环境是否错误。
    image.png
image.png image.png

当选择了开发环境,且预估人数为1,说明该IOS设备注册到了极光的开发环境。


image.png
  • 当选择了正式环境,再查询该Registration ID。发现预估人数为0,是正常的,因为这台设备注册在了开发环境。

相关文章

网友评论

    本文标题:集成极光推送-服务端

    本文链接:https://www.haomeiwen.com/subject/gblmjhtx.html