Iphone 消息通知(APNS)的3种方式 -- C# 和 nodejs
来源:互联网 发布:儿童 编程培训 编辑:程序博客网 时间:2024/04/30 17:17
发送 APNS 使用 p12 文件(C#)
// 发送 APNS 使用 p8 文件(c#)
下面这种方式是NODEJS+p8文件实现的
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 Keyvar apnProvider = new apn.Provider({ token: {key: 'apns.p8', // Path to the key p8 filekeyId: '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 consolevar deviceToken = param_device;// Prepare a new notificationvar 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 indicatornotification.badge = 3;// Play ping.aiff sound when the notification is receivednotification.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 didReceiveRemoteNotificationnotification.payload = {id: 1};// Actually send the notificationapnProvider.send(notification, deviceToken).then(function(result) { // Check the result for any failed devicesconsole.log(result);});}
阅读全文
1 0
- Iphone 消息通知(APNS)的3种方式 -- C# 和 nodejs
- APNs通知与应用内消息(推送通知和透传消息)的区别
- 消息通知的三种方式总结
- 设备接到APNS发来的通知处理方式
- 详解APNS苹果消息推送通知
- 【.NET向APNS苹果消息推送通知】
- iphone 消息通知
- iPhone消息通知
- iOS PAD编写 POPOver 使用tableviewcontroller的两种操作方式,代理和消息通知
- APNS推送通知的流程
- APNS推送通知的流程
- APNS推送通知的流程
- APNS推送通知的流程
- APNS推送通知的流程
- APNS推送通知的流程
- APNS推送通知的流程
- APNS推送通知的流程
- iPhone利用apns进行Push消息推送
- 第十七章 再论"没有银弹"
- MapReduce工作原理
- 玩下linux中的的poll函数------可以用任何描述符号fd而不限于网络socket
- HDU 1027 Ignatius and the Princess II(全排列)
- AOJ-problem-09
- Iphone 消息通知(APNS)的3种方式 -- C# 和 nodejs
- kubeadm 安装kubetnetes(flannel)
- html 标签与元素
- UVA 572 POJ 2386 连通块问题
- 多进程共享内存续篇-大锁
- 【修真院“纯洁”系列之十九】驱逐令
- 深入浅出谈接口(interface)和类间继承(extends)
- 【Linux命令】用 scp 命令在不同主机之间拷贝文件或目录
- 算法--查找