阿里云EAMS消息推送Java异步接入,给Android和IOS推送消息

      最近工作中用到给手机端(安卓和ios)推送消息,选型用阿里云的EMAS服务,下面记录详细接入过程。

1、首先注册阿里云企业用户,开通EMAS服务,新建Android和ios项目,并下载配置。

阿里云官方 阿里云登录 - 欢迎登录阿里云,安全稳定的云计算服务平台

 新建ios项目,并导出AliyunEmasServices-Info.plist文件,按照官网在原生ios工程里配置

AliyunEmasServices-Info.plist

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
	<key>config</key>
	<dict>
            <key>emas.appKey</key>
            <string>33382xxxx</string>
            <key>emas.appSecret</key>
            <string>1db37f390d684df68d947b131378xxxx</string>
            <key>emas.bundleId</key>
            <string>xxxx.com.ios.lk</string>
            <key>hotfix.idSecret</key>
            <string>33382xxxx-2</string>
            <key>hotfix.rsaSecret</key>
            <string>MIIEvAIBADANBgkqhkiG9w0BAQEFAASCBKYwggSiAgEAAoIBAQCOTgqw5BpTv0NCS6c3acyMGDl9rAkN0WeRCc2/7GvpMH7+bD20Nh8+Ccc2H3hbFRucPTg279QQcHh502wLy13PDQQn0OK1CU22eS3t0qBULlAhPcYqPmTA5QrrH24Wa41VQlCziqp0t9yIjOJzz99nT9Nh7bGc8HfCu3ELzYsKA8zSgvWf8tmezGxrfOHKiFLlmECZRh5g/JMUVEk5xJBM/AUTzJ+Agtr0SlsRLtCjW8ms5mQ6CD2EHE9tP2tRbm6eExaDk3MnM80jRjsWdipDslQmXyfzh10JOb+sYhTIC0HFU8OpEH1f8C748duxMRyA1GwFbiwQgh1JumxnAYY5AgMBAAECggEAQajyt+HX3/JtN0au9huD/NQkmr7pQo3vinWKkNamh+cPgZcx9VfPnJFocKmen/AiWDnLGVYZdChg/l02Ck8gjquD0ldIc53CVMKfFY/M2GqyIFRffhhh5rsICarr4b5obQF3ORBvTAGV6Q+QYT116DZl41aIUFCIAbr5EygY0lpymL7huqLzbrQhsMd/kx83KyQYxXOTF2VnKu4J/kHyKbVYopL7j0wkcExtj5F0JeOXXxFtMoEmxWfjGsfh5bSqUFxSpyQehSJJH7u+oFkO4K8h/Pck6UmD+2gHa4vNexSg3xEQAwgYrbTw+vHtKkk0vyyxS5pMbAIdxiAadf+lAQKBgQDcCoH+QdLITq7TYNqBqsafmrMT9vhBQTJqaaaZUqpBuV/ixmFL9QY3z0oIXOgrBC+HI0QF8SU6GItwUebV5QxZeg7BBCYACfaJHAT58zNmfAwZ6gvsaj7zovIYSXKGBk95060gm6KySeGVd3/F5Q+UllPO5IWDAhPFH7RoQoj2GQKBgQClj2np9AzmeFLlTZKMu+lnJbggy0awRaub8aNGVKKLgAP5Qq3ken+Twh7trkgwrfcKh7srzZ7X/Ea257ZynXjY4Vnj34aYogUb/Ano7k0GBOiNUazLU2KpgypYrsV04KZnsqX51eId+AggOWstEX0mA2WYXBjoQpW2bgXGMC/VIQKBgFPQQNGbOvGHXvou4ywO45c5ssqBAPDCJ7T2xzmRjj54oLhdfgQTsamicH2c/eYcswnTef6VauulG7/NwpJoq3qNjn8g2GSdZuW04YRfiY2Y5Hceeio0EgR1ZaewmknIr48k/MX14lPs5lsraGT1qiib1hJxYxWSvfsQ54PrDAZJAoGARZolTNXtFnc/YmdaVRAq79JLtn2/GhwwKT9NBSRPsZYAFaqSsJtPRy81EXdToiOA2Ex3w9KOFP9aO0ruyQCq7YLP55zxWPnEbB9piyOj/gPSQJc1rcVAlUMvalkPajOHwdC5Nm9UwISl5eY9yJSxqGmFLKiLUBmuFyPqCYf4lAECgYAz3C7itQeRGnnrNFMOjXKH28qaMMQntXHqsKDuvujbc+LSYOcJFEKeLxdhDuHYUjkikoC6DkZT3kEjh22bUsJLN8KyrGQCgXZotCLLVs9IBceWPPli5twVP9dlyr/R/rJT6nZYI9FIp8/vjgAaLv4WqLqDvlLX3Fnf+cqGCKeiBA==</string>
            <key>httpdns.accountId</key>
            <string>152089</string>
            <key>httpdns.secretKey</key>
            <string>c0f53a5d3c6782c925a52cea3e9fxxxx</string>
            <key>appmonitor.tlog.rsaSecret</key>
            <string>MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQC5n0IxvHpqHsPQ/zWQ2AiYXo4Wq52CzY69x5nt3xDnfcRWlOqJfYjin9iDvHdFcF8lU8plGS2x43Zm+sbqikAMsXPCw3mcIqEgsTrXswIP2FH+owP3Fm8n/VKERa1kHW8+3Y1GCElwjrZXMWtARIhmp43xvYjp+1kjMu/6m81LfQIDAQAB</string>
            <key>appmonitor.rsaSecret</key>
            <string>MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQC5n0IxvHpqHsPQ/zWQ2AiYXo4Wq52CzY69x5nt3xDnfcRWlOqJfYjin9iDvHdFcF8lU8plGS2x43Zm+sbqikAMsXPCw3mcIqEgsTrXswIP2FH+owP3Fm8n/VKERa1kHW8+3Y1GCElwjrZXMWtARIhmp43xvYjp+1kjMu/6m81LfQIDAQAB</string>
    	</dict>
	<key>services</key>
	<dict>
          	<key>hotfix_service</key>
       	<dict>
			<key>status</key>
			<integer>1</integer>
			<key>version</key>
			<string>1.0.0-1</string>
		</dict>
         	<key>feedback_service</key>
       	<dict>
			<key>status</key>
			<integer>1</integer>
			<key>version</key>
			<string>3.3.11</string>
		</dict>
         	<key>tlog_service</key>
       	<dict>
			<key>status</key>
			<integer>1</integer>
			<key>version</key>
			<string>1.0.1.1</string>
		</dict>
         	<key>httpdns_service</key>
       	<dict>
			<key>status</key>
			<integer>1</integer>
			<key>version</key>
			<string>2.0.10</string>
		</dict>
         	<key>apm_service</key>
       	<dict>
			<key>status</key>
			<integer>1</integer>
			<key>version</key>
			<string>1.1.1</string>
		</dict>
         	<key>crashreporter_service</key>
       	<dict>
			<key>status</key>
			<integer>1</integer>
			<key>version</key>
			<string>1.2.0</string>
		</dict>
         	<key>man_service</key>
       	<dict>
			<key>status</key>
			<integer>0</integer>
			<key>version</key>
			<string>1.0.13</string>
		</dict>
         	<key>cps_service</key>
       	<dict>
			<key>status</key>
			<integer>1</integer>
			<key>version</key>
			<string>1.9.9.7</string>
		</dict>
    	</dict>
</dict>
</plist>

 在后端java工程里编写核心调用sdk的逻辑代码,

package push.handler;

import com.alibaba.fastjson.JSONObject;
import com.aliyuncs.DefaultAcsClient;
import com.aliyuncs.IAcsClient;
import com.aliyuncs.exceptions.ClientException;
import com.aliyuncs.exceptions.ServerException;
import com.aliyuncs.profile.DefaultProfile;
import com.aliyuncs.push.model.v20160801.PushRequest;
import com.aliyuncs.push.model.v20160801.PushResponse;
import com.aliyuncs.utils.ParameterHelper;
import push.config.AndroidConfig;
import push.config.IOSConfig;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

import java.util.Date;

/**
 * AliPush
 *
 * @author tiger
 * @version 1.0
 * @date 2023/04/23 15:29
 */
@Component
public class AliPush {

    @Autowired
    private IOSConfig iosConfig;

    @Autowired
    private AndroidConfig androidConfig;

    /**
     * 阿里云的ios推送
     *
     * @param message       推送对象
     * @param receiveUserId 接收人员id
     */
    public void pushIOSMessage(MessageSendDTO message, Long receiveUserId) {
        DefaultProfile profile = DefaultProfile.getProfile(iosConfig.getRegionId(), iosConfig.getAccessKeyId(), iosConfig.getSecret());
        IAcsClient client = new DefaultAcsClient(profile);
        PushRequest pushRequest = new PushRequest();
        // 推送目标
        pushRequest.setAppKey(iosConfig.getIosAppKey());
        pushRequest.setTarget(iosConfig.getTargetName());
        pushRequest.setTargetValue(receiveUserId.toString());
        pushRequest.setDeviceType("iOS");
        // 推送配置
        pushRequest.setPushType(iosConfig.getPushType());
        pushRequest.setTitle(message.getTitle());
        Object contentObj = message.getContent();
        try {
            JSONObject content = JSONObject.parseObject(JSONObject.toJSONString(contentObj));
            pushRequest.setBody(content.getString("message"));
        } catch (Exception e) {
            pushRequest.setBody("推送失败");
        }
        pushRequest.setIOSBadgeAutoIncrement(true);
        pushRequest.setIOSMusic(iosConfig.getMusic());
        pushRequest.setIOSApnsEnv(iosConfig.getApnsEnv());
        pushRequest.setIOSExtParameters(JSONObject.toJSONString(message));
        final String expireTime = ParameterHelper.getISO8601Time(new Date(System.currentTimeMillis() + 12 * 3600 * 1000));
        pushRequest.setExpireTime(expireTime);
        push(pushRequest, client);
    }

    /**
     * 安卓的阿里云推送
     *
     * @param message       推送信息对象
     * @param receiveUserId 接收人员id
     */
    public void pushAndroidMessage(MessageSendDTO message, Long receiveUserId) {
        DefaultProfile profile = DefaultProfile.getProfile(androidConfig.getRegionId(), androidConfig.getAccessKeyId(), androidConfig.getSecret());
        IAcsClient client = new DefaultAcsClient(profile);
        PushRequest pushRequest = new PushRequest();
        // 推送目标
        pushRequest.setAppKey(androidConfig.getAndroidAppKey());
        pushRequest.setTarget(iosConfig.getTargetName());
        pushRequest.setTargetValue(receiveUserId.toString());
        pushRequest.setDeviceType("ANDROID");
        // 推送配置
        pushRequest.setPushType(androidConfig.getPushType());
        pushRequest.setTitle(message.getTitle());
        Object contentObj = message.getContent();
        if (contentObj instanceof JSONObject) {
            JSONObject content = JSONObject.parseObject(JSONObject.toJSONString(contentObj));
            pushRequest.setBody(content.getString("message"));
        } else {
            pushRequest.setBody(DateUtils.format(new Date(), DateUtils.DATE_TIME_PATTERN));
        }
        // 推送配置: Android
        pushRequest.setAndroidOpenType("ACTIVITY"); // 点击通知后动作 'APPLICATION': 打开应用 'ACTIVITY': 打开应用AndroidActivity 'URL': 打开URL 'NONE': 无跳转
        pushRequest.setAndroidNotifyType("SOUND"); // 通知的提醒方式 ‘VIBRATE': 振动  'SOUND': 声音 'DEFAULT': 声音和振动 'NONE': 不做处理,用户自定义
        pushRequest.setAndroidMusic(androidConfig.getMusic()); // Android通知声音
        pushRequest.setAndroidPopupActivity("com.ynxx.zbhr.mainfragment.PopupPushActivity"); //设置该参数后启动辅助弹窗功能, 此处指定通知点击后跳转的Activity(辅助弹窗的前提条件:1. 集成第三方辅助通道;2. StoreOffline参数设为true)
        pushRequest.setAndroidPopupTitle(message.getTitle());
        pushRequest.setAndroidNotificationHuaweiChannel("1");
        pushRequest.setAndroidNotificationXiaomiChannel("1");
        pushRequest.setAndroidNotificationChannel("1");

        if (contentObj instanceof JSONObject) {
            JSONObject content = JSONObject.parseObject(JSONObject.toJSONString(contentObj));
            pushRequest.setAndroidPopupBody(content.getString("message"));
        } else {
            pushRequest.setAndroidPopupBody(DateUtils.format(new Date(), DateUtils.DATE_TIME_PATTERN));
        }
        pushRequest.setAndroidNotificationBarType(50);
        pushRequest.setAndroidNotificationBarPriority(2);
        pushRequest.setAndroidExtParameters(JSONObject.toJSONString(message));
        pushRequest.setStoreOffline(true);
        final String expireTime = ParameterHelper.getISO8601Time(new Date(System.currentTimeMillis() + 72 * 3600 * 1000));
        pushRequest.setExpireTime(expireTime);
        push(pushRequest, client);
    }

    private void push(PushRequest pushRequest, IAcsClient client) {
        try {
            PushResponse pushResponse = client.getAcsResponse(pushRequest);
            System.out.printf("RequestId: %s, MessageId: %s\n",
                    pushResponse.getRequestId(), pushResponse.getMessageId());
        } catch (ServerException e) {
            e.printStackTrace();
        } catch (ClientException e) {
            System.out.println("ErrCode:" + e.getErrCode());
            System.out.println("ErrMsg:" + e.getErrMsg());
            System.out.println("RequestId:" + e.getRequestId());
        }
    }

}

启动服务,用poatman调用,

如图,手机端收到推送的消息了,(这里用的按Target推送目标为ACCOUNT,TargetValue用用户登录app后的userid ) 

后续会把代码打包上传至资源。

猜你喜欢

转载自blog.csdn.net/gaowenhui2008/article/details/130505813