Apns是蘋果推送通知服務。ios
APNs會對用戶進行物理鏈接認證,和設備令牌認證(簡言之就是蘋果的服務器檢查設備裏的證書以肯定其爲蘋果設備);
而後,將服務器的信息接收而且保存在APNs當中,APNs從其中註冊的列表中查找該IOS設備(設備能夠爲iPhone、iPad、iPod Touch,版本是iOS3.0及以上)並將信息發送到該設備;git
Provider與APNS之間要創建鏈接,APNS和Device之間也要創建鏈接,這兩個鏈接都是加密的,採用的TLS的方式,加密用的證書須要生成的,這個證書分兩種,一種是「開發者證書」,使用開發者證書的APP能夠發佈在APPSTORE上面,另外一種是「企業證書」,使用企業證書的APP只能發在企業內部市場,不能發在APPSTORE上。github
三.使用.NET開源類庫PushSharp向蘋果APNS服務推送消息。數據庫
下載PushSharp開源項目編譯 https://github.com/Redth/PushSharp服務器
編譯成功後進行APNS推送須要使用 Newtonsoft.Json.dll ,PushSharp.Apple.dll ,PushSharp.Core.dll 三個程序集庫文件網絡
而後須要ios端提供 .p12的證書文件以及證書文件的加密密碼ide
準備好這些後新建控制檯程序引用上面的庫文件,將證書複製到根目錄改變屬性輸出到複製目錄爲始終複製測試
class Program { static ApnsConfiguration config; static ApnsServiceBroker apnsBroker; static void Main(string[] args) { config = new ApnsConfiguration(ApnsConfiguration.ApnsServerEnvironment.Sandbox, "證書.p12", "證書加密密碼"); apnsBroker = new ApnsServiceBroker(config); //推送異常 apnsBroker.OnNotificationFailed += (notification, aggregateEx) => { aggregateEx.Handle(ex => { //判斷例外,進行診斷 if (ex is ApnsNotificationException) { var notificationException = (ApnsNotificationException)ex; //處理失敗的通知 var apnsNotification = notificationException.Notification; var statusCode = notificationException.ErrorStatusCode; Console.WriteLine("Apple Notification Failed: ID={apnsNotification.Identifier}, Code={statusCode}" + notification.DeviceToken); } else { //內部異常 Console.WriteLine("Apple Notification Failed for some unknown reason : {ex.InnerException}" + notification.DeviceToken); } // 標記爲處理 return true; }); }; //推送成功 apnsBroker.OnNotificationSucceeded += (notification) => { Console.WriteLine("Apple Notification Sent ! "+notification.DeviceToken); }; //啓動代理 apnsBroker.Start(); } /// <summary> /// 推送消息 /// </summary> public static void SendMsg() { List<string> MY_DEVICE_TOKENS = new List<string>() { "1f6f37acad29348c6a5957529c9fa61ad69766ec9c7367948745899cbccdfd51", "1f6f37acad29348c6a5957529c9fa61ad69766ec9c7367948745899cbccdfd51" }; foreach (var deviceToken in MY_DEVICE_TOKENS) { // 隊列發送一個通知 apnsBroker.QueueNotification(new ApnsNotification { DeviceToken = deviceToken,//這裏的deviceToken是ios端獲取後傳遞到數據庫統一記錄管理的,有效的Token才能保證推送成功 Payload = JObject.Parse("{\"aps\":{\"sound\":\"default\",\"badge\":\"1\",\"alert\":\"這是一條羣發廣告消息推送的測試消息\"}}") }); } //中止代理 apnsBroker.Stop(); Console.Read(); } }
上面實現了.NET向APNS蘋果消息推送通知的功能,這只是一個例子,在實際項目開發中,須要同IOS端進行交流,例如用戶下載IOS應用後的token何時記錄到數據庫,如何進行管理,如何向全部用戶和單個用戶進行消息推送和避免消息的重複推送,能夠開發成一個代理服務,實現相應的接口給推送方調用,相似激光推送的接口調用,作到統一化管理。加密
吐槽一下向Android設備推送消息,Android不像蘋果APNS的推送有着統一的通道,也沒有向APNS服務統一管理着設備的Token,一些Android手機系統的開發商,例如小米和華爲會有本身開發的統一通道進行推送管理,相似蘋果的APNS推送服務,三星有些手機走的是Google推送,可是若是要本身的應用可以在全部Android設備上收到推送到消息,不使用第三方推送去本身開發一個推送服務,就須要你的推送代理服務一直與該設備保持長連接,這些連接的管理是很是頭疼的一件事,例如在wifi局域網和234G網絡下的出現的掉線重連等等,以及如何使用消耗最少的流量保持設備和推送代理的長鏈接,都是高難度的挑戰。在作好通道創建和管理後纔是消息的推送和管理。spa