zoukankan      html  css  js  c++  java
  • 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中写一些代码,来接受推送.

    //创建一个推送对象
     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
    

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

    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文件 拿过来 引用到你的项目中.就可以使用了 ,至于其他问题 和别的平台没有去测试

  • 相关阅读:
    python2.7实现websocket服务器,可以在web实时显示远程服务器日志
    web请求的处理流程
    实现简单的django上传文件
    rsync+sersync实现数据文件实时同步
    WebSphere之wasprofile.sh使用
    WebSphere性能优化的几个方法
    WebSphere配置数据库连接池
    正则表达式(Regular Expression)
    FFT Golang 实现
    http://phantomjs.org/page-automation.html
  • 原文地址:https://www.cnblogs.com/ruhuaxiao/p/3829786.html
Copyright © 2011-2022 走看看