APNS/2 عبارة عن حزمة GO مصممة لإشعارات Apple بسيطة ومرنة وسريعة على iOS و OSX و Safari باستخدام API الجديد HTTP/2 Push Provider API.
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 ستحتاج أولاً إلى مفتاح توقيع (ملف .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 يمكنك استخدام Bytes Raw notification.Payload على النحو الوارد أعلاه ، أو يمكنك استخدام حزمة Bayload 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 واستلمت استجابة موثقة. سيحتوي هذا الهيكل على مزيد من المعلومات حول ما إذا كان إشعار الدفع قد نجح أم لا ، معرف APNS ومزيد من المعلومات إن أمكن ، حول سبب عدم نجاحه. للتحقق مما إذا تم إرسال 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 ()انظر أيضًا صفحة Wiki على APNS HTTP 2 Speed Speed.
للحصول على أفضل أداء ، يجب أن تمسك بمثال apns2.Client وعدم إعادة إنشاء كل دفعة. يمكن أن يستغرق اتصال TLS الأساسي نفسه بضع ثوان للاتصال والتفاوض ، لذلك إذا كنت تقوم بإعداد apns2.Client وتمزقه في كل دفعة ، فسيؤثر ذلك بشكل كبير على الأداء. (تقترح Apple الحفاظ على الاتصال مفتوحًا طوال الوقت).
يجب عليك أيضًا الحد من كمية apns2.Client مثيلات. يحتوي النقل الأساسي على مجموعة اتصال HTTP نفسها ، وبالتالي فإن مثيل عميل واحد سيكون كافياً لمعظم المستخدمين (يمكن أن يقوم أحد الأمثلة بأكثر من 4000 شخص في الثانية). إذا كنت بحاجة إلى أكثر من هذا ، فإن مثيلًا واحدًا لكل وحدة المعالجة المركزية هو نقطة انطلاق جيدة.
تتأثر السرعة بشكل كبير بموقع الخادم الخاص بك وجودة اتصال الشبكة الخاصة بك. إذا كنت تختبر محليًا فقط ، أو خلف وكيل أو إذا كان الخادم الخاص بك خارج الولايات المتحدة الأمريكية ، فلن تحصل على أداء رائع. مع خادم جيد موجود في 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)
حقوق الطبع والنشر (ج) 2016 آدم جونز
يتم منح الإذن بموجب هذا ، مجانًا ، لأي شخص يحصل على نسخة من هذا البرنامج وملفات الوثائق المرتبطة ("البرنامج") ، للتعامل في البرنامج دون تقييد ، بما في ذلك على سبيل المثال لا الحصر حقوق استخدام ، نسخ ، تعديل ، دمج أو نشر نسخ وتوزيعها و/أو بيعها و/أو بيع نسخ من البرامج ، والسماح للأشخاص الذين يتم تقديم البرنامج لهم للقيام بذلك ، مع مراعاة الشروط التالية:
يجب إدراج إشعار حقوق الطبع والنشر أعلاه وإشعار الإذن هذا في جميع النسخ أو الأجزاء الكبيرة من البرنامج.
يتم توفير البرنامج "كما هو" ، دون أي ضمان من أي نوع ، صريح أو ضمني ، بما في ذلك على سبيل المثال لا الحصر ضمانات القابلية للتسويق واللياقة لغرض معين وعدم الانتهاك. لا يجوز بأي حال من الأحوال أن يتحمل المؤلفون أو حاملي حقوق الطبع والنشر مسؤولية أي مطالبة أو أضرار أو مسؤولية أخرى ، سواء في إجراء عقد أو أضرار أو غير ذلك ، ناشئة عن البرامج أو خارجها أو الاستخدام أو غيرها برمجة.