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