timehop / apns

A Go package to interface with the Apple Push Notification Service
https://godoc.org/github.com/timehop/apns
MIT License
185 stars 47 forks source link
backend-dependency timehop

apns

GoDoc Build Status

A Go package to interface with the Apple Push Notification Service

Features

This library implements a few features that we couldn't find in any one library elsewhere:

API Compatibility

The apns package may undergo breaking changes. A tool like godep is recommended to vendor the current release.

Install

go get github.com/timehop/apns

Checkout the develop branch for the current work in progress.

Usage

Sending a push notification (basic)

c, _ := apns.NewClient(apns.ProductionGateway, apnsCert, apnsKey)

p := apns.NewPayload()
p.APS.Alert.Body = "I am a push notification!"
p.APS.Badge.Set(5)
p.APS.Sound = "turn_down_for_what.aiff"

m := apns.NewNotification()
m.Payload = p
m.DeviceToken = "A_DEVICE_TOKEN"
m.Priority = apns.PriorityImmediate

c.Send(m)

Sending a push notification with error handling

    c, err := apns.NewClientWithFiles(apns.ProductionGateway, "cert.pem", "key.pem")
    if err != nil {
        log.Fatal("could not create new client", err.Error())
    }

    go func() {
        for f := range c.FailedNotifs {
            fmt.Println("Notif", f.Notif.ID, "failed with", f.Err.Error())
        }
    }()

    p := apns.NewPayload()
    p.APS.Alert.Body = "I am a push notification!"
    p.APS.Badge.Set(5)
    p.APS.Sound = "turn_down_for_what.aiff"
    p.APS.ContentAvailable = 1

    p.SetCustomValue("link", "zombo://dot/com")
    p.SetCustomValue("game", map[string]int{"score": 234})

    m := apns.NewNotification()
    m.Payload = p
    m.DeviceToken = "A_DEVICE_TOKEN"
    m.Priority = apns.PriorityImmediate
    m.Identifier = 12312       // Integer for APNS
    m.ID = "user_id:timestamp" // ID not sent to Apple – to identify error notifications

    c.Send(m)

Retrieving feedback

f, err := apns.NewFeedback(s.Address(), DummyCert, DummyKey)
if err != nil {
    log.Fatal("Could not create feedback", err.Error())
}

for ft := range f.Receive() {
    fmt.Println("Feedback for token:", ft.DeviceToken)
}

Note that the channel returned from Receive will close after the feedback service has no more data to send.

Running the tests

We use Ginkgo for our testing framework and Gomega for our matchers. To run the tests:

go get github.com/onsi/ginkgo/ginkgo
go get github.com/onsi/gomega
ginkgo -randomizeAllSpecs

Contributing

License

MIT License