最近做公司的一个项目.一旦数据库插入新的消息,就要通知服务器,将这些新的消息推送给苹果客户端,以前我们的项目中有人做过这个功能,无奈做的有点复杂,而且代码没注释,我压根就没看懂.所以自己打算重新搞一个.
小小研究了一个,找到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文件 拿过来 引用到你的项目中.就可以使用了 ,至于其他问题 和别的平台没有去测试
原文:http://www.cnblogs.com/ruhuaxiao/p/3829786.html