zoukankan      html  css  js  c++  java
  • APNS IOS 消息推送

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

  • 相关阅读:
    例题6-8 Tree Uva548
    例题6-7 Trees on the level ,Uva122
    caffe Mac 安装
    Codeforces Round #467 (Div. 1) B. Sleepy Game
    Educational Codeforces Round37 E
    Educational Codeforces Round 36 (Rated for Div. 2) E. Physical Education Lessons
    Good Bye 2017 E. New Year and Entity Enumeration
    Good Bye 2017 D. New Year and Arbitrary Arrangement
    Codeforces Round #454 D. Seating of Students
    浙大紫金港两日游
  • 原文地址:https://www.cnblogs.com/heyangyi/p/8535565.html
Copyright © 2011-2022 走看看