- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
我正在尝试连接到 Apple Push Notification Service,该服务使用基于受 TLS(或 SSL)保护的 TCP 的简单二进制协议(protocol)。该协议(protocol)表明,当遇到错误时(大约有 10 种明确定义的错误条件)APNS 将发回错误响应,然后关闭连接。这导致套接字半关闭,因为远程对等方关闭了套接字。我可以看到它正常关闭,因为 APNS 使用 tcpdump 发送 FIN 和 RST。
在所有错误情况中,我可以在发送前处理大部分错误并进行验证。失败的情况是当通知发送到无效的设备 token 时,由于 token 可能格式错误,因此无法轻松处理。 token 是不透明的 32 字节值,由 APNS 提供给设备,然后向我注册。我无法知道它在提交给我的服务时是否有效。据推测,APNS 以某种方式对 token 进行校验和,以便他们可以快速对 token 进行快速验证。
无论如何,
我做了我认为正确的事:-
a. open socket
b. try writing
c. if write failed, read the error response
不幸的是,这似乎不起作用。我认为 APNS 正在发送错误响应,但我没有正确读回它,或者我没有正确设置套接字。我尝试了以下技术:-
我已经在 Windows 上使用 C# + .NET 4.5 并在 Linux 上使用 Java 1.7 进行了尝试。在任何一种情况下,我似乎都没有收到错误响应,并且套接字指示没有数据可供读取。
这些操作系统和/或框架是否支持半封闭套接字?似乎没有任何迹象表明这两种方式。
我知道我设置的方式是正确的,因为如果我使用一个有效的 token 和一个有效的通知,那些就会被传送。
作为对其中一条评论的回应,我正在使用增强的通知格式,因此响应应该来自 APNS。
这是我的 C# 代码:-
X509Certificate certificate =
new X509Certificate(@"Foo.cer", "password");
X509CertificateCollection collection = new X509CertificateCollection();
collection.Add(certificate);
Socket socket =
new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
socket.Connect("gateway.sandbox.push.apple.com", 2195);
NetworkStream stream =
new NetworkStream(socket, System.IO.FileAccess.ReadWrite, false);
stream.ReadTimeout = 1000;
stream.WriteTimeout = 1000;
sslStream =
new SslStream(stream, true,
new RemoteCertificateValidationCallback(ValidateServerCertificate), null);
sslStream.AuthenticateAsClient("gateway.sandbox.push.apple.com", collection,
SslProtocols.Default, false);
sslStream.ReadTimeout = 10000;
sslStream.WriteTimeout = 1000;
// Task rdr = Task.Factory.StartNew(this.reader);
// rdr is used for parallel read of socket sleeping 5ms between each read.
// Not used now but another alternative that was tried.
Random r = new Random(DateTime.Now.Second);
byte[] buffer = new byte[32];
r.NextBytes(buffer);
byte[] resp = new byte[6];
String erroneousToken = toHex(buffer);
TimeSpan t = (DateTime.UtcNow - new DateTime(1970, 1, 1));
int timestamp = (int) t.TotalSeconds;
try
{
for (int i = 0; i < 1000; ++i)
{
// build the notification; format is published in APNS docs.
var not = new ApplicationNotificationBuilder().withToken(buffer).withPayload(
@'{"aps": {"alert":"foo","sound":"default","badge":1}}').withExpiration(
timestamp).withIdentifier(i+1).build();
sslStream.Write(buffer);
sslStream.Flush();
Console.Out.WriteLine("Sent message # " + i);
int rd = sslStream.Read(resp, 0, 6);
if (rd > 0)
{
Console.Out.WriteLine("Found response: " + rd);
break;
}
// doesn't really matter how fast or how slow we send
Thread.Sleep(500);
}
}
catch (Exception ex)
{
Console.Out.WriteLine("Failed to write ...");
int rd = sslStream.Read(resp, 0, 6);
if (rd > 0)
{
Console.Out.WriteLine("Found response: " + rd); ;
}
}
// rdr.Wait(); change to non-infinite timeout to allow error reader to terminate
最佳答案
我在 Java 中为 APNS 实现了服务器端,并且在可靠地读取错误响应时遇到了问题(意思是 - 永远不会错过任何错误响应),但我确实设法获得了错误响应。
可以看到这个related question , 尽管它没有足够的答案。
如果您从未设法读取错误响应,那么您的代码一定有问题。
如果你想保证错误响应的读取有效,你应该尝试在每次写入后读取,并有足够的超时时间。当然,这对于在生产中使用是不切实际的(因为它非常慢),但您可以使用它来验证您读取和解析错误响应的代码是否正确。您还可以使用它来遍历您拥有的所有设备 token ,并找到所有无效的设备 token ,以清理您的数据库。
您没有发布任何代码,所以我不知道您使用什么二进制格式向 APNS 发送消息。如果您使用的是简单格式(以 0 字节开头且没有消息 ID),您将不会收到来自 Apple 的任何响应。
关于sockets - 从半开套接字读取,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19988513/
我使用下拉菜单提供一些不同的链接,但我希望这些链接在同一选项卡中打开,而不是在新选项卡中打开。这是我找到的代码,但我对 Javascript 非常缺乏知识 var urlmenu = docume
我对 javascript 不太了解。但我需要一个垂直菜单上的下拉菜单,它是纯 JavaScript,所以我从 W3 复制/粘贴脚本:https://www.w3schools.com/howto/t
我已经坐了 4 个小时,试图让我的导航显示下 zipper 接垂直,但它继续水平显示它们。我无法弄清楚为什么会发生这种情况或如何解决它。 如果有人能告诉我我做错了什么,我将不胜感激。我有一个潜移默化的
我正在尝试创建选项卡式 Accordion 样式下拉菜单。我使用 jQuery 有一段时间了,但无法使事件状态达到 100%。 我很确定这是我搞砸的 JS。 $('.service-button').
对于那些从未访问过 Dropbox 的人,这里是链接 https://www.dropbox.com/ 查看“登录”的下拉菜单链接。我如何创建这样的下 zipper 接? 最佳答案 这是 fiddle
我正在制作一个 Liferay 主题,但我在尝试设计导航菜单的样式时遇到了很多麻烦。我已经为那些没有像这样下拉的人改变了导航链接上的经典主题悬停功能: .aui #navigation .nav li
如果您将鼠标悬停在 li 上,则会出现一个下拉菜单。如果您将指针向下移至悬停时出现的 ul,我希望链接仍然带有下划线,直到您将箭头从 ul 或链接移开。这样你就知道当菜单下拉时你悬停在哪个菜单上。 知
我有一个带有多个下拉菜单的导航栏。因此,当我单击第一个链接时,它会打开下拉菜单,但是当我单击第二个链接时,第一个下拉菜单不会关闭。 (所以如果用户点击第二个链接我想关闭下拉菜单) // main.js
我正在尝试制作一个导航下拉菜单(使用 Bootstrap 3),其中链接文本在同一行上有多个不同的对齐方式。 在下面的代码中,下拉列表 A 中的链接在 HTML 中有空格字符来对齐它们,但是空白被忽略
我希望有人能帮我解决这个 Bootstrap 问题,因为我很困惑。 有人要求我在底部垂直对齐图像和其中包含图像的链接。 我面临的问题是他们还希望链接在链接/图像组合上具有 pull-right,这会杀
我正在构建一个 Rails 应用程序,并希望指向我的类的每个实例的“显示”页面的链接显示在“索引”页面的下拉列表中。我目前正在使用带有 options_from_collection_for_sele
我有以下 Bootstrap3 导航菜单 ( fiddle here )。我想设置“突出显示”项及其子链接与下拉列表 1 和 2 链接不同的链接文本(和悬停)的样式。我还希望能够以不同于 Highli
我对导航栏中的下拉菜单有疑问。对于普通的导航链接(无下拉菜单),我将菜单文本放在 H3 中,但是当我尝试对下 zipper 接执行相同操作时,箭头不在标题旁边,而是在标题下方。我决定用 span 替换
我是一名优秀的程序员,十分优秀!