听起来 XMPP 符合您的要求。它肯定会允许某人使用他们的 Google Talk 帐户或任何其他 XMPP 帐户(例如jabber.org),只要您的“通知”的大小和频率合理(毕竟这些是免费服务!)。
您应该能够使用现有的库来完成这项工作。这篇文章将讨论基本 XMPP 级别的内容,但许多库将提供更高级别的 API 来执行此处描述的操作。
关于如何实现您想要的各种事情的一些注意事项:
与 XMPP 帐户的每个连接都分配有一个称为“资源”的唯一标识符。在 XMPP 中,像这样的简单地址user@gmail.com
称为“裸 JID”。user@gmail.com/your-app829abc
您还可以通过包含资源(“完整 JID”)发送到特定连接。由于资源来来去去,并且可能会有所不同(例如,Google 将它们半随机化),因此存在用于广播资源的可用性和不可用性。
桌面客户端需要发送出席信息,以便移动客户端可以在线看到。它还应该在其存在中包含“-1”的优先级,以防止它从用户的联系人接收正常的聊天消息。它还应该包括功能或类似的识别信息,以便移动客户端可以通过用户帐户在线识别它,而不是其他应用程序,例如 IM 客户端。
需要注意的一件事,可能是也可能不是您想要的,桌面客户端无法离线显示。它显然需要发送出席信息,以便移动客户端可以找到它,但用户的联系人也会在线看到它(即使用户没有登录到他们的 IM 客户端)。但是,负优先级将阻止它接收 IM 消息。
<!-- Desktop sends: -->
<presence>
<priority>-1</priority>
<your-app xmlns="http://example.com/your-app" type="desktop" />
</presence>
所以现在从移动客户端的角度来看......它需要简单地连接到同一个帐户,并发送类似的存在。在发送自己的状态后,它将自动接收来自联系人的状态以及与同一帐户的其他连接,包括桌面客户端的连接。
<!-- Mobile sends: -->
<presence>
<priority>-1</priority>
<your-app xmlns="http://example.com/your-app" type="mobile" />
</presence>
<!-- Mobile receives (among other things): -->
<presence from="user@gmail.com/foo38Bc21e">
<priority>-1</priority>
<your-app xmlns="http://example.com/your-app" type="desktop" />
</presence>
现在您有了桌面客户端的完整 JID。
它可以将正常的XMPP 消息直接发送到桌面客户端的完整 JID,如存在数据包的“发件人”中所示。在 XMPP IM 消息中,使用消息中的<body>
元素来传达文本,但是您可以省略<body>
标签并插入您自己的 XML 数据:
<!-- Mobile sends: -->
<message to="user@gmail.com/foo38Bc21e">
<your-notification xmlns="http://example.com/your-app">
<any-xml-here/>
</your-notification>
</message>
您几乎可以立即在桌面上收到此消息(最大的延迟通常在您的移动网络中)。对于移动设备上的 XMPP,还可以查看XEP-0286:移动设备上的 XMPP。