APNS / 2 est un package GO conçu pour des notifications push Apple simples, flexibles et rapides sur iOS, OSX et Safari à l'aide de la nouvelle API HTTP / 2 Push Provider.
go get -u github.com/sideshow/apns2
Si vous exécutez la suite de tests, vous devrez également installer Tesify:
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 )
}
Au lieu d'utiliser un certificat .p12
ou .pem
comme ci-dessus, vous pouvez éventuellement utiliser les jetons d'authentification du fournisseur APNS JWT. Vous aurez d'abord besoin d'une touche de signature (fichier .p8
), d'un ID de clé et d'un ID d'équipe d'Apple. Une fois que vous avez ces détails, vous pouvez créer un nouveau client:
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 )
Au minimum, une notification a besoin d'un DeviceToken , d'un sujet et d'une charge utile .
notification := & apns2. Notification {
DeviceToken : "11aa01229f15f0f0c52029d8cf8cd0aeaf2365fe4cebc4af26cd6d76b7919ef7" ,
Topic : "com.sideshow.Apns2" ,
Payload : [] byte ( `{"aps":{"alert":"Hello!"}}` ),
}
Vous pouvez également définir un apnside , l'expiration ou la priorité en option.
notification . ApnsID = "40636A2C-C093-493E-936A-2A4333C06DEA"
notification . Expiration = time . Now ()
notification . Priority = apns2 . PriorityLow
Vous pouvez utiliser des octets bruts pour la notification.Payload
comme ci-dessus, ou vous pouvez utiliser le package Payload Builder qui facilite la construction de charges utiles APNS.
// {"aps":{"alert":"hello","badge":1},"key":"val"}
payload := payload . NewPayload (). Alert ( "hello" ). Badge ( 1 ). Custom ( "key" , "val" )
notification . Payload = payload
client . Push ( notification )
Reportez-vous aux documents de charge utile pour plus d'informations.
APNS / 2 établit la distinction entre une réponse valide d'Apple indiquant si la notification a été envoyée ou non, et une erreur irréprochable ou inattendue;
Error
est renvoyée si une erreur non récupérable se produit, c'est-à-dire que s'il y a un problème avec la connexion ou le certificat sous-jacent HTTP.Client , la charge utile n'a pas été envoyée, ou une réponse valide n'a pas été reçue.Response
est retournée si la charge utile a été envoyée avec succès à Apple et qu'une réponse documentée a été reçue. Cette structure contiendra plus d'informations pour savoir si la notification push a réussi ou non, son APNS-ID et, le cas échéant, plus d'informations sur les raisons pour lesquelles il n'a pas réussi. Pour vérifier si une Notification
a été envoyée avec succès;
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 )
}
Pour un meilleur contrôle sur les annulations et les délais d'attente APNS / 2, prend en charge les contextes. L'utilisation d'un contexte peut être utile si vous souhaitez annuler toutes les poussées lorsque le processus parent est annulé ou nécessitez un contrôle plus fin sur les délais de poussée individuels. Voir le Google Post pour plus d'informations sur les contextes.
ctx , cancel = context . WithTimeout ( context . Background (), 10 * time . Second )
res , err := client . PushWithContext ( ctx , notification )
defer cancel ()
Voir également la page Wiki sur Apns Http 2 Push Speed.
Pour les meilleures performances, vous devez conserver une instance apns2.Client
et ne pas la recréer à chaque poussée. La connexion TLS sous-jacente elle-même peut prendre quelques secondes pour se connecter et négocier, donc si vous configurez un clienment apns2.Client
et le démolir chaque poussée, cela affectera grandement les performances. (Apple suggère de garder la connexion ouverte tout le temps).
Vous devez également limiter le montant des instances apns2.Client
. Le transport sous-jacent a un pool de connexion HTTP lui-même, donc une seule instance client sera suffisante pour la plupart des utilisateurs (une instance peut potentiellement faire plus de 4 000 poussées par seconde). Si vous avez besoin de plus que cela, une instance par noyau CPU est un bon point de départ.
La vitesse est grandement affectée par l'emplacement de votre serveur et la qualité de votre connexion réseau. Si vous testez simplement localement, derrière un proxy ou si votre serveur est en dehors des États-Unis, vous n'obtiendrez pas d'excellentes performances. Avec un bon serveur situé dans AWS, vous devriez être en mesure d'obtenir un débit décent.
APNS / 2 a un outil de ligne de commande qui peut être installé avec go get github.com/sideshow/apns2/apns2
. Usage:
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.
La licence du MIT (MIT)
Copyright (C) 2016 Adam Jones
L'autorisation est accordée gratuitement par la présente à toute personne qui obtient une copie de ce logiciel et des fichiers de documentation associés (le "logiciel"), pour traiter le logiciel sans restriction, y compris sans limiter les droits d'utilisation, de copier, de modifier, de fusionner , publier, distribuer, sous-licencier et / ou vendre des copies du logiciel, et pour permettre aux personnes à qui le logiciel est fourni pour le faire, sous réserve des conditions suivantes:
L'avis de droit d'auteur ci-dessus et le présent avis d'autorisation sont inclus dans toutes les copies ou des parties substantielles du logiciel.
Le logiciel est fourni "tel quel", sans garantie d'aucune sorte, express ou implicite, y compris, mais sans s'y limiter, les garanties de qualité marchande, d'adéquation à un usage particulier et de non-contrefaçon. En aucun cas, les auteurs ou les titulaires de droits d'auteur ne seront pas responsables de toute réclamation, dommage ou autre responsabilité, que ce soit dans une action de contrat, de délit ou autre, découlant de, hors du logiciel ou de l'utilisation ou d'autres transactions dans le LOGICIEL.