Documentation
¶
Index ¶
- Constants
- Variables
- func StartMockFeedbackServer()
- type AlertDictionary
- type Client
- type FeedbackResponse
- type Payload
- type PushNotification
- func (this *PushNotification) AddData(value interface{})
- func (this *PushNotification) AddPayload(p *Payload)
- func (this *PushNotification) Get(key string) interface{}
- func (this *PushNotification) PayloadJSON() ([]byte, error)
- func (this *PushNotification) PayloadString() (string, error)
- func (this *PushNotification) Set(key string, value interface{})
- func (this *PushNotification) ToBytes() ([]byte, error)
- type PushNotificationResponse
Constants ¶
const FEEDBACK_TIMEOUT_SECONDS = 5
Wait at most this many seconds for feedback data from Apple.
const IDENTIFIER_UBOUND = 9999
Every push notification gets a pseudo-unique identifier; this establishes the upper boundary for it. Apple will return this identifier if there is an issue sending your notification.
const MAX_PAYLOAD_SIZE_BYTES = 256
Your total notification payload cannot exceed 256 bytes.
const PUSH_COMMAND_VALUE = 1
Push commands always start with command value 1.
const TIMEOUT_SECONDS = 5
The maximum number of seconds we're willing to wait for a response from the Apple Push Notification Service.
Variables ¶
var APPLE_PUSH_RESPONSES = map[uint8]string{
0: "NO_ERRORS",
1: "PROCESSING_ERROR",
2: "MISSING_DEVICE_TOKEN",
3: "MISSING_TOPIC",
4: "MISSING_PAYLOAD",
5: "INVALID_TOKEN_SIZE",
6: "INVALID_TOPIC_SIZE",
7: "INVALID_PAYLOAD_SIZE",
8: "INVALID_TOKEN",
10: "SHUTDOWN",
255: "UNKNOWN",
}
This enumerates the response codes that Apple defines for push notification attempts.
var FeedbackChannel = make(chan (*FeedbackResponse))
FeedbackChannel will receive individual responses from Apple.
var ShutdownChannel = make(chan bool)
If there's nothing to read, ShutdownChannel gets a true.
Functions ¶
func StartMockFeedbackServer ¶
func StartMockFeedbackServer()
This is a simple stand-in for the Apple feedback service that can be used for testing purposes. Doesn't handle many errors, etc. Just for the sake of having something "live" to hit.
Types ¶
type AlertDictionary ¶
type AlertDictionary struct {
Body string `json:"body,omitempty"`
ActionLocKey string `json:"action-loc-key,omitempty"`
LocKey string `json:"loc-key,omitempty"`
LocArgs []string `json:"loc-args,omitempty"`
LaunchImage string `json:"launch-image,omitempty"`
}
From the APN docs: "Use the ... alert dictionary in general only if you absolutely need to." The AlertDictionary is suitable for specific localization needs.
type Client ¶
type Client struct {
Gateway string
CertificateFile string
CertificateBase64 string
KeyFile string
KeyBase64 string
}
You'll need to provide your own CertificateFile and KeyFile to send notifications. Ideally, you'll just set the CertificateFile and KeyFile fields to a location on drive where the certs can be loaded, but if you prefer you can use the CertificateBase64 and KeyBase64 fields to store the actual contents.
func BareClient ¶
Constructor. Use this if you want to set cert and key blocks manually.
func ComboPEMClient ¶
func (*Client) ConnectAndWrite ¶
func (this *Client) ConnectAndWrite(resp *PushNotificationResponse, payload []byte) (err error)
In lieu of a timeout (which would be available in Go 1.1) we use a timeout channel pattern instead. We start two goroutines, one of which just sleeps for TIMEOUT_SECONDS seconds, while the other waits for a response from the Apple servers.
Whichever channel puts data on first is the "winner". As such, it's possible to get a false positive if Apple takes a long time to respond. It's probably not a deal-breaker, but something to be aware of.
func (*Client) ListenForFeedback ¶
Connect to the Apple Feedback Service and check for feedback. Feedback consists of device identifiers that should not be sent to in the future; Apple does monitor that you respect this so you should be checking it ;)
func (*Client) Send ¶
func (this *Client) Send(pn *PushNotification) (resp *PushNotificationResponse)
Connects to the APN service and sends your push notification. Remember that if the submission is successful, Apple won't reply.
type FeedbackResponse ¶
type Payload ¶
type Payload struct {
Alert interface{} `json:"alert,omitempty"`
Badge int `json:"badge,omitempty"`
Sound string `json:"sound,omitempty"`
ContentAvailable int `json:"content-available,omitempty"`
}
Alert is an interface here because it supports either a string or a dictionary, represented within by an AlertDictionary struct.
type PushNotification ¶
type PushNotification struct {
Identifier int32
Expiry uint32
DeviceToken string
// contains filtered or unexported fields
}
The PushNotification is the wrapper for the Payload. The length fields are computed in ToBytes() and aren't represented here.
func NewPushNotification ¶
func NewPushNotification() (pn *PushNotification)
Constructor. Also initializes the pseudo-random identifier.
func (*PushNotification) AddData ¶
func (this *PushNotification) AddData(value interface{})
func (*PushNotification) AddPayload ¶
func (this *PushNotification) AddPayload(p *Payload)
func (*PushNotification) Get ¶
func (this *PushNotification) Get(key string) interface{}
func (*PushNotification) PayloadJSON ¶
func (this *PushNotification) PayloadJSON() ([]byte, error)
func (*PushNotification) PayloadString ¶
func (this *PushNotification) PayloadString() (string, error)
func (*PushNotification) Set ¶
func (this *PushNotification) Set(key string, value interface{})
func (*PushNotification) ToBytes ¶
func (this *PushNotification) ToBytes() ([]byte, error)
Returns a byte array of the complete PushNotification struct. This array is what should be transmitted to the APN Service.
type PushNotificationResponse ¶
func NewPushNotificationResponse ¶
func NewPushNotificationResponse() (resp *PushNotificationResponse)
Constructor.