APNS/2 adalah paket GO yang dirancang untuk pemberitahuan Push Apple yang sederhana, fleksibel, dan cepat di iOS, OSX dan Safari menggunakan API Penyedia Push HTTP/2 yang baru.
go get -u github.com/sideshow/apns2Jika Anda menjalankan suite tes, Anda juga perlu menginstal kesaksian:
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 )
} Alih -alih menggunakan sertifikat .p12 atau .pem seperti di atas, Anda secara opsional dapat menggunakan token otentikasi penyedia jwt APNS. Pertama, Anda akan memerlukan kunci penandatanganan (file .p8 ), ID kunci dan ID tim dari Apple. Setelah Anda memiliki detail ini, Anda dapat membuat klien baru:
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 )Minimal, pemberitahuan membutuhkan devicetoken , topik dan muatan .
notification := & apns2. Notification {
DeviceToken : "11aa01229f15f0f0c52029d8cf8cd0aeaf2365fe4cebc4af26cd6d76b7919ef7" ,
Topic : "com.sideshow.Apns2" ,
Payload : [] byte ( `{"aps":{"alert":"Hello!"}}` ),
}Anda juga dapat mengatur apnsid opsional, kedaluwarsa atau prioritas .
notification . ApnsID = "40636A2C-C093-493E-936A-2A4333C06DEA"
notification . Expiration = time . Now ()
notification . Priority = apns2 . PriorityLow Anda dapat menggunakan byte mentah untuk 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 )Lihat dokumen payload untuk info lebih lanjut.
APNS/2 menarik perbedaan antara respons yang valid dari Apple yang menunjukkan apakah pemberitahuan dikirim atau tidak, dan kesalahan yang tidak dapat dipulihkan atau tidak terduga;
Error dikembalikan jika terjadi kesalahan yang tidak dapat dipulihkan, yaitu jika ada masalah dengan koneksi atau sertifikat http .Response dikembalikan jika muatan berhasil dikirim ke Apple dan tanggapan yang terdokumentasi diterima. Struct ini akan berisi lebih banyak informasi tentang apakah pemberitahuan push berhasil atau tidak, APN-ID- nya dan jika berlaku, lebih banyak informasi di sekitar mengapa itu tidak berhasil. Untuk memeriksa apakah Notification telah berhasil dikirim;
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 )
}Untuk kontrol yang lebih baik atas pembatalan permintaan dan batas waktu APNS/2 mendukung konteks. Menggunakan konteks dapat membantu jika Anda ingin membatalkan semua dorongan ketika proses induk dibatalkan, atau membutuhkan kontrol berbutir yang lebih baik atas waktu tekan masing -masing. Lihat Google Post untuk informasi lebih lanjut tentang konteks.
ctx , cancel = context . WithTimeout ( context . Background (), 10 * time . Second )
res , err := client . PushWithContext ( ctx , notification )
defer cancel ()Juga lihat halaman wiki di APNS http 2 push speed.
Untuk kinerja terbaik, Anda harus berpegang pada contoh apns2.Client dan tidak menciptakannya kembali setiap dorongan. Koneksi TLS yang mendasari itu sendiri dapat memakan waktu beberapa detik untuk terhubung dan bernegosiasi, jadi jika Anda menyiapkan apns2.Client dan merobohkannya setiap dorongan, maka ini akan sangat mempengaruhi kinerja. (Apple menyarankan agar koneksi tetap terbuka sepanjang waktu).
Anda juga harus membatasi jumlah apns2.Client Instance. Transportasi yang mendasarinya memiliki kumpulan koneksi HTTP itu sendiri, sehingga satu contoh klien akan cukup untuk sebagian besar pengguna (satu contoh berpotensi melakukan 4.000+ dorongan per detik). Jika Anda membutuhkan lebih dari ini maka satu contoh per inti CPU adalah titik awal yang baik.
Kecepatan sangat dipengaruhi oleh lokasi server Anda dan kualitas koneksi jaringan Anda. Jika Anda hanya menguji secara lokal, di belakang proxy atau jika server Anda berada di luar USA maka Anda tidak akan mendapatkan kinerja yang hebat. Dengan server yang baik yang terletak di AWS, Anda harus bisa mendapatkan throughput yang layak.
APNS/2 memiliki alat baris perintah yang dapat diinstal dengan go get github.com/sideshow/apns2/apns2 . Penggunaan:
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.
Lisensi MIT (MIT)
Hak Cipta (C) 2016 Adam Jones
Izin dengan ini diberikan, gratis, kepada siapa pun yang mendapatkan salinan perangkat lunak ini dan file dokumentasi terkait ("Perangkat Lunak"), untuk menangani perangkat lunak tanpa pembatasan, termasuk tanpa batasan hak untuk menggunakan, menyalin, memodifikasi, menggabungkan , menerbitkan, mendistribusikan, sublisense, dan/atau menjual salinan perangkat lunak, dan untuk mengizinkan orang -orang yang dilengkapi dengan perangkat lunak untuk melakukannya, tunduk pada kondisi berikut:
Pemberitahuan hak cipta di atas dan pemberitahuan izin ini harus dimasukkan dalam semua salinan atau bagian substansial dari perangkat lunak.
Perangkat lunak ini disediakan "sebagaimana adanya", tanpa jaminan apa pun, tersurat maupun tersirat, termasuk tetapi tidak terbatas pada jaminan dapat diperjualbelikan, kebugaran untuk tujuan tertentu dan tidak ada pelanggaran. Dalam hal apa pun penulis atau pemegang hak cipta tidak akan bertanggung jawab atas klaim, kerusakan atau tanggung jawab lainnya, baik dalam tindakan kontrak, gugatan atau sebaliknya, timbul dari, di luar atau sehubungan dengan perangkat lunak atau penggunaan atau transaksi lain dalam PERANGKAT LUNAK.