apns
Utilities for Apple Push Notification and Feedback Services.
Installation
go get github.com/anachronistic/apns
Documentation
- APNS package documentation
- Information on the APN JSON payloads
- Information on the APN binary protocols
- Information on APN troubleshooting
Usage
Creating pns and payloads manually
package main
import (
"fmt"
apns "github.com/anachronistic/apns"
)
func main() {
payload := apns.NewPayload()
payload.Alert = "Hello, world!"
payload.Badge = 42
payload.Sound = "bingbong.aiff"
pn := apns.NewPushNotification()
pn.AddPayload(payload)
alert, _ := pn.PayloadString()
fmt.Println(alert)
}
Returns
{
"aps": {
"alert": "Hello, world!",
"badge": 42,
"sound": "bingbong.aiff"
}
}
Using an alert dictionary for complex payloads
package main
import (
"fmt"
apns "github.com/anachronistic/apns"
)
func main() {
args := make([]string, 1)
args[0] = "localized args"
dict := apns.NewAlertDictionary()
dict.Body = "Alice wants Bob to join in the fun!"
dict.ActionLocKey = "Play a Game!"
dict.LocKey = "localized key"
dict.LocArgs = args
dict.LaunchImage = "image.jpg"
payload := apns.NewPayload()
payload.Alert = dict
payload.Badge = 42
payload.Sound = "bingbong.aiff"
pn := apns.NewPushNotification()
pn.AddPayload(payload)
alert, _ := pn.PayloadString()
fmt.Println(alert)
}
Returns
{
"aps": {
"alert": {
"body": "Alice wants Bob to join in the fun!",
"action-loc-key": "Play a Game!",
"loc-key": "localized key",
"loc-args": [
"localized args"
],
"launch-image": "image.jpg"
},
"badge": 42,
"sound": "bingbong.aiff"
}
}
Setting custom properties
package main
import (
"fmt"
apns "github.com/anachronistic/apns"
)
func main() {
payload := apns.NewPayload()
payload.Alert = "Hello, world!"
payload.Badge = 42
payload.Sound = "bingbong.aiff"
pn := apns.NewPushNotification()
pn.AddPayload(payload)
pn.Set("foo", "bar")
pn.Set("doctor", "who?")
pn.Set("the_ultimate_answer", 42)
alert, _ := pn.PayloadString()
fmt.Println(alert)
}
Returns
{
"aps": {
"alert": "Hello, world!",
"badge": 42,
"sound": "bingbong.aiff"
},
"doctor": "who?",
"foo": "bar",
"the_ultimate_answer": 42
}
Sending a notification
package main
import (
"fmt"
apns "github.com/anachronistic/apns"
)
func main() {
payload := apns.NewPayload()
payload.Alert = "Hello, world!"
payload.Badge = 42
payload.Sound = "bingbong.aiff"
pn := apns.NewPushNotification()
pn.DeviceToken = "YOUR_DEVICE_TOKEN_HERE"
pn.AddPayload(payload)
client := apns.NewClient("gateway.sandbox.push.apple.com:2195", "YOUR_CERT_PEM", "YOUR_KEY_NOENC_PEM")
resp := client.Send(pn)
alert, _ := pn.PayloadString()
fmt.Println(" Alert:", alert)
fmt.Println("Success:", resp.Success)
fmt.Println(" Error:", resp.Error)
}
Returns
Alert: {"aps":{"alert":"Hello, world!","badge":42,"sound":"bingbong.aiff"}}
Success: true
Error: <nil>
Checking the feedback service
package main
import (
"fmt"
apns "github.com/anachronistic/apns"
"os"
)
func main() {
fmt.Println("- connecting to check for deactivated tokens (maximum read timeout =", apns.FeedbackTimeoutSeconds, "seconds)")
client := apns.NewClient("feedback.sandbox.push.apple.com:2196", "YOUR_CERT_PEM", "YOUR_KEY_NOENC_PEM")
go client.ListenForFeedback()
for {
select {
case resp := <-apns.FeedbackChannel:
fmt.Println("- recv'd:", resp.DeviceToken)
case <-apns.ShutdownChannel:
fmt.Println("- nothing returned from the feedback service")
os.Exit(1)
}
}
}
Returns
- connecting to check for deactivated tokens (maximum read timeout = 5 seconds)
- nothing returned from the feedback service
exit status 1
Your output will differ if the service returns device tokens.
- recv'd: DEVICE_TOKEN_HERE
...etc.