最近工作中用到给手机端(安卓和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 )
后续会把代码打包上传至资源。