APNS/2 es un paquete GO diseñado para notificaciones simples, flexibles y rápidas de manzanas en iOS, OSX y Safari utilizando la nueva API de proveedor HTTP/2 Push.
go get -u github.com/sideshow/apns2
Si está ejecutando la suite de prueba, también deberá instalar Testify:
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 )
}
En lugar de usar un certificado .p12
o .pem
como se indicó anteriormente, puede usar opcionalmente tokens de autenticación del proveedor APNS JWT. Primero necesitará una clave de firma (archivo .p8
), ID de clave e ID de equipo de Apple. Una vez que tenga estos detalles, puede crear un nuevo cliente:
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 )
Como mínimo, una notificación necesita un DeviceToken , un tema y una carga útil .
notification := & apns2. Notification {
DeviceToken : "11aa01229f15f0f0c52029d8cf8cd0aeaf2365fe4cebc4af26cd6d76b7919ef7" ,
Topic : "com.sideshow.Apns2" ,
Payload : [] byte ( `{"aps":{"alert":"Hello!"}}` ),
}
También puede establecer un APNSID , vencimiento o prioridad opcional.
notification . ApnsID = "40636A2C-C093-493E-936A-2A4333C06DEA"
notification . Expiration = time . Now ()
notification . Priority = apns2 . PriorityLow
Puede usar bytes sin procesar para la notification.Payload
. Payload como se indicó
// {"aps":{"alert":"hello","badge":1},"key":"val"}
payload := payload . NewPayload (). Alert ( "hello" ). Badge ( 1 ). Custom ( "key" , "val" )
notification . Payload = payload
client . Push ( notification )
Consulte los documentos de carga útil para obtener más información.
APNS/2 dibuja la distinción entre una respuesta válida de Apple que indica si la notificación se envió o no, y un error irrecuperable o inesperado;
Error
si se produce un error no recuperable, es decir, si hay un problema con la conexión o certificado HTTP.Client subyacente, la carga útil no se envió o no se recibió una respuesta válida.Response
si la carga útil se envió correctamente a Apple y se recibió una respuesta documentada. Esta estructura contendrá más información sobre si la notificación push logró o no, su APNS-ID y, si corresponde, más información sobre por qué no tuvo éxito. Para verificar si una Notification
se envió con éxito;
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 )
}
Para un mejor control sobre las cancelaciones de solicitud y los tiempos de espera de los tiempos de espera de los contextos. El uso de un contexto puede ser útil si desea cancelar todos los empujes cuando se cancela el proceso principal o necesita un control de grano más fino sobre los tiempos de espera individuales. Consulte la publicación de Google para obtener más información sobre contextos.
ctx , cancel = context . WithTimeout ( context . Background (), 10 * time . Second )
res , err := client . PushWithContext ( ctx , notification )
defer cancel ()
Vea también la página Wiki en la velocidad de empuje APNS HTTP 2.
Para el mejor rendimiento, debe aferrarse a una instancia apns2.Client
y no recrearla cada empuje. La conexión TLS subyacente en sí misma puede tardar unos segundos en conectarse y negociar, por lo que si está configurando un apns2.Client
y la derriba cada empuje, esto afectará en gran medida el rendimiento. (Apple sugiere mantener la conexión abierta todo el tiempo).
También debe limitar la cantidad de instancias apns2.Client
. El transporte subyacente tiene un grupo de conexión HTTP en sí, por lo que una sola instancia de cliente será suficiente para la mayoría de los usuarios (una instancia puede hacer más de 4,000 empujes por segundo). Si necesita más que esto, una instancia por núcleo de CPU es un buen punto de partida.
La velocidad se ve muy afectada por la ubicación de su servidor y la calidad de su conexión de red. Si solo está probando localmente, detrás de un proxy o si su servidor está fuera de Estados Unidos, entonces no obtendrá un gran rendimiento. Con un buen servidor ubicado en AWS, debería poder obtener un rendimiento decente.
APNS/2 tiene una herramienta de línea de comandos que se puede instalar con go get github.com/sideshow/apns2/apns2
. Uso:
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 licencia del MIT (MIT)
Copyright (c) 2016 Adam Jones
El permiso se otorga, de forma gratuita, a cualquier persona que obtenga una copia de este software y archivos de documentación asociados (el "software"), para tratar el software sin restricción, incluidos los derechos de usar, copiar, modificar, modificar, modificar, fusionar , publique, distribuya, sublicence y venda copias del software, y para permitir a las personas a las que se proporciona el software para hacerlo, sujeto a las siguientes condiciones:
El aviso de derechos de autor anterior y este aviso de permiso se incluirán en todas las copias o porciones sustanciales del software.
El software se proporciona "tal cual", sin garantía de ningún tipo, expresa o implícita, incluidas, entre otros, las garantías de comerciabilidad, idoneidad para un propósito particular y no infracción. En ningún caso los autores o titulares de derechos de autor serán responsables de cualquier reclamo, daños u otra responsabilidad, ya sea en una acción de contrato, agravio o de otro tipo, derivado de o en relación con el software o el uso u otros tratos en el SOFTWARE.