163 lines
7.2 KiB
Go
163 lines
7.2 KiB
Go
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)
|
||
}
|
||
}
|