feiyu02
2022-06-28 5670e4a15fba292ef5f8fb90e96072de976bb621
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
package cn.flightfeather.supervision.push
 
import com.sun.corba.se.impl.protocol.giopmsgheaders.MessageBase.getRequestId
import com.aliyuncs.push.model.v20160801.PushResponse
import com.aliyuncs.utils.ParameterHelper
import com.aliyuncs.push.model.v20160801.PushRequest
import com.aliyuncs.DefaultAcsClient
import com.aliyuncs.profile.DefaultProfile
import com.aliyuncs.profile.IClientProfile
import java.util.*
 
 
/**
 * 移动推送服务
 * @author riku
 * Date: 2019/12/26
 */
class PushService {
 
    private val pushRequest: PushRequest
    private val client: DefaultAcsClient
 
    companion object {
        const val accessKeyId = "LTAI4FvmhG97saKL33tDqUV8"
        const val accessKeySecret = "3PyluVDS97GTGVmm1p3s6vbLkyqZMf"
        const val appKey = 28232249L
    }
 
    init {
        val profile = DefaultProfile.getProfile("cn-hangzhou", accessKeyId, accessKeySecret)
        client = DefaultAcsClient(profile)
        pushRequest = PushRequest()
        pushRequest.appKey = appKey
        pushRequest.pushType = "NOTICE" // 消息类型 MESSAGE NOTICE
        pushRequest.deviceType = "ANDROID" // 设备类型 ANDROID iOS ALL.
        setAndroid()
        // 推送控制
//        val pushDate = Date(System.currentTimeMillis()) // 30秒之间的时间点, 也可以设置成你指定固定时间
//        val pushTime = ParameterHelper.getISO8601Time(pushDate)
//        pushRequest.pushTime = pushTime // 延后推送。可选,如果不设置表示立即推送
        val expireTime = ParameterHelper.getISO8601Time(Date(System.currentTimeMillis() + 12 * 3600 * 1000)) // 12小时后消息失效, 不会再发送
        pushRequest.expireTime = expireTime
        pushRequest.storeOffline = true // 离线消息是否保存,若保存, 在推送时候,用户即使不在线,下一次上线则会收到
    }
 
    fun pushByAccount(accountList: List<String>, all: Boolean = false) {
        // 推送目标
        val accounts = StringBuilder()
        accountList.forEach {
            if (accounts.isNotEmpty()) {
                accounts.append(",")
            }
            accounts.append(it)
        }
        if (all) {
            pushRequest.target = "ALL" //推送目标: DEVICE:按设备推送 ALIAS : 按别名推送 ACCOUNT:按帐号推送  TAG:按标签推送; ALL: 广播推送
            pushRequest.targetValue = "ALL" //根据Target来设定,如Target=DEVICE, 则对应的值为 设备id1,设备id2. 多个值使用逗号分隔.(帐号与设备有一次最多100个的限制)
        } else {
            pushRequest.target = "ACCOUNT" //推送目标: DEVICE:按设备推送 ALIAS : 按别名推送 ACCOUNT:按帐号推送  TAG:按标签推送; ALL: 广播推送
            pushRequest.targetValue = accounts.toString() //根据Target来设定,如Target=DEVICE, 则对应的值为 设备id1,设备id2. 多个值使用逗号分隔.(帐号与设备有一次最多100个的限制)
        }
        //        pushRequest.setTarget("ALL"); //推送目标: DEVICE:推送给设备; ACCOUNT:推送给指定帐号,TAG:推送给自定义标签; ALL: 推送给全部
//        pushRequest.setTargetValue("ALL"); //根据Target来设定,如Target=DEVICE, 则对应的值为 设备id1,设备id2. 多个值使用逗号分隔.(帐号与设备有一次最多100个的限制)
    }
 
    fun push(title: String, body: String) {
        // 推送配置
        pushRequest.title = title // 消息的标题
        pushRequest.body = body // 消息的内容
        val pushResponse = client.getAcsResponse(pushRequest, true, 3)
        System.out.printf("RequestId: %s, MessageID: %s\n",
                pushResponse.requestId, pushResponse.messageId)
    }
 
    private fun setIOS() {
        // 推送配置: iOS
        pushRequest.iosBadge = 5 // iOS应用图标右上角角标
        pushRequest.iosMusic = "default" // iOS通知声音
        pushRequest.iosSubtitle = "iOS10 subtitle"//iOS10通知副标题的内容
        pushRequest.iosNotificationCategory = "iOS10 Notification Category"//指定iOS10通知Category
        pushRequest.iosMutableContent = true//是否允许扩展iOS通知内容
        pushRequest.iosApnsEnv = "DEV"//iOS的通知是通过APNs中心来发送的,需要填写对应的环境信息。"DEV" : 表示开发环境 "PRODUCT" : 表示生产环境
        pushRequest.iosRemind = true // 消息推送时设备不在线(既与移动推送的服务端的长连接通道不通),则这条推送会做为通知,通过苹果的APNs通道送达一次。注意:离线消息转通知仅适用于生产环境
        pushRequest.iosRemindBody = "iOSRemindBody"//iOS消息转通知时使用的iOS通知内容,仅当iOSApnsEnv=PRODUCT && iOSRemind为true时有效
        pushRequest.iosExtParameters = "{\"_ENV_\":\"DEV\",\"k2\":\"v2\"}" //通知的扩展属性(注意 : 该参数要以json map的格式传入,否则会解析出错)
    }
 
    private fun setAndroid() {
        // 推送配置: Android
        pushRequest.androidNotifyType = "BOTH"//通知的提醒方式 "VIBRATE" : 震动 "SOUND" : 声音 "BOTH" : 声音和震动 NONE : 静音
        pushRequest.androidNotificationChannel = "1"
//        pushRequest.androidNotificationBarType = 1//通知栏自定义样式0-100
//        pushRequest.androidNotificationBarPriority = 1//通知栏自定义样式0-100
        pushRequest.androidOpenType = "APPLICATION" //点击通知后动作 "APPLICATION" : 打开应用 "ACTIVITY" : 打开AndroidActivity "URL" : 打开URL "NONE" : 无跳转
//        pushRequest.androidOpenUrl = "http://www.aliyun.com" //Android收到推送后打开对应的url,仅当AndroidOpenType="URL"有效
//        pushRequest.androidActivity = "com.alibaba.push2.demo.XiaoMiPushActivity" // 设定通知打开的activity,仅当AndroidOpenType="Activity"有效
        pushRequest.androidMusic = "default" // Android通知音乐
//        pushRequest.androidPopupActivity = "com.ali.demo.PopupActivity"//设置该参数后启动辅助弹窗功能, 此处指定通知点击后跳转的Activity(辅助弹窗的前提条件:1. 集成第三方辅助通道;2. StoreOffline参数设为true)
//        pushRequest.androidPopupTitle = "Popup Title"
//        pushRequest.androidPopupBody = "Popup Body"
//        pushRequest.androidExtParameters = "{\"k1\":\"android\",\"k2\":\"v2\"}" //设定通知的扩展属性。(注意 : 该参数要以 json map 的格式传入,否则会解析出错)
    }
}