APNS/2は、新しいHTTP/2プッシュプロバイダーAPIを使用して、iOS、OSX、およびSafariに関するシンプルで柔軟なAppleプッシュ通知のために設計されたGOパッケージです。
go get -u github.com/sideshow/apns2
テストスイートを実行している場合は、ESTIFYもインストールする必要があります。
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プロバイダー認証トークンをオプションで使用できます。最初に、Appleの署名キー( .p8
ファイル)、キーID、チームIDが必要になります。これらの詳細が表示されたら、新しいクライアントを作成できます。
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
にrawバイトを使用するか、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
が返されます。Response
が返されます。この構造体には、プッシュ通知が成功したかどうか、その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 Postを参照してください。
ctx , cancel = context . WithTimeout ( context . Background (), 10 * time . Second )
res , err := client . PushWithContext ( ctx , notification )
defer cancel ()
APNS HTTP 2プッシュ速度のWikiページも参照してください。
最高のパフォーマンスのために、 apns2.Client
インスタンスを保持し、プッシュごとに再作成しないでください。基礎となるTLS接続自体は、接続と交渉に数秒かかる場合があります。そのため、 apns2.Client
設定している場合、プッシュごとにそれを引き裂くと、これはパフォーマンスに大きく影響します。 (Appleは常に接続を開いたままにしておくことをお勧めします)。
また、 apns2.Client
インスタンスの量を制限する必要があります。基礎となるトランスポートにはHTTP接続プール自体があるため、ほとんどのユーザーにとって単一のクライアントインスタンスで十分です(1つのインスタンスが1秒あたり4,000以上のプッシュを実行できます)。これ以上が必要な場合は、CPUコアごとに1つのインスタンスが適切な出発点です。
速度は、サーバーの位置とネットワーク接続の品質によって大きな影響を受けます。ローカルで、プロキシの後ろにテストしている場合、またはサーバーがアメリカの外にいる場合は、素晴らしいパフォーマンスを得ることができません。 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 Adam Jones
このソフトウェアおよび関連するドキュメントファイル(「ソフトウェア」)のコピーを取得している人に、これにより許可が無料で許可され、制限なしにソフトウェアを扱うことができます。 、ソフトウェアのコピーを公開、配布、サブライセンス、販売し、次の条件を条件として、ソフトウェアが提供される人を許可します。
上記の著作権通知とこの許可通知は、ソフトウェアのすべてのコピーまたはかなりの部分に含まれるものとします。
このソフトウェアは、商品性、特定の目的への適合性、および非侵害の保証を含むがこれらに限定されない、明示的または黙示的なものを保証することなく、「現状のまま」提供されます。いかなる場合でも、著者または著作権所有者は、契約、不法行為、またはその他の訴訟、ソフトウェアまたは使用またはその他の取引に関連する、またはその他の契約、またはその他の請求、またはその他の責任について責任を負いません。ソフトウェア。