APNS/2 เป็นแพ็คเกจ GO ที่ออกแบบมาสำหรับการแจ้งเตือนแอปเปิ้ลที่เรียบง่ายยืดหยุ่นและรวดเร็วบน iOS, OSX และ Safari โดยใช้ 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 ดังกล่าวข้างต้นหรือคุณสามารถใช้แพ็คเกจตัวสร้างเพย์โหลดซึ่งทำให้ง่ายต่อการสร้าง Payloads APNs
// {"aps":{"alert":"hello","badge":1},"key":"val"}
payload := payload . NewPayload (). Alert ( "hello" ). Badge ( 1 ). Custom ( "key" , "val" )
notification . Payload = payload
client . Push ( notification )อ้างถึงเอกสาร Payload สำหรับข้อมูลเพิ่มเติม
APNS/2 ดึงความแตกต่างระหว่างการตอบสนองที่ถูกต้องจาก Apple ระบุว่า การแจ้งเตือน ถูกส่งหรือไม่และ ข้อผิดพลาด ที่ไม่สามารถกู้คืนได้หรือไม่คาดคิด;
Error จะถูกส่งคืนหากเกิดข้อผิดพลาดที่ไม่สามารถกู้คืนได้เช่นหากมีปัญหาเกี่ยวกับการเชื่อมต่อ HTTP.Client หรือ ใบรับรอง พื้นฐานไม่ได้ส่งน้ำหนักบรรทุกหรือไม่ได้รับ การตอบกลับ ที่ถูกต้องResponse กลับจะถูกส่งคืนหากมีการส่งน้ำหนักบรรทุกไปยัง Apple เรียบร้อยแล้วและได้รับการตอบกลับเอกสาร โครงสร้างนี้จะมีข้อมูลเพิ่มเติมเกี่ยวกับการแจ้งเตือนแบบพุชสำเร็จหรือไม่ 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 ()ดูหน้า Wiki บนความเร็วดัน HTTP 2
เพื่อประสิทธิภาพที่ดีที่สุดคุณควรยึดมั่นในอินสแตนซ์ apns2.Client และไม่สร้างใหม่ทุกครั้ง การเชื่อมต่อ TLS พื้นฐานนั้นอาจใช้เวลาสองสามวินาทีในการเชื่อมต่อและเจรจาต่อรองดังนั้นหากคุณตั้งค่า apns2.Client และฉีกขาดทุกครั้งที่มีการผลักดันทั้งหมดนี้จะส่งผลกระทบอย่างมากต่อประสิทธิภาพ (Apple แนะนำให้เปิดการเชื่อมต่อตลอดเวลา)
คุณควร จำกัด จำนวนอินสแตนซ์ apns2.Client การขนส่งพื้นฐานมีพูลการเชื่อมต่อ HTTP เองดังนั้นอินสแตนซ์ไคลเอนต์เดียวจะเพียงพอสำหรับผู้ใช้ส่วนใหญ่ (หนึ่งอินสแตนซ์อาจทำ 4,000+ ผลักดันต่อวินาที) หากคุณต้องการมากกว่านี้หนึ่งอินสแตนซ์ต่อ 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)
ลิขสิทธิ์ (c) 2016 Adam Jones
ได้รับอนุญาตโดยไม่เสียค่าใช้จ่ายสำหรับบุคคลใด ๆ ที่ได้รับสำเนาซอฟต์แวร์นี้และไฟล์เอกสารที่เกี่ยวข้อง ("ซอฟต์แวร์") เพื่อจัดการในซอฟต์แวร์โดยไม่มีการ จำกัด รวมถึง แต่ไม่ จำกัด เฉพาะสิทธิ์ในการใช้คัดลอกแก้ไขผสาน เผยแพร่แจกจ่าย sublicense และ/หรือขายสำเนาของซอฟต์แวร์และอนุญาตให้บุคคลที่ซอฟต์แวร์ได้รับการตกแต่งให้ทำเช่นนั้นภายใต้เงื่อนไขดังต่อไปนี้:
ประกาศลิขสิทธิ์ข้างต้นและการแจ้งเตือนการอนุญาตนี้จะรวมอยู่ในสำเนาทั้งหมดหรือส่วนสำคัญของซอฟต์แวร์
ซอฟต์แวร์มีให้ "ตามสภาพ" โดยไม่มีการรับประกันใด ๆ ไม่ว่าโดยชัดแจ้งหรือโดยนัยรวมถึง แต่ไม่ จำกัด เฉพาะการรับประกันความสามารถในการค้าการออกกำลังกายเพื่อวัตถุประสงค์เฉพาะและการไม่ละเมิด ไม่ว่าในกรณีใดผู้เขียนหรือผู้ถือลิขสิทธิ์จะต้องรับผิดชอบต่อการเรียกร้องความเสียหายหรือความรับผิดอื่น ๆ ไม่ว่าจะเป็นการกระทำของสัญญาการละเมิดหรืออื่น ๆ ซอฟต์แวร์.