APNS/2 - это пакет GO, предназначенный для простых, гибких и быстрых уведомлений Apple Push на iOS, OSX и Safari, используя новый API Push Push API HTTP/2.
go get -u github.com/sideshow/apns2
Если вы запускаете тестовый набор, вам также нужно будет установить свидетельство:
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 )
}
Вместо использования сертификата .p12
или .pem
, как указано выше, вы можете при желании использовать токены аутентификации поставщика APNS JWT. Сначала вам понадобится ключ подписания (файл .p8
), идентификатор ключа и идентификатор команды от Apple. После того, как у вас есть эти детали, вы можете создать нового клиента:
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 )
Как минимум, уведомление нуждается в Devicetoken , теме и полезной нагрузке .
notification := & apns2. Notification {
DeviceToken : "11aa01229f15f0f0c52029d8cf8cd0aeaf2365fe4cebc4af26cd6d76b7919ef7" ,
Topic : "com.sideshow.Apns2" ,
Payload : [] byte ( `{"aps":{"alert":"Hello!"}}` ),
}
Вы также можете установить дополнительную APNSID , истечение срока действия или приоритет .
notification . ApnsID = "40636A2C-C093-493E-936A-2A4333C06DEA"
notification . Expiration = time . Now ()
notification . Priority = apns2 . PriorityLow
Вы можете использовать необработанные байты для notification.Payload
Загрузка, как указано выше, или вы можете использовать пакет Beelly Builder, что позволяет легко построить полезные нагрузки APNS.
// {"aps":{"alert":"hello","badge":1},"key":"val"}
payload := payload . NewPayload (). Alert ( "hello" ). Badge ( 1 ). Custom ( "key" , "val" )
notification . Payload = payload
client . Push ( notification )
Обратитесь к документам о полезной нагрузке для получения дополнительной информации.
APNS/2 протягивает различие между допустимым ответом от Apple, указывающего, было ли уведомление отправлено или нет, и невозможной или неожиданной ошибкой ;
Error
возвращается, если возникает невозвратная ошибка, то есть, если есть проблема с базовым подключением HTTP.Client или сертификатом , полезная нагрузка не была отправлена, или действительный ответ не был получен.Response
возвращается, если полезная нагрузка была успешно отправлена в Apple, и был получен документированный ответ. Эта структура будет содержать больше информации о том, удалось ли уведомление о Push, его APNS-ID и, если применимо, больше информации о том, почему оно не удалось. Проверить, было ли Notification
успешно отправлено;
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 )
}
Для лучшего контроля над отменой запросов и тайм -аутами APNS/2 поддерживает контексты. Использование контекста может быть полезным, если вы хотите отменить все толкание при отмене родительского процесса или нуждается в более мелкозернистом контроле над индивидуальными тайм -аутами. Смотрите сообщение Google для получения дополнительной информации о контекстах.
ctx , cancel = context . WithTimeout ( context . Background (), 10 * time . Second )
res , err := client . PushWithContext ( ctx , notification )
defer cancel ()
Также см. Вики -страницу на APNS HTTP 2 Speed Speed.
Для достижения наилучшей производительности вы должны придерживаться экземпляра apns2.Client
и не воссоздать его каждый толчок. Само базовое соединение TLS может занять несколько секунд, чтобы подключиться и договориться, поэтому, если вы настраиваете apns2.Client
и разрываете его каждый толчок, то это сильно повлияет на производительность. (Apple предлагает сохранить соединение все время).
Вы также должны ограничить количество экземпляров apns2.Client
. Базовый транспорт имеет сам пул подключений HTTP, поэтому для большинства пользователей будет достаточно одного экземпляра клиента (один экземпляр потенциально может сделать 4000+ толчков в секунду). Если вам нужно больше, чем это, то один экземпляр на CPU Core является хорошей отправной точкой.
На скорость сильно влияет местоположение вашего сервера и качество вашего сетевого соединения. Если вы просто тестируете локально, за прокси или если ваш сервер находится за пределами США, то вы не получите отличную производительность. С хорошим сервером, расположенным в AWS, вы сможете получить достойную пропускную способность.
APNS/2 имеет инструмент командной строки, который можно установить с помощью go get github.com/sideshow/apns2/apns2
. Использование:
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.
Лицензия MIT (MIT)
Copyright (C) 2016 Адам Джонс
Настоящее разрешение предоставляется бесплатно любому лицу, получающему копию этого программного обеспечения и связанные с ними файлы документации («Программное обеспечение»), для работы в программном обеспечении без ограничений, включая, помимо прочего, права на использование, копирование, изменение, объединение , публиковать, распространять, сублиценс и/или продавать копии программного обеспечения и разрешить лицам, которым предоставлено программное обеспечение, при условии следующих условий:
Вышеуказанное уведомление об авторском праве и это уведомление о разрешении должно быть включено во все копии или существенные части программного обеспечения.
Программное обеспечение предоставляется «как есть», без гарантии любого рода, явного или подразумеваемого, включая, помимо прочего, гарантии товарной способности, пригодности для определенной цели и не нарушения. Ни в коем случае не будут нести ответственность авторов или владельцев авторских прав за любые претензии, ущерб или другую ответственность, будь то в действии контракта, деликт или иным образом, возникающие из или в связи с программным обеспечением или использования или других сделок в ПРОГРАММНОЕ ОБЕСПЕЧЕНИЕ.