APNS/2 ist ein GO -Paket für einfache, flexible und schnelle Apple -Push -Benachrichtigungen auf iOS, OSX und Safari unter Verwendung der neuen API HTTP/2 Push Provider.
go get -u github.com/sideshow/apns2
Wenn Sie die Testsuite ausführen, müssen Sie auch aussagen: Zeugnis:
go get -u github.com/stretchr/testify
package main
import (
"log"
"fmt"
"github.com/sideshow/apns2"
"github.com/sideshow/apns2/certificate"
)
func main () {
cert , err := certificate . FromP12File ( "../cert.p12" , "" )
if err != nil {
log . Fatal ( "Cert Error:" , err )
}
notification := & apns2. Notification {}
notification . DeviceToken = "11aa01229f15f0f0c52029d8cf8cd0aeaf2365fe4cebc4af26cd6d76b7919ef7"
notification . Topic = "com.sideshow.Apns2"
notification . Payload = [] byte ( `{"aps":{"alert":"Hello!"}}` ) // See Payload section below
// If you want to test push notifications for builds running directly from XCode (Development), use
// client := apns2.NewClient(cert).Development()
// For apps published to the app store or installed as an ad-hoc distribution use Production()
client := apns2 . NewClient ( cert ). Production ()
res , err := client . Push ( notification )
if err != nil {
log . Fatal ( "Error:" , err )
}
fmt . Printf ( "%v %v %v n " , res . StatusCode , res . ApnsID , res . Reason )
}
Anstatt ein .p12
oder .pem
-Zertifikat wie oben zu verwenden, können Sie optional APNS JWT -Anbieter -Authentifizierungs -Token verwenden. Zuerst benötigen Sie eine Signierschlüssel ( .p8
-Datei), eine Schlüssel -ID und eine Team -ID von Apple. Sobald Sie diese Details haben, können Sie einen neuen Client erstellen:
authKey , err := token . AuthKeyFromFile ( "../AuthKey_XXX.p8" )
if err != nil {
log . Fatal ( "token error:" , err )
}
token := & token. Token {
AuthKey : authKey ,
// KeyID from developer account (Certificates, Identifiers & Profiles -> Keys)
KeyID : "ABC123DEFG" ,
// TeamID from developer account (View Account -> Membership)
TeamID : "DEF123GHIJ" ,
}
...
client := apns2 . NewTokenClient ( token )
res , err := client . Push ( notification )
Zumindest erfordert eine Benachrichtigung ein Devicetoken , ein Thema und eine Nutzlast .
notification := & apns2. Notification {
DeviceToken : "11aa01229f15f0f0c52029d8cf8cd0aeaf2365fe4cebc4af26cd6d76b7919ef7" ,
Topic : "com.sideshow.Apns2" ,
Payload : [] byte ( `{"aps":{"alert":"Hello!"}}` ),
}
Sie können auch eine optionale APNSID , Ablauf oder Priorität festlegen.
notification . ApnsID = "40636A2C-C093-493E-936A-2A4333C06DEA"
notification . Expiration = time . Now ()
notification . Priority = apns2 . PriorityLow
Sie können RAW -Bytes für die notification.Payload
verwenden.
// {"aps":{"alert":"hello","badge":1},"key":"val"}
payload := payload . NewPayload (). Alert ( "hello" ). Badge ( 1 ). Custom ( "key" , "val" )
notification . Payload = payload
client . Push ( notification )
Weitere Informationen finden Sie in den Payload -Dokumenten.
APNS/2 zeichnet die Unterscheidung zwischen einer gültigen Antwort von Apple, die angibt, ob die Benachrichtigung gesendet wurde oder nicht, und einem nicht wiederbezogenen oder unerwarteten Fehler ;
Error
wird zurückgegeben, wenn ein nicht recurentable Fehler auftritt, dh wenn ein Problem mit der zugrunde liegenden HTTP.Client -Verbindung oder dem Zertifikat vorliegt, wurde die Nutzlast nicht gesendet, oder es wurde keine gültige Antwort empfangen.Response
wird zurückgegeben, wenn die Nutzlast erfolgreich an Apple gesendet wurde und eine dokumentierte Antwort empfangen wurde. Diese Struktur enthält weitere Informationen darüber, ob die Push-Benachrichtigung erfolgreich ist oder nicht, die APNS-ID und gegebenenfalls weitere Informationen darüber, warum sie nicht erfolgreich war. Zu überprüfen, ob eine Notification
erfolgreich gesendet wurde;
res , err := client . Push ( notification )
if err != nil {
log . Println ( "There was an error" , err )
return
}
if res . Sent () {
log . Println ( "Sent:" , res . ApnsID )
} else {
fmt . Printf ( "Not Sent: %v %v %v n " , res . StatusCode , res . ApnsID , res . Reason )
}
Für eine bessere Kontrolle über Anforderungsstornierungen und Timeouts unterstützt APNS/2 Kontexte. Die Verwendung eines Kontextes kann hilfreich sein, wenn Sie alle Drücken abbrechen möchten, wenn der übergeordnete Prozess storniert wird, oder eine feinere Kontrolle über einzelne Push -Zeitüberschreitungen benötigen. Weitere Informationen zu Kontexten finden Sie im Google -Beitrag.
ctx , cancel = context . WithTimeout ( context . Background (), 10 * time . Second )
res , err := client . PushWithContext ( ctx , notification )
defer cancel ()
Siehe auch die Wiki -Seite auf APNS HTTP 2 Push -Geschwindigkeit.
Für die beste Leistung sollten Sie an einer apns2.Client
-Instanz festhalten und nicht jeden Druck neu erstellt werden. Die zugrunde liegende TLS -Verbindung selbst kann einige Sekunden dauern, bis Sie eine Verbindung herstellen und verhandeln. Wenn Sie also einen apns2.Client
einrichten und jeden Druck abreißen, wird dies die Leistung stark beeinflussen. (Apple schlägt vor, die Verbindung ständig offen zu halten).
Sie sollten auch die Menge an apns2.Client
-Instanzen einschränken. Der zugrunde liegende Transport verfügt selbst über einen HTTP -Verbindungspool. Daher reicht eine einzelne Client -Instanz für die meisten Benutzer aus (eine Instanz kann möglicherweise mehr als 4.000 Pushs pro Sekunde durchführen). Wenn Sie mehr als diese benötigen, ist eine Instanz pro CPU -Kern ein guter Ausgangspunkt.
Die Geschwindigkeit wird stark vom Standort Ihres Servers und der Qualität Ihrer Netzwerkverbindung beeinflusst. Wenn Sie nur lokal testen, hinter einem Proxy oder wenn Ihr Server außerhalb der USA ist, erhalten Sie keine gute Leistung. Mit einem guten Server in AWS sollten Sie in der Lage sein, einen ordentlichen Durchsatz zu erzielen.
APNS/2 verfügt über ein Befehlszeilen -Tool, das mit go get github.com/sideshow/apns2/apns2
installiert werden kann. Verwendung:
apns2 --help
usage: apns2 --certificate-path=CERTIFICATE-PATH --topic=TOPIC [<flags>]
Listens to STDIN to send notifications and writes APNS response code and reason to STDOUT.
The expected format is: <DeviceToken> <APNS Payload>
Example: aff0c63d9eaa63ad161bafee732d5bc2c31f66d552054718ff19ce314371e5d0 {"aps": {"alert": "hi"}}
Flags:
--help Show context-sensitive help (also try --help-long and --help-man).
-c, --certificate-path=CERTIFICATE-PATH
Path to certificate file.
-t, --topic=TOPIC The topic of the remote notification, which is typically the bundle ID for your app
-m, --mode="production" APNS server to send notifications to. `production` or `development`. Defaults to `production`
--version Show application version.
Die MIT -Lizenz (MIT)
Copyright (C) 2016 Adam Jones
Die Erlaubnis wird hiermit kostenlos an eine Person erteilt, die eine Kopie dieser Software und zugehörigen Dokumentationsdateien ("Software") erhält, um die Software ohne Einschränkung zu behandeln, einschließlich ohne Einschränkung der Rechte zu verwenden, zu kopieren, zu modifizieren, zu verschmelzen, verschmelzen , veröffentlichen, vertreiben, unterlizenzieren und/oder Kopien der Software verkaufen und Personen, denen die Software dazu bereitgestellt wird, unter den folgenden Bedingungen ermöglicht:
Die oben genannte Copyright -Mitteilung und diese Erlaubnisbekanntmachung müssen in alle Kopien oder wesentlichen Teile der Software enthalten sein.
Die Software wird "wie es ist" ohne Garantie jeglicher Art, ausdrücklich oder stillschweigend bereitgestellt, einschließlich, aber nicht beschränkt auf die Gewährleistung der Handelsfähigkeit, die Eignung für einen bestimmten Zweck und die Nichtverletzung. In keinem Fall haftet die Autoren oder Urheberrechtsinhaber für Ansprüche, Schäden oder andere Haftungen, sei es in Vertragsmaßnahmen, unerlaubter Handlung oder anderweitig, aus oder im Zusammenhang mit der Software oder anderen Geschäften in der SOFTWARE.