zoukankan      html  css  js  c++  java
  • PushSharp的使用

    PushSharp的使用

     

    最近做公司的一个项目.一旦数据库插入新的消息,就要通知服务器,将这些新的消息推送给苹果客户端,以前我们的项目中有人做过这个功能,无奈做的有点复杂,而且代码没注释,我压根就没看懂.所以自己打算重新搞一个.

    小小研究了一个,找到PushSharp这个类库,(超级强大),然后用了下感觉很不错,推荐给大家,为大家介绍下.

    一.首先来了解下这几个类库

    引用PushSharp 的几个类库
    PushSharp.Core:核心库必须引用
    PushSharp.Apple:向苹果推送的类库
    PushSharp.Android:C2DM及GCM,用于Android设备
    PushSharp.Windows:用于Windows 8
    PushSharp.WindowsPhone:用于WP设备
    PushSharp.Amazon.Adm:用于Amazon的设备
    PushSharp.Blackberry:用于黑莓设备
    PushSharp.Google.Chrome:用于Chrome
    这些类库按照自己的项目要求使用即可

    二.简单的示例代码

    注意,如果你需要给苹果推送 你首先要给你的APP去注册一个证书,然后在你的APP中写一些代码,来接受推送.

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    //创建一个推送对象
     private PushBroker push=new PushBroker();
    //关联推送状态事件
    push.OnNotificationSent += NotificationSent;
    push.OnChannelException += ChannelException;
    push.OnServiceException += ServiceException;
    push.OnNotificationFailed += NotificationFailed;
    push.OnDeviceSubscriptionExpired += DeviceSubscriptionExpired;
    push.OnDeviceSubscriptionChanged += DeviceSubscriptionChanged;
    push.OnChannelCreated += ChannelCreated;
    push.OnChannelDestroyed += ChannelDestroyed;
     
    var appleCert = File.ReadAllBytes("证书路径");//将证书流式读取
    push.RegisterAppleService(new ApplePushChannelSettings(appleCert, "证书密码"));//注册推送通道
    push.QueueNotification(new AppleNotification()
                                                  .ForDeviceToken(messageList[i].DeviceToken)//手机token
                                                  .WithAlert(messageList[i].Message)//推送消息内容
                              .WithBadge(7)//设备图标显示的未读数(图标右上角的小标志)
                                                  .WithSound("sound.caf"));//提示声音
     
     
    push.StopAllServices()//停止推送服务.
     
      #region=====推送状态事件
     
            static void DeviceSubscriptionChanged(object sender, string oldSubscriptionId, string newSubscriptionId, INotification notification)
            {
                //Currently this event will only ever happen for Android GCM
                //Console.WriteLine("Device Registration Changed:  Old-> " + oldSubscriptionId + "  New-> " + newSubscriptionId + " -> " + notification);
            }
            // 推送成功
            static void NotificationSent(object sender, INotification notification)
            {
                 
            }
            // 推送失败
            static void NotificationFailed(object sender, INotification notification, Exception notificationFailureException)
            {
                //Console.WriteLine("Failure: " + sender + " -> " + notificationFailureException.Message + " -> " + notification);
            }
     
            static void ChannelException(object sender, IPushChannel channel, Exception exception)
            {
                //Console.WriteLine("Channel Exception: " + sender + " -> " + exception);
            }
     
            static void ServiceException(object sender, Exception exception)
            {
                //Console.WriteLine("Channel Exception: " + sender + " -> " + exception);
            }
     
            static void DeviceSubscriptionExpired(object sender, string expiredDeviceSubscriptionId, DateTime timestamp, INotification notification)
            {
                //Console.WriteLine("Device Subscription Expired: " + sender + " -> " + expiredDeviceSubscriptionId);
            }
     
            static void ChannelDestroyed(object sender)
            {
                //Console.WriteLine("Channel Destroyed for: " + sender);
            }
     
            static void ChannelCreated(object sender, IPushChannel pushChannel)
            {
                //Console.WriteLine("Channel Created for: " + sender);
            }
            #endregion

     三.解决多信息推送,并且推送到不同的设备上.我写了一个类,来做这些事.现在也给大家看看

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    using System;
    using System.Collections.Generic;
    using System.Configuration;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;
    using PushSharp.Apple;
    using PushSharp.Core;
    using PushSharp;
    using System.IO;
    using CYPInformationSystem.Model;
    using System.Threading;
    namespace CYPInformationSystem.PushMessage
    {
        /// <summary>
        /// 描述:苹果客户端推送类
        /// 作者:茹化肖
        /// 时间:2014年7月4日16:19:40
        /// </summary>
        public class ApplePushService
        {
            private static ApplePushService applePushService;
            private static readonly object syncObject = new object();
            private PushBroker push;//创建一个推送对象
            private List<MessageModel> messageList;//消息实体队列
            private readonly string appleCertpath = AppDomain.CurrentDomain.BaseDirectory +ConfigurationManager.AppSettings["appleCertpath"];
            private readonly string appleCertPwd = ConfigurationManager.AppSettings["appleCertPwd"];//密码
            private ApplePushService()
            {
                //确保该对象被实例化
                this.push = new PushBroker();
                this.messageList = new List<MessageModel>();
                //关联推送状态事件
                push.OnNotificationSent += NotificationSent;
                push.OnChannelException += ChannelException;
                push.OnServiceException += ServiceException;
                push.OnNotificationFailed += NotificationFailed;
                push.OnDeviceSubscriptionExpired += DeviceSubscriptionExpired;
                push.OnDeviceSubscriptionChanged += DeviceSubscriptionChanged;
                push.OnChannelCreated += ChannelCreated;
                push.OnChannelDestroyed += ChannelDestroyed;
                 
            }
            #region=====公布给外接调用的方法
            /// <summary>
            /// 获取对象实例
            /// </summary>
            /// <returns></returns>
            public static ApplePushService GetInstance()
            {
                if (applePushService == null)
                {
                    lock (syncObject)
                    {
                        if (applePushService == null)
                        {
                            applePushService = new ApplePushService();
                            applePushService.TherdStart();
                        }
                    }
                }
                return applePushService;
            }
            /// <summary>
            /// 添加需要推送的消息
            /// </summary>
            /// <param name="message">消息体</param>
            public void AddMessage(MessageModel message)
            {
                messageList.Add(message);
                 
            }
            /// <summary>
            /// 推送消息
            /// </summary>
            /// <param name="msg">消息体</param>
            /// <param name="token">用户token</param>
            private void SendMessage()
            {
                try
                {
                    var appleCert = File.ReadAllBytes(appleCertpath);
                    if (appleCert.Length > 0 && appleCert != null)//证书对象不为空
                    {
                        push.RegisterAppleService(new ApplePushChannelSettings(appleCert, appleCertPwd));
                        while (true)
                        {
                            if (messageList.Count > 0)//如果 消息队列中的消息不为零 推送
                            {
                                for (int i = 0; i < messageList.Count; i++)
                                {
                                    push.QueueNotification(new AppleNotification()
                                                          .ForDeviceToken(messageList[i].DeviceToken)
                                                          .WithAlert(messageList[i].Message).WithBadge(7)
                                                          .WithSound("sound.caf"));
                                }
                                messageList.Clear();//推送成功,清除队列
                            }
                            else
                            {
                                //队列中没有需要推送的消息,线程休眠5秒
                                Thread.Sleep(5000);
                            }
                        }
                    }
                }
                catch (Exception e)
                {
                    throw e;
                }
            }
            /// <summary>
            /// 启动推送
            /// </summary>
            private void TherdStart()
            {
                Thread td = new Thread(SendMessage);
                td.IsBackground = true;
                td.Start();
            }
            #endregion
     
     
            #region=====推送状态事件
     
            static void DeviceSubscriptionChanged(object sender, string oldSubscriptionId, string newSubscriptionId, INotification notification)
            {
                //Currently this event will only ever happen for Android GCM
                //Console.WriteLine("Device Registration Changed:  Old-> " + oldSubscriptionId + "  New-> " + newSubscriptionId + " -> " + notification);
            }
            /// <summary>
            /// 推送成功
            /// </summary>
            /// <param name="sender"></param>
            /// <param name="notification"></param>
            static void NotificationSent(object sender, INotification notification)
            {
                 
            }
            /// <summary>
            /// 推送失败
            /// </summary>
            /// <param name="sender"></param>
            /// <param name="notification"></param>
            /// <param name="notificationFailureException"></param>
            static void NotificationFailed(object sender, INotification notification, Exception notificationFailureException)
            {
                //Console.WriteLine("Failure: " + sender + " -> " + notificationFailureException.Message + " -> " + notification);
            }
     
            static void ChannelException(object sender, IPushChannel channel, Exception exception)
            {
                //Console.WriteLine("Channel Exception: " + sender + " -> " + exception);
            }
     
            static void ServiceException(object sender, Exception exception)
            {
                //Console.WriteLine("Channel Exception: " + sender + " -> " + exception);
            }
     
            static void DeviceSubscriptionExpired(object sender, string expiredDeviceSubscriptionId, DateTime timestamp, INotification notification)
            {
                //Console.WriteLine("Device Subscription Expired: " + sender + " -> " + expiredDeviceSubscriptionId);
            }
     
            static void ChannelDestroyed(object sender)
            {
                //Console.WriteLine("Channel Destroyed for: " + sender);
            }
     
            static void ChannelCreated(object sender, IPushChannel pushChannel)
            {
                //Console.WriteLine("Channel Created for: " + sender);
            }
            #endregion
        }
    }

     这里用单例来保证,整个应用程序中只会有这一个推送对象,只有一个管道来推送.

    不然的话 你多次来注册这个管道会报错的.

    还遇到过 一个问题,.Newtonsoft.Json 这个程序集有时候报错,说版本不对. 这个程序集是类序列化消息的.

    我的解决办法是,去获取PushSharp 的源码.官方网站:https://github.com/Redth/PushSharp

    然后自己编译一下,将生成的Dll文件 拿过来 引用到你的项目中.就可以使用了 ,至于其他问题 和别的平台没有去测试

     
     
    分类: 心得
     
  • 相关阅读:
    Atitit 软件知识点分类体系 分类 按照书籍的分类 学科分类 体系与基础部分 计算机体系结构 硬件接口技术(usb,agp,pci,div,hdmi) os操作系统 中间件 语言部分
    Atitit spring注解事务的demo与代码说明 目录 1.1. Spring框架中,要如何实现事务?有一个注解,@EnableTransactionManagement 1 1.2. 事务管理
    Atitit springboot mybatis spring 集成 Springboot1.4 mybatis3.4.6 /springbootMybatis 目录 1.1. 设置map
    Atitit 计算机系统结构 计算机系统结构 Cpu 存储 cache 指令系统 目录 Line 56: 第2章指令系统设计 指令格式 寻址方式 1 Line 64: 第3章CPU及其实现
    Atitit 微服务 分布式 区别 微服务的判断标准 目录 1.1. 区别 微服务侧重于微小服务进程隔离级别,分布式侧重于机器隔离 1 2. 微服务是一种架构, 。多微才叫微? 1 2.1. 微服务
    Atitit spirngboot 访问 html文件总结 自设计web服务器原理与实现 Url路由压力,读取url,获得项目更路径绝对路径,拼接为文件路径。读取文建内容输出即可 目录路径 u
    Atitit 现代信息检索 Atitit 重要章节 息检索建模 检索评价 第8章 文本分类 Line 210: 第9章 索引和搜索 第11章 Web检索 第13章 结构化文本检索 目录 L
    Atitit 定时器timer 总结 目录 1.1. Js定时器 window.setInterval 1 2. Java定时器 timer 1 1.1.Js定时器 window.setInter
    Atitit spring5 集成 mybatis 注解班
    Atitit 微服务的一些理论 目录 1. 微服务的4个设计原则和19个解决方案 1 2. 微服务应用4个设计原则 1 2.1. AKF拆分原则 2 2.2. 前后端分离 2 2.3. 无状态服务
  • 原文地址:https://www.cnblogs.com/Leo_wl/p/3831283.html
Copyright © 2011-2022 走看看