O APNS/2 é um pacote Go projetado para notificações simples, flexíveis e rápidas de push de maçã no iOS, OSX e Safari usando a nova API do provedor de push HTTP/2.
go get -u github.com/sideshow/apns2Se você estiver executando o conjunto de testes, também precisará instalar o 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 )
} Em vez de usar um certificado .p12 ou .pem como acima, você pode opcionalmente usar tokens de autenticação do provedor JWT APNS. Primeiro, você precisará de uma chave de assinatura (arquivo .p8 ), ID da chave e ID da equipe da Apple. Depois de ter esses detalhes, você pode criar um novo 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 )No mínimo, uma notificação precisa de um departamento , um tópico e uma carga útil .
notification := & apns2. Notification {
DeviceToken : "11aa01229f15f0f0c52029d8cf8cd0aeaf2365fe4cebc4af26cd6d76b7919ef7" ,
Topic : "com.sideshow.Apns2" ,
Payload : [] byte ( `{"aps":{"alert":"Hello!"}}` ),
}Você também pode definir um apnsid , expiração ou prioridade opcional.
notification . ApnsID = "40636A2C-C093-493E-936A-2A4333C06DEA"
notification . Expiration = time . Now ()
notification . Priority = apns2 . PriorityLow Você pode usar bytes crus para a notification.Payload .
// {"aps":{"alert":"hello","badge":1},"key":"val"}
payload := payload . NewPayload (). Alert ( "hello" ). Badge ( 1 ). Custom ( "key" , "val" )
notification . Payload = payload
client . Push ( notification )Consulte os documentos da carga útil para obter mais informações.
O APNS/2 faz a distinção entre uma resposta válida da Apple, indicando se a notificação foi ou não ou não, e um erro irrecuperável ou inesperado;
Error é retornado se ocorrer um erro não recuperável, ou seja, se houver um problema com a conexão ou certificado de client subjacente, a carga útil não foi enviada ou uma resposta válida não foi recebida.Response é devolvida se a carga útil foi enviada com sucesso à Apple e uma resposta documentada foi recebida. Essa estrutura conterá mais informações sobre se a notificação de push foi ou não bem-sucedida, seu APNS-ID e se aplicável, mais informações sobre por que ela não teve sucesso. Verificar se uma Notification foi enviada com sucesso;
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 um melhor controle sobre os cancelamentos de solicitação e os tempos limite APNs/2 suporta contextos. O uso de um contexto pode ser útil se você deseja cancelar todos os empurrões quando o processo pai for cancelado ou precisar de um controle de granulação mais refinada sobre o tempo limite individual. Consulte a postagem do Google para obter mais informações sobre contextos.
ctx , cancel = context . WithTimeout ( context . Background (), 10 * time . Second )
res , err := client . PushWithContext ( ctx , notification )
defer cancel ()Veja também a página do wiki no APNS HTTP 2 Push Speed.
Para melhor desempenho, você deve manter uma instância apns2.Client e não recriá-la a cada empurrão. A própria conexão TLS subjacente pode levar alguns segundos para se conectar e negociar; portanto, se você estiver configurando um apns2.Client e derrubando -o a cada empurrão, isso afetará bastante o desempenho. (A Apple sugere manter a conexão aberta o tempo todo).
Você também deve limitar a quantidade de instâncias apns2.Client . O transporte subjacente possui um pool de conexão HTTP, portanto, uma única instância do cliente será suficiente para a maioria dos usuários (uma instância pode potencialmente fazer mais de 4.000 empurrões por segundo). Se você precisar mais do que isso, uma instância por núcleo da CPU é um bom ponto de partida.
A velocidade é bastante afetada pela localização do seu servidor e pela qualidade da sua conexão de rede. Se você está apenas testando localmente, por trás de um proxy ou se o seu servidor estiver fora dos EUA, você não terá um ótimo desempenho. Com um bom servidor localizado na AWS, você poderá obter taxa de transferência decente.
O APNS/2 possui uma ferramenta de linha de comando que pode ser instalada com 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.
A licença do MIT (MIT)
Copyright (c) 2016 Adam Jones
É concedida permissão, gratuitamente, a qualquer pessoa que obtenha uma cópia deste software e arquivos de documentação associados (o "software"), para lidar com o software sem restrição, incluindo, sem limitação, os direitos de uso, copiar, modificar, mesclar .
O aviso de direitos autorais acima e este aviso de permissão devem ser incluídos em todas as cópias ou em partes substanciais do software.
O software é fornecido "como está", sem garantia de qualquer tipo, expresso ou implícito, incluindo, entre outros, as garantias de comercialização, aptidão para uma finalidade específica e não violação. Em nenhum caso os autores ou detentores de direitos autorais serão responsabilizados por qualquer reclamação, danos ou outro passivo, seja em uma ação de contrato, delito ou não, decorrente de, fora ou em conexão com o software ou o uso ou outras negociações nos Software.