forked from sideshow/apns2
-
Notifications
You must be signed in to change notification settings - Fork 0
/
notification.go
162 lines (139 loc) · 7.19 KB
/
notification.go
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
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
package apns2
import (
"encoding/json"
"time"
)
// EPushType defines the value for the apns-push-type header
type EPushType string
const (
// PushTypeAlert is used for notifications that trigger a user interaction —
// for example, an alert, badge, or sound. If you set this push type, the
// topic field must use your app’s bundle ID as the topic. If the
// notification requires immediate action from the user, set notification
// priority to 10; otherwise use 5. The alert push type is required on
// watchOS 6 and later. It is recommended on macOS, iOS, tvOS, and iPadOS.
PushTypeAlert EPushType = "alert"
// PushTypeBackground is used for notifications that deliver content in the
// background, and don’t trigger any user interactions. If you set this push
// type, the topic field must use your app’s bundle ID as the topic. Always
// use priority 5. Using priority 10 is an error. The background push type
// is required on watchOS 6 and later. It is recommended on macOS, iOS,
// tvOS, and iPadOS.
PushTypeBackground EPushType = "background"
// PushTypeLocation is used for notifications that request a user’s
// location. If you set this push type, the topic field must use your app’s
// bundle ID with .location-query appended to the end. The location push
// type is recommended for iOS and iPadOS. It isn’t available on macOS,
// tvOS, and watchOS. If the location query requires an immediate response
// from the Location Push Service Extension, set notification apns-priority
// to 10; otherwise, use 5. The location push type supports only token-based
// authentication.
PushTypeLocation EPushType = "location"
// PushTypeVOIP is used for notifications that provide information about an
// incoming Voice-over-IP (VoIP) call. If you set this push type, the topic
// field must use your app’s bundle ID with .voip appended to the end. If
// you’re using certificate-based authentication, you must also register the
// certificate for VoIP services. The voip push type is not available on
// watchOS. It is recommended on macOS, iOS, tvOS, and iPadOS.
PushTypeVOIP EPushType = "voip"
// PushTypeComplication is used for notifications that contain update
// information for a watchOS app’s complications. If you set this push type,
// the topic field must use your app’s bundle ID with .complication appended
// to the end. If you’re using certificate-based authentication, you must
// also register the certificate for WatchKit services. The complication
// push type is recommended for watchOS and iOS. It is not available on
// macOS, tvOS, and iPadOS.
PushTypeComplication EPushType = "complication"
// PushTypeFileProvider is used to signal changes to a File Provider
// extension. If you set this push type, the topic field must use your app’s
// bundle ID with .pushkit.fileprovider appended to the end. The
// fileprovider push type is not available on watchOS. It is recommended on
// macOS, iOS, tvOS, and iPadOS.
PushTypeFileProvider EPushType = "fileprovider"
// PushTypeMDM is used for notifications that tell managed devices to
// contact the MDM server. If you set this push type, you must use the topic
// from the UID attribute in the subject of your MDM push certificate.
PushTypeMDM EPushType = "mdm"
// PushTypeLiveActivity is used for Live Activities that display various
// real-time information. If you set this push type, the topic field must
// use your app’s bundle ID with `push-type.liveactivity` appended to the end.
// The live activity push supports only token-based authentication. This
// push type is recommended for iOS. It is not available on macOS, tvOS,
// watchOS and iPadOS.
PushTypeLiveActivity EPushType = "liveactivity"
// PushTypePushToTalk is used for notifications that provide information about the
// push to talk. If you set this push type, the apns-topic header field
// must use your app’s bundle ID with.voip-ptt appended to the end.
// The pushtotalk push type isn’t available on watchOS, macOS, and tvOS. It’s recommended on iOS and iPadOS.
PushTypePushToTalk EPushType = "pushtotalk"
)
const (
// PriorityLow will tell APNs to send the push message at a time that takes
// into account power considerations for the device. Notifications with this
// priority might be grouped and delivered in bursts. They are throttled,
// and in some cases are not delivered.
PriorityLow = 5
// PriorityHigh will tell APNs to send the push message immediately.
// Notifications with this priority must trigger an alert, sound, or badge
// on the target device. It is an error to use this priority for a push
// notification that contains only the content-available key.
PriorityHigh = 10
)
// Notification represents the the data and metadata for a APNs Remote Notification.
type Notification struct {
// An optional canonical UUID that identifies the notification. The
// canonical form is 32 lowercase hexadecimal digits, displayed in five
// groups separated by hyphens in the form 8-4-4-4-12. An example UUID is as
// follows:
//
// 123e4567-e89b-12d3-a456-42665544000
//
// If you don't set this, a new UUID is created by APNs and returned in the
// response.
ApnsID string
// A string which allows multiple notifications with the same collapse
// identifier to be displayed to the user as a single notification. The
// value should not exceed 64 bytes.
CollapseID string
// A string containing hexadecimal bytes of the device token for the target
// device.
DeviceToken string
// The topic of the remote notification, which is typically the bundle ID
// for your app. The certificate you create in the Apple Developer Member
// Center must include the capability for this topic. If your certificate
// includes multiple topics, you must specify a value for this header. If
// you omit this header and your APNs certificate does not specify multiple
// topics, the APNs server uses the certificate’s Subject as the default
// topic.
Topic string
// An optional time at which the notification is no longer valid and can be
// discarded by APNs. If this value is in the past, APNs treats the
// notification as if it expires immediately and does not store the
// notification or attempt to redeliver it. If this value is left as the
// default (ie, Expiration.IsZero()) an expiration header will not added to
// the http request.
Expiration time.Time
// The priority of the notification. Specify ether apns.PriorityHigh (10) or
// apns.PriorityLow (5) If you don't set this, the APNs server will set the
// priority to 10.
Priority int
// A byte array containing the JSON-encoded payload of this push notification.
// Refer to "The Remote Notification Payload" section in the Apple Local and
// Remote Notification Programming Guide for more info.
Payload interface{}
// The pushtype of the push notification. If this values is left as the
// default an apns-push-type header with value 'alert' will be added to the
// http request.
PushType EPushType
}
// MarshalJSON converts the notification payload to JSON.
func (n *Notification) MarshalJSON() ([]byte, error) {
switch payload := n.Payload.(type) {
case string:
return []byte(payload), nil
case []byte:
return payload, nil
default:
return json.Marshal(payload)
}
}