APNS IOS 消息推送

本文涉及的产品
密钥管理服务KMS,1000个密钥,100个凭据,1个月
简介: 一.Apns简介: Apns是苹果推送通知服务。 二.原理: APNs会对用户进行物理连接认证,和设备令牌认证(简言之就是苹果的服务器检查设备里的证书以确定其为苹果设备);然后,将服务器的信息接收并且保存在APNs当中,APNs从其中注册的列表中查找该IOS设备(设备可以为iPhone、iPad、iPod Touch,版本是iOS3.

一.Apns简介:

Apns是苹果推送通知服务。

二.原理:

APNs会对用户进行物理连接认证,和设备令牌认证(简言之就是苹果的服务器检查设备里的证书以确定其为苹果设备);
然后,将服务器的信息接收并且保存在APNs当中,APNs从其中注册的列表中查找该IOS设备(设备可以为iPhone、iPad、iPod Touch,版本是iOS3.0及以上)并将信息发送到该设备;

Provider与APNS之间要建立连接,APNS和Device之间也要建立连接,这两个连接都是加密的,采用的TLS的方式,加密用的证书需要生成的,这个证书分两种,一种是“开发者证书”,使用开发者证书的APP可以发布在APPSTORE上面,另一种是“企业证书”,使用企业证书的APP只能发在企业内部市场,不能发在APPSTORE上。

三.使用.NET开源类库PushSharp向苹果APNS服务推送消息。

下载PushSharp开源项目编译  https://github.com/Redth/PushSharp

编译成功后进行APNS推送需要使用 Newtonsoft.Json.dll ,PushSharp.Apple.dll ,PushSharp.Core.dll 三个程序集库文件

然后需要ios端提供 .p12的证书文件以及证书文件的加密密码

准备好这些后新建控制台程序引用上面的库文件,将证书复制到根目录改变属性输出到复制目录为始终复制

 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网络下的出现的掉线重连等等,以及如何使用消耗最少的流量保持设备和推送代理的长连接,都是高难度的挑战。在做好通道建立和管理后才是消息的推送和管理。

博客内容仅代表个人观点,如发现阐述有误,麻烦指正,谢谢!
目录
相关文章
|
iOS开发
iOS开发-聊天气泡的绘制和聊天消息列表
iOS开发-聊天气泡的绘制和聊天消息列表
256 0
iOS开发-聊天气泡的绘制和聊天消息列表
|
iOS开发
IOS消息推送
IOS消息推送
140 0
|
存储 缓存 开发者
iOS-底层原理 14:消息流程分析之 动态方法决议 & 消息转发
iOS-底层原理 14:消息流程分析之 动态方法决议 & 消息转发
332 0
iOS-底层原理 14:消息流程分析之 动态方法决议 & 消息转发
|
缓存 算法 C++
iOS-底层原理 13:消息流程分析之慢速查找
iOS-底层原理 13:消息流程分析之慢速查找
150 0
iOS-底层原理 13:消息流程分析之慢速查找
|
存储 缓存 自然语言处理
iOS-底层原理 12:消息流程分析之快速查找
iOS-底层原理 12:消息流程分析之快速查找
104 0
iOS-底层原理 12:消息流程分析之快速查找
|
搜索推荐 iOS开发
iOS小技能:消息推送扩展的使用
iOS小技能:消息推送扩展的使用
565 0
iOS小技能:消息推送扩展的使用
|
PHP 数据安全/隐私保护 iOS开发
分分钟搞定IOS远程消息推送(二)
分分钟搞定IOS远程消息推送
416 0
分分钟搞定IOS远程消息推送(二)
|
存储 Android开发 数据安全/隐私保护
分分钟搞定IOS远程消息推送(一)
分分钟搞定IOS远程消息推送
258 0
分分钟搞定IOS远程消息推送(一)
|
存储 iOS开发
iOS消息转发小记
消息转发流程图 15277558865032.jpg 如果类接收到无法处理的消息,会触发消息转发机制,一共有三个步骤,接受者在每一步中均有机会处理消息。
1194 0
|
iOS开发
iOS快速清除全部的消息推送
前言 越来越多的应用,请求用户推送权限,一般情况下,普通应用我是不允许的,除了通讯应用、支付宝(银行app有很多不羊毛的活动推送,不允许)、GTD(Things、Due)、健身(Kepp、SixPack),其它的像淘宝天猫、京东,每次打开app,都要反复问我还要不要打开推送,你们就不能先调查一下我用的iOS系统多久吗?请问一个用了4年以上的用户,如果他还想打你们家的app推送,难道不知道在那里开吗?脑子进水吧。
1382 0