APNS IOS 消息推送处理失效的Token
在开发苹果推送服务时候,要合理的控制ios设备的Token,而这个Token是由苹果服务器Apns产生的,就是每次app问Apns要Token,由苹果服务器产生的Token会记录到Apns里面,我们需要根据该Token进行制定设备的消息推送,所有Token需要我们自己去记录和管理,每个设备对应唯一的Token,而app的用户登录会有自己约束的别名,与该tokne进行关系绑定,这样按该别名进行推送,就可以找到对应的Token,进而推送到该iso设备上,对应失效的Token我们需要访问苹果的feedbackServer,拿取失效的Token,然后把本地记录的失效token进行移除。
注意事项:
1.建议和feedback服务器建立长连接,连接过于频繁有可能被当做攻击(简简单单的做一些测试时没有关系的);所有在实际开发完成后,我们基本上可以半天与feedback服务器建立一次socket连接,拿取失效的token,
2.获取的token是在上次你给你的应用发推送失败时加feedback服务的,里面会返回失败的具体时间.
3.返回的数据由三部分组成,请看下面的图:
构中包含三个部分,第一部分是一个上次发推送失败的时间戳,第二个部分是device_token的长度,第三部分就是失效的device_token
- /// <summary>
- /// FeedbackService
- /// </summary>
- public class FeedbackService
- {
- public FeedbackService(ApnsConfiguration configuration)
- {
- Configuration = configuration;
- }
- public ApnsConfiguration Configuration { get; private set; }
- public delegate void FeedbackReceivedDelegate(string deviceToken, DateTime timestamp);
- public event FeedbackReceivedDelegate FeedbackReceived;
- public void Check()
- {
- var encoding = Encoding.ASCII;
- var certificate = Configuration.Certificate;
- var certificates = new X509CertificateCollection();
- certificates.Add(certificate);
- var client = new TcpClient(Configuration.FeedbackHost, Configuration.FeedbackPort);
- var stream = new SslStream(client.GetStream(), true,
- (sender, cert, chain, sslErrs) => { return true; },
- (sender, targetHost, localCerts, remoteCert, acceptableIssuers) => { return certificate; });
- stream.AuthenticateAsClient(Configuration.FeedbackHost, certificates, System.Security.Authentication.SslProtocols.Tls, false);
- //Set up
- byte[] buffer = new byte[];
- int recd = ;
- var data = new List<byte>();
- //Get the first feedback
- recd = stream.Read(buffer, , buffer.Length);
- //Continue while we have results and are not disposing
- while (recd > )
- {
- // Add the received data to a list buffer to work with (easier to manipulate)
- for (int i = ; i < recd; i++)
- data.Add(buffer[i]);
- //Process each complete notification "packet" available in the buffer
- while (data.Count >= ( + + )) // Minimum size for a valid packet
- {
- var secondsBuffer = data.GetRange(, ).ToArray();
- var tokenLengthBuffer = data.GetRange(, ).ToArray();
- // Get our seconds since epoch
- // Check endianness and reverse if needed
- if (BitConverter.IsLittleEndian)
- Array.Reverse(secondsBuffer);
- var seconds = BitConverter.ToInt32(secondsBuffer, );
- //Add seconds since 1970 to that date, in UTC
- var timestamp = new DateTime(, , , , , , DateTimeKind.Utc).AddSeconds(seconds);
- //flag to allow feedback times in UTC or local, but default is local
- if (!Configuration.FeedbackTimeIsUTC)
- timestamp = timestamp.ToLocalTime();
- if (BitConverter.IsLittleEndian)
- Array.Reverse(tokenLengthBuffer);
- var tokenLength = BitConverter.ToInt16(tokenLengthBuffer, );
- if (data.Count >= + + tokenLength)
- {
- var tokenBuffer = data.GetRange(, tokenLength).ToArray();
- // Strings shouldn't care about endian-ness... this shouldn't be reversed
- //if (BitConverter.IsLittleEndian)
- // Array.Reverse (tokenBuffer);
- var token = BitConverter.ToString(tokenBuffer).Replace("-", "").ToLower().Trim();
- // Remove what we parsed from the buffer
- data.RemoveRange(, + + tokenLength);
- // Raise the event to the consumer
- var evt = FeedbackReceived;
- if (evt != null)
- evt(token, timestamp);
- }
- else
- {
- continue;
- }
- }
- //Read the next feedback
- recd = stream.Read(buffer, , buffer.Length);
- }
- try
- {
- stream.Close();
- stream.Dispose();
- }
- catch { }
- try
- {
- client.Client.Shutdown(SocketShutdown.Both);
- client.Client.Dispose();
- }
- catch { }
- try { client.Close(); }
- catch { }
- }
- }
下面是处理逻辑:
- /// <summary>
- /// 处理失效的Token逻辑信息
- /// </summary>
- public class TokenProvider
- {
- private FeedbackService fs = null;
- private int hour = ;
- private string CID;
- public TokenProvider(ApnsConfiguration cf, string CID)
- {
- this.fs = fs = new FeedbackService(cf);
- this.CID = CID;
- try
- {
- int hour = int.Parse(ConfigurationManager.AppSettings["ManagerTokenHour"]);//Token的控制时间
- }
- catch { hour = ; }
- }
- /// <summary>
- /// 开启处理失效的Token逻辑信息
- /// </summary>
- /// <param name="cf"></param>
- public void Init()
- {
- try
- {
- Thread thsub = new Thread(new ThreadStart(() =>
- {
- while (true)
- {
- try
- {
- fs.Check();
- }
- catch (Exception ex)
- {
- LogInfoProvider.config.Logs.Add(new LogClass() { LogStr = " fs.Check() Error! CID=" + CID, ExInfo = ex });
- }
- Thread.Sleep(hour * * * );
- }
- }));
- fs.FeedbackReceived += fs_FeedbackReceived;
- thsub.Start();
- LogInfoProvider.config.Logs.Add(new LogClass() { LogStr = "Open TokenProvider! CID=" + CID });
- }
- catch (Exception ex)
- { LogInfoProvider.config.Logs.Add(new LogClass() { LogStr = " Open TokenProvider Error! CID=" + CID, ExInfo = ex }); }
- }
- /// <summary>
- /// 处理失效的Token信息
- /// </summary>
- /// <param name="deviceToken"></param>
- /// <param name="timestamp"></param>
- private void fs_FeedbackReceived(string deviceToken, DateTime timestamp)
- {
- try
- {
- p_DeleteToken p = new p_DeleteToken(deviceToken);
- if (p.ExecutionDelete()) {
- LogInfoProvider.config.Logs.Add(new LogClass() { LogStr = "Delete lose token success >> " + deviceToken });
- } else {
- LogInfoProvider.config.Logs.Add(new LogClass() { LogStr = "Delete lose token error >> " + deviceToken, ExInfo = null });
- };
- }
- catch (Exception ex)
- {
- LogInfoProvider.config.Logs.Add(new LogClass() { LogStr = "fs_FeedbackReceived Error! CID=" + CID, ExInfo = ex });
- }
- }
- }
APNS IOS 消息推送处理失效的Token的更多相关文章
- APNS IOS 消息推送
一.Apns简介: Apns是苹果推送通知服务. 二.原理: APNs会对用户进行物理连接认证,和设备令牌认证(简言之就是苹果的服务器检查设备里的证书以确定其为苹果设备):然后,将服务器的信息接收并且 ...
- APNS IOS 消息推送沙盒模式和发布模式
在做.NET向IOS设备的App进行消息推送时候,采用的是PushSharp开源类库进行消息的推送,而在开发过程中,采用的是测试版本的app,使用的是测试的p12证书采用的是ApnsConfigura ...
- APNS IOS 消息推送JSON格式介绍
在开发向苹果Apns推送消息服务功能,我们需要根据Apns接受的数据格式进行推送.下面积累了我在进行apns推送时候总结的 apns服务接受的Json数据格式 示例 1: 以下负载包含哦一个简单的 a ...
- iOS 消息推送(APNs) 傻瓜式教程
也可以去我的简书页面查看这篇文章 首先: 1.做iOS消息推送需要真机测试 2.做iOS消息推送需要有付费的开发者账号 是否继续看帖? 先学习一下相关的知识吧! 因为中途可能会遇到一些问题,这篇文章或 ...
- Ios 消息推送
手把手教你做iOS推送 http://www.cocoachina.com/industry/20130321/5862.html http://www.cnblogs.com/cdts_change ...
- .NET向APNS苹果消息推送通知
一.Apns简介: Apns是苹果推送通知服务. 二.原理: APNs会对用户进行物理连接认证,和设备令牌认证(简言之就是苹果的服务器检查设备里的证书以确定其为苹果设备):然后,将服务器的信息接收并且 ...
- ios 消息推送流程 转载
iOS开发:推送通知简述及开发实践热度 1已有 706 次阅读 2013-10-15 09:23 |个人分类:经验之谈|系统分类:ios| IOS, 推送一.关于推送通知 推送通知,也被叫做远程通知, ...
- (转)iOS消息推送机制的实现
原:http://www.cnblogs.com/qq78292959/archive/2012/07/16/2593651.html iOS消息推送机制的实现 iOS消息推送的工作机制可以简单的用下 ...
- 【iOS】iOS消息推送机制的实现
iOS消息推送的工作机制可以简单的用下图来概括: Provider是指某个iPhone软件的Push服务器,APNS是Apple Push Notification Service的缩写,是苹果的服务 ...
随机推荐
- 用yii2给app写接口(下)
上一节里我们讲了如何用Yii2搭建一个能够给App提供数据的API后台应用程序.那么今天我们就来探讨下授权认证和通过API接口向服务器提交数据以及如何控制API接口返回那些数据,不能返回那些数据. 授 ...
- Opencv 330 如何進行圖像的旋轉?
//圖像旋轉 cv::Mat Transformation(cv::Mat src,int angle) { cv::Mat dst = src.clone(); //中心点 cv::Point ce ...
- javascript正则表达式的一些笔记
正则表达式:Regular Expression.使用单个字符串来描述,匹配一系列符合某个句法规则的字符串.即按照某种规则去匹配符合条件的字符串.正则表达式就是规则. \b 单词边界 regexp对象 ...
- python模拟登录浙江大学彩云库
前言: 群里一位朋友叫我帮他写 一个模拟登录的. 代码: import requests import time url="http://yk3.gokuai.com/web/index&q ...
- git 命令和使用场景总结
资料地址:https://www.liaoxuefeng.com/wiki/0013739516305929606dd18361248578c67b8067c8c017b000 http://w ...
- Git 用户名和邮箱
用户名邮箱的作用 用户名和邮箱地址是本地git客户端的一个变量,不随git库而改变. 每次commit都会用用户名和邮箱纪录. github的contributions统计就是按邮箱来统计的. 查看用 ...
- iOS 开发之内存泄漏问题
关于内存泄漏问题,一般情况下就是控制器或者视图没有正常的释放引起的,我们通常可以通过dealloc方法来检查一个控制器或者视图是否释放. 对于一个控制器或者视图没有释放,其实也就是还有强引用引用着这个 ...
- mysql数据库基本使用(增删改查)
数据库db,database 数据库:依照某种数据模型进行组织并存放到存储器的数据集合dbms,database management system 数据库管理系统:用来操作和管理数据库的大型服务软件 ...
- 吐槽版︱MRO-Microsoft R Open快捷键+界面识别+功能设置
下载了之后,发现连运行(RUN键)在哪都不知道,蒙逼的在哪倒弄半天,都执行不了...问了别人,都说"ctrl+enter",但是我的电脑执行不了,于是今天就狠狠的一个一个按钮的点一 ...
- [javascript]一段焦点图的js代码
<html> <head> <meta name="name" content="content"charset="ut ...