Iphone 消息通知(APNS)的3种方式 -- C# 和 nodejs
发送 APNS 使用 p12 文件(C#)
public static bool PushWithP12(string apnToken, string message) { _log.DebugFormat("[Apns] step 1"); _log.DebugFormat("Token = " + apnToken); ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls | SecurityProtocolType.Tls11 | SecurityProtocolType.Tls12 | SecurityProtocolType.Ssl3; // var file = File.ReadAllBytes(ConfigurationManager.AppSettings["ApnsCertificate"]); var config = new ApnsConfiguration(ApnsConfiguration.ApnsServerEnvironment.Sandbox, ConfigurationManager.AppSettings["ApnsCertificate"], ConfigurationManager.AppSettings["ApnsPassword"]); // Create a new broker var apnsBroker = new ApnsServiceBroker(config); _log.DebugFormat("[Apns] step 2"); // Wire up events apnsBroker.OnNotificationFailed += (notification, aggregateEx) => { _log.DebugFormat("[Apns] step 3"); aggregateEx.Handle(ex => { _log.DebugFormat("[Apns] step 4"); // See what kind of exception it was to further diagnose if (ex is ApnsNotificationException) { _log.DebugFormat("[Apns] step 5"); var notificationException = (ApnsNotificationException)ex; _log.DebugFormat("[Apns] step 6"); // Deal with the failed notification var apnsNotification = notificationException.Notification; var statusCode = notificationException.ErrorStatusCode; _log.ErrorFormat($"Apple Notification Failed: ID={apnsNotification.Identifier}, Code={statusCode}"); return false; } else { // Inner exception might hold more useful information like an ApnsConnectionException _log.ErrorFormat($"Apple Notification Failed for some unknown reason : {ex.InnerException}"); return false; } // Mark it as handled //return true; }); }; _log.DebugFormat("[Apns] step 7"); apnsBroker.OnNotificationSucceeded += (notification) => { _log.InfoFormat("Apple Notification Sent!"); }; _log.DebugFormat("[Apns] step 8"); // Start the broker apnsBroker.Start(); _log.DebugFormat("[Apns] step 9"); // Queue a notification to send var apnsObj = new PayLoadEntity() { aps = new Aps() { alert = message } }; var apnsStr = JsonConvert.SerializeObject(apnsObj); _log.DebugFormat("[Apns] step 9.1"); _log.DebugFormat(apnsStr); apnsBroker.QueueNotification(new ApnsNotification { DeviceToken = apnToken, Payload = JObject.Parse(apnsStr) }); _log.DebugFormat("[Apns] step 10"); // Stop the broker, wait for it to finish // This isn't done after every message, but after you're // done with the broker apnsBroker.Stop(); _log.DebugFormat("[Apns] step 11"); return true; }
// 发送 APNS 使用 p8 文件(c#)
static async void TokenBasedAuthenticationAPNsPush(string message, string token) { string algorithm = "ES256"; string apnsKeyId = "{your_key_id}"; // get from apple dev account string teamId = "get from your membership info"; string authKeyPath = "apns.p8"; // generate from apple account string bundleId = "your app id"; string registrationId = token; var privateKeyContent = System.IO.File.ReadAllText(authKeyPath); var privateKey = privateKeyContent.Split('\n')[1]; var secretKeyFile = Convert.FromBase64String(privateKey); var secretKey = CngKey.Import(secretKeyFile, CngKeyBlobFormat.Pkcs8PrivateBlob); var expiration = DateTime.Now.ToUniversalTime() - new DateTime(1970, 1, 1, 0, 0, 0, 0, DateTimeKind.Utc); var expirationSeconds = (long)expiration.TotalSeconds; var payload = new Dictionary<string, object>() { { "iss", teamId }, { "iat", expirationSeconds } }; var header = new Dictionary<string, object>() { { "alg", algorithm }, { "kid", apnsKeyId } }; string accessToken = Jose.JWT.Encode(payload, secretKey, JwsAlgorithm.ES256, header); ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls | SecurityProtocolType.Tls11 | SecurityProtocolType.Tls12 | SecurityProtocolType.Ssl3; //Development server:api.development.push.apple.com:443 //Production server:api.push.apple.com:443 string host = "api.development.push.apple.com"; //string host = "api.push.apple.com"; int port = 443; // Uri to request var uri = new Uri(string.Format("https://{0}:{1}/3/device/{2}", host, port, registrationId)); var payloadData = JObject.FromObject(new { aps = new { alert = message } }); byte[] data = System.Text.Encoding.UTF8.GetBytes(payloadData.ToString()); var handler = new Http2MessageHandler(); var httpClient = new HttpClient(handler); var requestMessage = new HttpRequestMessage(); requestMessage.RequestUri = uri; requestMessage.Headers.Add("authorization", string.Format("bearer {0}", accessToken)); requestMessage.Headers.Add("apns-id", Guid.NewGuid().ToString()); requestMessage.Headers.Add("apns-expiration", "0"); requestMessage.Headers.Add("apns-priority", "10"); requestMessage.Headers.Add("apns-topic", bundleId); requestMessage.Method = HttpMethod.Post; requestMessage.Content = new ByteArrayContent(data); try { var responseMessage = await httpClient.SendAsync(requestMessage); if (responseMessage.StatusCode == System.Net.HttpStatusCode.OK) { string responseUuid = string.Empty; IEnumerable<string> values; if (responseMessage.Headers.TryGetValues("apns-id", out values)) { responseUuid = values.First(); } Console.WriteLine(string.Format("\n\r*******Send Success [{0}]", responseUuid)); } else { var body = await responseMessage.Content.ReadAsStringAsync(); var json = new JObject(); json = JObject.Parse(body); var reasonStr = json.Value<string>("reason"); Console.WriteLine("\n\r*******Failure reason => " + reasonStr); } Console.ReadKey(); } catch (Exception ex) { var info = ""; DumpAllInfoOfException(ex, ref info); Console.WriteLine("\n\r*******Exception message => " + ex.Message); Console.WriteLine(info); } }
下面这种方式是NODEJS+p8文件实现的
function Send_APNS(param_msg, param_device){ var apn = require('apn'); // Set up apn with the APNs Auth Key var apnProvider = new apn.Provider({ token: { key: 'apns.p8', // Path to the key p8 file keyId: 'xxx', // The Key ID of the p8 file (available at https://developer.apple.com/account/ios/certificate/key) teamId: 'xxxx', // The Team ID of your Apple Developer Account (available at https://developer.apple.com/account/#/membership/) }, production: false // Set to true if sending a notification to a production iOS app }); // Enter the device token from the Xcode console var deviceToken = param_device; // Prepare a new notification var notification = new apn.Notification(); // Specify your iOS app's Bundle ID (accessible within the project editor) notification.topic = 'nec.com.sg.BCMS'; // Set expiration to 1 hour from now (in case device is offline) notification.expiry = Math.floor(Date.now() / 1000) + 3600; // Set app badge indicator notification.badge = 3; // Play ping.aiff sound when the notification is received notification.sound = 'ping.aiff'; // Display the following message (the actual notification text, supports emoji) notification.alert = param_msg; // Send any extra payload data with the notification which will be accessible to your app in didReceiveRemoteNotification notification.payload = {id: 1}; // Actually send the notification apnProvider.send(notification, deviceToken).then(function(result) { // Check the result for any failed devices console.log(result); }); }
Iphone 消息通知(APNS)的3种方式 -- C# 和 nodejs的更多相关文章
- 聊聊业务系统中投递消息到mq的几种方式
背景 电商中有这样的一个场景: 下单成功之后送积分的操作,我们使用mq来实现 下单成功之后,投递一条消息到mq,积分系统消费消息,给用户增加积分 我们主要讨论一下,下单及投递消息到mq的操作,如何实现 ...
- 聊聊mq中消息消费的几种方式
mq系列文章 对mq了解不是很多的,可以看一下下面两篇文章: 聊聊mq的使用场景 聊聊业务系统中投递消息到mq的几种方式 聊聊消息消费的几种方式 如何确保消息至少消费一次 如何保证消息消费的幂等性 本 ...
- 源码详解openfire保存消息记录_修改服务端方式
实现openfire消息记录通常有两种方式,修改服务端和添加消息记录插件. 今天,简单的说明一下修改服务端方式实现消息记录保存功能. 实现思路 修改前: 默认的,openfire只提供保存离线记录至o ...
- WINDOWS硬件通知应用程序的常方法(五种方式:异步过程调用APC,事件方式VxD,消息方式,异步I/O方式,事件方式WDM)
摘要:在目前流行的Windows操作系统中,设备驱动程序是操纵硬件的最底层软件接口.为了共享在设备驱动程序设计过程中的经验,给出设备驱动程序通知应用程序的5种方法,详细说明每种方法的原理和实现过程,并 ...
- RocketMQ(6)---发送普通消息(三种方式)
发送普通消息(三种方式) RocketMQ 发送普通消息有三种实现方式:可靠同步发送.可靠异步发送.单向(Oneway)发送. 注意 :顺序消息只支持可靠同步发送. GitHub地址: https:/ ...
- 横竖屏事件响应(viewWillLayoutSubviews和通知)两种方式
转载:http://blog.csdn.net/nogodoss/article/details/17246489 最近搞横竖屏,获得一些心得,特记录下来. 做横竖屏最重要的是确定横竖屏响应的接口.目 ...
- ActiveMQ持久化消息的三种方式
详见:http://blog.yemou.net/article/query/info/tytfjhfascvhzxcyt362 本文只介绍三种方式,分别是持久化为文件,MYSql,Oracle.下面 ...
- Kafka生产者发送消息的三种方式
Kafka是一种分布式的基于发布/订阅的消息系统,它的高吞吐量.灵活的offset是其它消息系统所没有的. Kafka发送消息主要有三种方式: 1.发送并忘记 2.同步发送 3.异步发送+回调函数 下 ...
- ios消息队列APNS实现和证书申请
iOS消息推送的工作机制可以简单的用下图来概括: Provider是指某个iPhone软件的Push服务器,APNS是Apple Push Notification Service的缩写,是苹果的服务 ...
随机推荐
- Hive压缩格式
TextFile Hive数据表的默认格式,存储方式:行存储. 可使用Gzip,Bzip2等压缩算法压缩,压缩后的文件不支持split 但在反序列化过程中,必须逐个字符判断是不是分隔符和行结束符,因此 ...
- MR案例:多文件输出MultipleOutputs
问题描述:现有 ip-to-hosts.txt 数据文件,文件中每行数据有两个字段:分别是ip地址和该ip地址对应的国家,以'\t'分隔.要求汇总不同国家的IP数,并以国家名为文件名将其输出.解读:M ...
- 【前端】强大的javascript原生选择器querySelector 和 querySelectorAll
querySelector 和 querySelectorAll 在传统的 JavaScript 开发中,查找 DOM 往往是开发人员遇到的第一个头疼的问题,原生的 JavaScript 所提供的 D ...
- java类库字符串操作
在java类库中,java给我们提供了字符串几个特别的操作,分别是String,Stringbuffer,Stringbuilder等.下面就对这几个类做一个简单的介绍.首先,我们先了解一下Strin ...
- linux 忘记登陆密码
声明:如果不是远程登陆,机器在自己身边还有救. 第一步:重启机器,进入brug界面(grub是一个引导管理程序,可以引导linux.winxp等系统,在/boot/grub/中的menu.lst中进行 ...
- String被设计成不可变和不能被继承的原因
String是所有语言中最常用的一个类.我们知道在Java中,String是不可变的.final的.Java在运行时也保存了一个字符串池(String pool),这使得String成为了一个特别的类 ...
- Dokcer ELK
使用 docker 搭建 ELK 非常简单 docker run --name myes -d -p 9200:9200 -p 9300:9300 elasticsearch:2.4.4 运行 ...
- Mac 升级node与npm
第一步,先查看本机node.js版本: node -v 第二步,清除node.js的cache: sudo npm cache clean -f 第三步,安装 n 工具,这个工具是专门用来管理node ...
- java23种设计模式之二: 单例设计模式(6种写法)
目的:在某些业务场景中,我们需要某个类的实例对象的只能有一个,因此我们需要创建一些单例对象. 本文共有6种写法,仅供参考 1.饿汉式 优点: 在多线程情况下,该方法创建的单例是线程安全的(立即加载) ...
- Linux安装ipvsadm
一.介绍 ipvs称之为IP虚拟服务器(IP Virtual Server,简写为IPVS).是运行在LVS下的提供负载平衡功能的一种技术 二.安装 1.下载 http://www.linuxvirt ...