Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
217 changes: 118 additions & 99 deletions param.go
Original file line number Diff line number Diff line change
@@ -1,5 +1,9 @@
package umeng_push

import (
"encoding/json"
)

// 消息发送调用参数
type SendParam struct {
AppKey string `json:"appkey"` // 必填,应用唯一标识
Expand Down Expand Up @@ -39,130 +43,145 @@ type SendParam struct {

Filter string `json:"filter,omitempty"` // 当type=groupcast时,必填,用户筛选条件,如用户标签、渠道等,参考附录G
Payload interface{} `json:"payload"` // 必填,JSON格式,具体消息内容(iOS最大为2012B,Android最大为1840B)
Policy struct {
// 可选,定时发送时间,若不填写表示立即发送
// 定时发送时间不能小于当前时间
// 格式: "yyyy-MM-dd HH:mm:ss"
// 注意,start_time只对任务生效
StartTime string `json:"start_time,omitempty"`

// 可选,消息过期时间,其值不可小于发送时间或者
// start_time(如果填写了的话),
// 如果不填写此参数,默认为3天后过期,格式同start_time
ExpireTime string `json:"expire_time,omitempty"`

// 可选,发送限速,每秒发送的最大条数,最小值1000
// 开发者发送的消息如果有请求自己服务器的资源,可以考虑此参数
MaxSendNum int64 `json:"max_send_num,omitempty"`

// 可选,开发者对消息的唯一标识,服务器会根据这个标识避免重复发送
// 有些情况下(例如网络异常)开发者可能会重复调用API导致
// 消息多次下发到客户端,如果需要处理这种情况,可以考虑此参数
// 注意,out_biz_no只对任务生效
OutBizNo string `json:"out_biz_no,omitempty"`

// 可选,多条带有相同apns_collapse_id的消息,iOS设备仅展示
// 最新的一条,字段长度不得超过64bytes
ApnsCollapseId string `json:"apns_collapse_id,omitempty"`
} `json:"policy,omitempty"` // 可选,发送策略
Policy Policy `json:"policy,omitempty"` // 可选,发送策略

// 可选,正式/测试模式,默认为true
// 测试模式只对“广播”、“组播”类消息生效,其他类型的消息任务(如“文件播”)不会走测试模式
// 测试模式只会将消息发给测试设备,测试设备需要到web上添加
ProductionMode string `json:"production_mode,omitempty"`
ProductionMode bool `json:"production_mode,string"`
Description string `json:"description,omitempty"` // 可选,发送消息描述,建议填写

Mipush string `json:"mipush,omitempty"` // 可选,默认为false,当为true时,表示MIUI、EMUI、Flyme系统设备离线转为系统下发
MiActivity string `json:"mi_activity,omitempty"` // 可选,mipush值为true时生效,表示走系统通道时打开指定页面acitivity的完整包路径
Mipush bool `json:"mipush,omitempty,string"` // 可选,默认为false,当为true时,表示MIUI、EMUI、Flyme系统设备离线转为系统下发
MiActivity string `json:"mi_activity,omitempty"` // 可选,mipush值为true时生效,表示走系统通道时打开指定页面acitivity的完整包路径

ReceiptUrl string `json:"receipt_url,omitempty"` // 开发者接受数据的地址,最大长度256字节
ReceiptType string `json:"receipt_type,omitempty"` // 回执数据类型,1:送达回执;2:点击回执;3:送达和点击回执,默认为3
}

type Policy struct {
// 可选,定时发送时间,若不填写表示立即发送
// 定时发送时间不能小于当前时间
// 格式: "yyyy-MM-dd HH:mm:ss"
// 注意,start_time只对任务生效
StartTime string `json:"start_time,omitempty"`

// 可选,消息过期时间,其值不可小于发送时间或者
// start_time(如果填写了的话),
// 如果不填写此参数,默认为3天后过期,格式同start_time
ExpireTime string `json:"expire_time,omitempty"`

// 可选,发送限速,每秒发送的最大条数,最小值1000
// 开发者发送的消息如果有请求自己服务器的资源,可以考虑此参数
MaxSendNum int64 `json:"max_send_num,omitempty"`

// 可选,开发者对消息的唯一标识,服务器会根据这个标识避免重复发送
// 有些情况下(例如网络异常)开发者可能会重复调用API导致
// 消息多次下发到客户端,如果需要处理这种情况,可以考虑此参数
// 注意,out_biz_no只对任务生效
OutBizNo string `json:"out_biz_no,omitempty"`

// 可选,多条带有相同apns_collapse_id的消息,iOS设备仅展示
// 最新的一条,字段长度不得超过64bytes
ApnsCollapseId string `json:"apns_collapse_id,omitempty"`
}

type AndroidPayload struct {
DisplayType string `json:"display_type"` // 必填,消息类型: notification(通知)、message(消息)

// 必填,消息体
// 当display_type=message时,body的内容只需填写custom字段
// 当display_type=notification时,body包含如下参数:
Body struct {
Ticker string `json:"ticker"` // 必填,通知栏提示文字
Title string `json:"title"` // 必填,通知标题
Text string `json:"text"` // 必填,通知文字描述

// 可选,状态栏图标ID,R.drawable.[smallIcon],
// 如果没有,默认使用应用图标
// 图片要求为24*24dp的图标,或24*24px放在drawable-mdpi下
// 注意四周各留1个dp的空白像素
Icon string `json:"icon,omitempty"`

// 可选,通知栏拉开后左侧图标ID,R.drawable.[largeIcon],
// 图片要求为64*64dp的图标,
// 可设计一张64*64px放在drawable-mdpi下,
// 注意图片四周留空,不至于显示太拥挤
LargeIcon string `json:"largeIcon,omitempty"`

// 可选,通知栏大图标的URL链接,该字段的优先级大于largeIcon
// 该字段要求以http或者https开头
Img string `json:"img,omitempty"`

// 可选,通知声音,R.raw.[sound]
// 如果该字段为空,采用SDK默认的声音,即res/raw/下的
// umeng_push_notification_default_sound声音文件,如果
// SDK默认声音文件不存在,则使用系统默认Notification提示音
Sound string `json:"sound,omitempty"`

BuilderId string `json:"builder_id,omitempty"` // 可选,默认为0,用于标识该通知采用的样式,使用该参数时,开发者必须在SDK里面实现自定义通知栏样式
PlayVibrate string `json:"play_vibrate,omitempty"` // 可选,收到通知是否震动,默认为"true"
PlayLights string `json:"play_lights,omitempty"` // 可选,收到通知是否闪灯,默认为"true"
PlaySound string `json:"play_sound,omitempty"` // 可选,收到通知是否发出声音,默认为"true"

// 点击"通知"的后续行为,默认为打开app
// 可选,默认为"go_app",值可以为:
// "go_app": 打开应用
// "go_url": 跳转到URL
// "go_activity": 打开特定的activity
// "go_custom": 用户自定义内容
AfterOpen string `json:"after_open,omitempty"`

// 当after_open=go_url时,必填
// 通知栏点击后跳转的URL,要求以http或者https开头
Url string `json:"url,omitempty"`

// 当after_open=go_activity时,必填
// 通知栏点击后打开的Activity
Activity string `json:"activity,omitempty"`

// 当display_type=message时, 必填
// 当display_type=notification且
// after_open=go_custom时,必填
Custom interface{} `json:"custom,omitempty"`
} `json:"body"`
Body AndroidPayloadBody `json:"body"`

// 可选,JSON格式,用户自定义key-value,只对"通知"
// (display_type=notification)生效
// 可以配合通知到达后,打开App/URL/Activity使用
Extra interface{} `json:"extra,omitempty"`
}

type AndroidPayloadBody struct {
Ticker string `json:"ticker"` // 必填,通知栏提示文字
Title string `json:"title"` // 必填,通知标题
Text string `json:"text"` // 必填,通知文字描述

// 可选,状态栏图标ID,R.drawable.[smallIcon],
// 如果没有,默认使用应用图标
// 图片要求为24*24dp的图标,或24*24px放在drawable-mdpi下
// 注意四周各留1个dp的空白像素
Icon string `json:"icon,omitempty"`

// 可选,通知栏拉开后左侧图标ID,R.drawable.[largeIcon],
// 图片要求为64*64dp的图标,
// 可设计一张64*64px放在drawable-mdpi下,
// 注意图片四周留空,不至于显示太拥挤
LargeIcon string `json:"largeIcon,omitempty"`

// 可选,通知栏大图标的URL链接,该字段的优先级大于largeIcon
// 该字段要求以http或者https开头
Img string `json:"img,omitempty"`

// 可选,通知声音,R.raw.[sound]
// 如果该字段为空,采用SDK默认的声音,即res/raw/下的
// umeng_push_notification_default_sound声音文件,如果
// SDK默认声音文件不存在,则使用系统默认Notification提示音
Sound string `json:"sound,omitempty"`

BuilderId string `json:"builder_id,omitempty"` // 可选,默认为0,用于标识该通知采用的样式,使用该参数时,开发者必须在SDK里面实现自定义通知栏样式
PlayVibrate string `json:"play_vibrate,omitempty"` // 可选,收到通知是否震动,默认为"true"
PlayLights string `json:"play_lights,omitempty"` // 可选,收到通知是否闪灯,默认为"true"
PlaySound string `json:"play_sound,omitempty"` // 可选,收到通知是否发出声音,默认为"true"

// 点击"通知"的后续行为,默认为打开app
// 可选,默认为"go_app",值可以为:
// "go_app": 打开应用
// "go_url": 跳转到URL
// "go_activity": 打开特定的activity
// "go_custom": 用户自定义内容
AfterOpen string `json:"after_open,omitempty"`

// 当after_open=go_url时,必填
// 通知栏点击后跳转的URL,要求以http或者https开头
Url string `json:"url,omitempty"`

// 当after_open=go_activity时,必填
// 通知栏点击后打开的Activity
Activity string `json:"activity,omitempty"`

// 当display_type=message时, 必填
// 当display_type=notification且
// after_open=go_custom时,必填
Custom interface{} `json:"custom,omitempty"`
}

type IosPayload struct {
Aps struct {
// 当content-available=1时(静默推送),可选; 否则必填
// 可为JSON类型和字符串类型
Alert struct {
Title string `json:"title,omitempty"`
Subtitle string `json:"subtitle,omitempty"`
Body string `json:"body,omitempty"`
} `json:"alert,omitempty"`
Badge int64 `json:"badge,omitempty"`
Sound string `json:"sound,omitempty"`
ContentAvailable int64 `json:"content-available,omitempty"` // 可选,代表静默推送
Category string `json:"category,omitempty"` // 可选,注意: ios8才支持该字段
} `json:"aps"` // 必填,严格按照APNs定义来填写

// "key1":"value1", // 可选,用户自定义内容, "d","p"为友盟保留字段, key不可以是"d","p"
// "key2":"value2",
// ...
Aps IosPayloadAps // 必填,严格按照APNs定义来填写

Extra map[string]interface{} //可选,用户自定义内容, "d","p"为友盟保留字段, key不可以是"d","p"
}

// 兼容友盟憨憨接口
func (payload IosPayload) MarshalJSON() ([]byte, error) {
if payload.Extra == nil {
payload.Extra = make(map[string]interface{})
}
payload.Extra["aps"] = payload.Aps
return json.Marshal(payload.Extra)
}

type IosPayloadAps struct {
// 当content-available=1时(静默推送),可选; 否则必填
// 可为JSON类型和字符串类型
Alert IosPayloadApsAlert `json:"alert,omitempty"`
Badge int64 `json:"badge,omitempty"`
Sound string `json:"sound,omitempty"`
ContentAvailable int64 `json:"content-available,omitempty"` // 可选,代表静默推送
Category string `json:"category,omitempty"` // 可选,注意: ios8才支持该字段
}

type IosPayloadApsAlert struct {
Title string `json:"title,omitempty"`
Subtitle string `json:"subtitle,omitempty"`
Body string `json:"body,omitempty"`
}

// 状态查询调用参数
Expand Down
52 changes: 17 additions & 35 deletions umeng_push_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -27,44 +27,26 @@ func TestMain(m *testing.M) {

func TestNewUmengPush(t *testing.T) {
payload := &IosPayload{
Aps: struct {
Alert struct {
Title string `json:"title,omitempty"`
Subtitle string `json:"subtitle,omitempty"`
Body string `json:"body,omitempty"`
} `json:"alert,omitempty"`
Badge int64 `json:"badge,omitempty"`
Sound string `json:"sound,omitempty"`
ContentAvailable int64 `json:"content-available,omitempty"`
Category string `json:"category,omitempty"`
}{Alert: struct {
Title string `json:"title,omitempty"`
Subtitle string `json:"subtitle,omitempty"`
Body string `json:"body,omitempty"`
}{
Title: "标题",
Subtitle: "子标题",
Body: "内容",
}},
Aps: IosPayloadAps{
Alert: IosPayloadApsAlert{
Title: "标题",
Subtitle: "子标题",
Body: "内容",
},
},
}
param := &SendParam{
Types: TypeUnicast,
DeviceTokens: config.DeviceTokens,
AliasType: "",
Alias: "",
FileId: "",
Filter: "",
Payload: payload,
Policy: struct {
StartTime string `json:"start_time,omitempty"`
ExpireTime string `json:"expire_time,omitempty"`
MaxSendNum int64 `json:"max_send_num,omitempty"`
OutBizNo string `json:"out_biz_no,omitempty"`
ApnsCollapseId string `json:"apns_collapse_id,omitempty"`
}{},
ProductionMode: "true",
Types: TypeUnicast,
DeviceTokens: config.DeviceTokens,
AliasType: "",
Alias: "",
FileId: "",
Filter: "",
Payload: payload,
Policy: Policy{},
ProductionMode: true,
Description: "测试推送",
Mipush: "",
Mipush: true,
MiActivity: "",
}

Expand Down