在开发自己的苹果推送服务时候,要合理的控制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

贴下PushSharp中连接feedback的代码

  1. /// <summary>
  2. /// FeedbackService
  3. /// </summary>
  4. public class FeedbackService
  5. {
  6. public FeedbackService(ApnsConfiguration configuration)
  7. {
  8. Configuration = configuration;
  9. }
  10.  
  11. public ApnsConfiguration Configuration { get; private set; }
  12.  
  13. public delegate void FeedbackReceivedDelegate(string deviceToken, DateTime timestamp);
  14. public event FeedbackReceivedDelegate FeedbackReceived;
  15.  
  16. public void Check()
  17. {
  18. var encoding = Encoding.ASCII;
  19.  
  20. var certificate = Configuration.Certificate;
  21.  
  22. var certificates = new X509CertificateCollection();
  23. certificates.Add(certificate);
  24.  
  25. var client = new TcpClient(Configuration.FeedbackHost, Configuration.FeedbackPort);
  26.  
  27. var stream = new SslStream(client.GetStream(), true,
  28. (sender, cert, chain, sslErrs) => { return true; },
  29. (sender, targetHost, localCerts, remoteCert, acceptableIssuers) => { return certificate; });
  30.  
  31. stream.AuthenticateAsClient(Configuration.FeedbackHost, certificates, System.Security.Authentication.SslProtocols.Tls, false);
  32.  
  33. //Set up
  34. ];
  35. ;
  36. var data = new List<byte>();
  37.  
  38. //Get the first feedback
  39. recd = stream.Read(buffer, , buffer.Length);
  40.  
  41. //Continue while we have results and are not disposing
  42. )
  43. {
  44. // Add the received data to a list buffer to work with (easier to manipulate)
  45. ; i < recd; i++)
  46. data.Add(buffer[i]);
  47.  
  48. //Process each complete notification "packet" available in the buffer
  49. + + )) // Minimum size for a valid packet
  50. {
  51. , ).ToArray();
  52. , ).ToArray();
  53.  
  54. // Get our seconds since epoch
  55. // Check endianness and reverse if needed
  56. if (BitConverter.IsLittleEndian)
  57. Array.Reverse(secondsBuffer);
  58. );
  59.  
  60. //Add seconds since 1970 to that date, in UTC
  61. , , , , , , DateTimeKind.Utc).AddSeconds(seconds);
  62.  
  63. //flag to allow feedback times in UTC or local, but default is local
  64. if (!Configuration.FeedbackTimeIsUTC)
  65. timestamp = timestamp.ToLocalTime();
  66.  
  67. if (BitConverter.IsLittleEndian)
  68. Array.Reverse(tokenLengthBuffer);
  69. );
  70.  
  71. + + tokenLength)
  72. {
  73.  
  74. , tokenLength).ToArray();
  75. // Strings shouldn't care about endian-ness... this shouldn't be reversed
  76. //if (BitConverter.IsLittleEndian)
  77. // Array.Reverse (tokenBuffer);
  78. var token = BitConverter.ToString(tokenBuffer).Replace("-", "").ToLower().Trim();
  79.  
  80. // Remove what we parsed from the buffer
  81. data.RemoveRange(, + + tokenLength);
  82.  
  83. // Raise the event to the consumer
  84. var evt = FeedbackReceived;
  85. if (evt != null)
  86. evt(token, timestamp);
  87. }
  88. else
  89. {
  90. continue;
  91. }
  92.  
  93. }
  94.  
  95. //Read the next feedback
  96. recd = stream.Read(buffer, , buffer.Length);
  97. }
  98.  
  99. try
  100. {
  101. stream.Close();
  102. stream.Dispose();
  103. }
  104. catch { }
  105.  
  106. try
  107. {
  108. client.Client.Shutdown(SocketShutdown.Both);
  109. client.Client.Dispose();
  110. }
  111. catch { }
  112.  
  113. try { client.Close(); }
  114. catch { }
  115. }
  116. }

下面是处理逻辑:

  1. /// <summary>
  2. /// 处理失效的Token逻辑信息
  3. /// </summary>
  4. public class TokenProvider
  5. {
  6. private FeedbackService fs = null;
  7. ;
  8. private string CID;
  9.  
  10. public TokenProvider(ApnsConfiguration cf, string CID)
  11. {
  12. this.fs = fs = new FeedbackService(cf);
  13. this.CID = CID;
  14. try
  15. {
  16. int hour = int.Parse(ConfigurationManager.AppSettings["ManagerTokenHour"]);//Token的控制时间
  17. }
  18. ; }
  19. }
  20.  
  21. /// <summary>
  22. /// 开启处理失效的Token逻辑信息
  23. /// </summary>
  24. /// <param name="cf"></param>
  25. public void Init()
  26. {
  27. try
  28. {
  29. Thread thsub = new Thread(new ThreadStart(() =>
  30. {
  31. while (true)
  32. {
  33. try
  34. {
  35. fs.Check();
  36. }
  37. catch (Exception ex)
  38. {
  39. LogInfoProvider.config.Logs.Add(new LogClass() { LogStr = " fs.Check() Error! CID=" + CID, ExInfo = ex });
  40. }
  41. Thread.Sleep(hour * * * );
  42. }
  43. }));
  44. fs.FeedbackReceived += fs_FeedbackReceived;
  45. thsub.Start();
  46. LogInfoProvider.config.Logs.Add(new LogClass() { LogStr = "Open TokenProvider! CID=" + CID });
  47. }
  48. catch (Exception ex)
  49. { LogInfoProvider.config.Logs.Add(new LogClass() { LogStr = " Open TokenProvider Error! CID=" + CID, ExInfo = ex }); }
  50. }
  51.  
  52. /// <summary>
  53. /// 处理失效的Token信息
  54. /// </summary>
  55. /// <param name="deviceToken"></param>
  56. /// <param name="timestamp"></param>
  57. private void fs_FeedbackReceived(string deviceToken, DateTime timestamp)
  58. {
  59. try
  60. {
  61. p_DeleteToken p = new p_DeleteToken(deviceToken);
  62. if (p.ExecutionDelete()) {
  63. LogInfoProvider.config.Logs.Add(new LogClass() { LogStr = "Delete lose token success >> " + deviceToken });
  64. } else {
  65. LogInfoProvider.config.Logs.Add(new LogClass() { LogStr = "Delete lose token error >> " + deviceToken, ExInfo = null });
  66. };
  67. }
  68. catch (Exception ex)
  69. {
  70. LogInfoProvider.config.Logs.Add(new LogClass() { LogStr = "fs_FeedbackReceived Error! CID=" + CID, ExInfo = ex });
  71. }
  72. }
  73. }

从苹果apns的feedback服务器获取推送失败的token的更多相关文章

  1. javascript跨域传递消息 / 服务器实时推送总结

    参考文档,下面有转载[非常好的两篇文章]: http://www.cnblogs.com/loveis715/p/4592246.html [跨源的各种方法总结] http://kb.cnblogs. ...

  2. iOS,APP退到后台,获取推送成功的内容并且语音播报内容。

    老铁,我今天忙了一下午就为解决这个问题,网上有一些方法,说了一堆关于这个挂到后台收到推送并且获得推送内容的问题,有很多人都说APP挂到后台一会就被杀死.但实际上可以有办法解决的. WechatIMG3 ...

  3. php 微信客服信息推送失败 微信重复推送客服消息 40001 45047

    /*** * 微信客服发送信息 * 微信客服信息推送失败 微信重复推送客服消息 40001 45047 * 递归提交到微信 直到提交成功 * @param $openid * @param int $ ...

  4. SignalR SelfHost实时消息,集成到web中,实现服务器消息推送

    先前用过两次SignalR,但是中途有段时间没弄了,今天重新弄,发现已经忘得差不多了,做个笔记! 首先创建一个控制台项目Nuget添加引用联机搜索:Microsoft.AspNet.SignalR.S ...

  5. IOS 在不打开电话服务的时候,可以响应服务器的推送消息,从而接收服务器的推送消息

    在做即时通讯(基于xmpp框架)的时候遇到这样一个问题,就是在真机测试的时候,你按Home键返回桌面,在你返回桌面的时候,这是你的程序的挂起状态的,在你挂起的时候, 相当于你的程序是死的,程序的所有进 ...

  6. 利用nginx_push_stream_module实现服务器消息推送

    NGiNX_HTTP_Push_Module 是一个 Nginx 的扩展模块,它实现了 HTTP Push 和Comet server的功能.HTTP Push 被经常用在网页上主动推的技术,例如一些 ...

  7. [Apple开发者帐户帮助]六、配置应用服务(5.3)推送通知(APN):从您的Web服务器发送推送通知

    要使用APN从Web服务器向macOS用户发送推送通知,请注册网站推送标识符并创建网站推送证书. 对于每个网站,请注册一个网站推送标识符,用于验证通知是否来自您的服务器.然后创建一个网站推送证书以签署 ...

  8. html5:服务器事件推送(server-sent events)Asp.net

    支持 不支持IE 个人理解说明 个人理解:这种消息推送方式不太推广,原因有以下三点~~~`我怎么老是学这些自己认为不会推广的东西呢~汗 在.net中,framework4.5以上就可以由SignalR ...

  9. HTML5服务器消息推送(java版)

    前端代码(html5.html): <html> <meta http-equiv="Content-Type" content="text/html; ...

随机推荐

  1. ASP.NET 回调技术(CallBack)

    在asp.net中客户端与服务器端的交互默认都是整页面提交, 此时客户端将当前页面表单中的数据(包括一些自动生成的隐藏域)都提交到服务器端,服务器重新实例化一个当前页面类的实例响应这个请求,然后将整个 ...

  2. [JWT] AngularJS Authentication with JWT

    Set up server for JWT Authentication 1. require express 2. require faker: If faker is not install ye ...

  3. jQuery的ajax 方法提交多个对象数组问题 C# traditional $.param

    当用$.ajax()向后台提交参数时,如果参数中数组的话一般在后台会用List<T>接收;但老是不成功如下面代码 "}]; "}]; function addUser( ...

  4. CSS基础(七):z-index详解

    概念 z-index 属性设置元素的堆叠顺序.拥有更高堆叠顺序的元素总是会处于堆叠顺序较低的元素的前面. 层级关系的比较 1. 对于同级元素,默认(或position:static)情况下文档流后面的 ...

  5. EETOP中关于Gm仿真的一些帖子的总结

    1. cadence画gm曲线 电路里,要把漏的电源dc值设置成变量,比如叫vds,计算器,info标签,点op,然后点管子,在op窗口点list,选gm,然后把这个公式弄到ADE的outputs那里 ...

  6. tmux protocol version mismatch (client 7, server 6)

    $ tmux attach protocol version mismatch (client 7, server 6) $ pgrep tmux 3429 $ /proc/3429/exe atta ...

  7. [Z] 计算机类会议期刊根据引用数排名

    一位cornell的教授做的计算机类期刊会议依据Microsoft Research引用数的排名 link:http://www.cs.cornell.edu/andru/csconf.html Th ...

  8. Timeout 时间已到。在操作完成之前超时时间已过或服务器未响应。

    近来遇到这样一个错误:Timeout 时间已到.在操作完成之前超时时间已过或服务器未响应.错误截图如下: 错误原因分析:产生错误时我执行的操作需要的执行时间比较长.我测试了一下,那个操作用到的存储过程 ...

  9. 正向代理VS反向代理 总结

    1.访问方向 正向代理:通常是从内部访问外部的网站或服务器,但又无法直接访问到外部的网站,而这个代理是可以访问到外部网站的.如果在中国境内通过代理访问Facebook.Twitter等网站 反向代理: ...

  10. web通过ActiveX打印

    最近做了一个activex控件,可以通过html页面动态设置报表文件的数据,控件里的报表是通过FastReport实现了,可以通过FastReport先把报表设置好.欢迎大家提意见 控件及Demo下载