首页 > 代码库 > 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中写一些代码,来接受推送.

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