Android设备推送通知的替代方案是什么?

4

目前,在安卓操作系统上推送通知到安卓应用程序时,似乎需要将应用程序集成Google Cloud Messaging (GCM) API。应用服务器当前通过GCM推送数据,而GCM会将数据推送到特定设备。

这是一个愚蠢的问题,但我想知道是否可以替换GCM?换句话说,是否可能有一种替代服务器而不是GCM?动机是隐藏数据不被GCM服务器获取。

之前: 应用服务器 ==> GCM ==> 安卓应用

现在: 应用服务器 ==> 自定义云消息 ==> 安卓应用


1
您可以随意集成自己的“长轮询”机制,例如MQTT。如果您担心“隐藏数据不被GCM服务器发现”,您可以考虑对其进行加密。 - CommonsWare
感谢 @CommonsWare。如你所建议的,如果我决定集成自己的长轮询机制,那么所有这些逻辑都会在安卓应用内部以服务的形式发生,该服务将定期向应用服务器请求通知。我猜想使用服务的方式可以让应用即使在后台运行时也能执行一些代码。只是担心这样会消耗电池寿命... - code
1
“所有这些逻辑都将在Android应用程序内以服务的形式发生,该服务轮询应用服务器以获取通知吗?”--是的,或者是在单独的进程中运行的服务。“只是担心这会耗尽电池寿命”--一般来说,会有影响。让这些东西在最小化电池消耗的情况下工作是相当棘手的,因为您依赖于移动数据连接上的传入数据包来唤醒设备并使其处于活动状态。其他人已经做到了,所以显然是可行的。 - CommonsWare
谢谢,很高兴知道通过服务路线是可行的,即使最小化电池耗电量有些棘手。我认为采用GCM路线在电池耗电方面是最有效的。由于目标是隐藏数据,所以像你建议的加密有效载荷是最好的选择。 - code
如果需要一个现成的商业化独立MQTT推送通知服务的实现,请查看Pushy(https://pushy.me/),可以进行自主托管以满足数据安全和隐私要求。完全透明 - 我是Pushy的创始人。 - Elad Nava
3个回答

4
您可以使用应用程序指导的短信/端口指导的短信。
从服务器(SMS网关)向您的应用程序监听的特定端口发送短信。这个短信将作为GCM消息。
使用此方法,您不必担心长时间运行的服务会耗尽电池。此外,短信几乎是实时的,不需要互联网连接。
但有一些手机不支持端口指导的短信。
对于端口指导的短信,您需要注册广播接收器,类似以下内容:
<receiver
android:name = ".SmsReceiver">
<intent-filter>
    <action android:name="android.intent.action.DATA_SMS_RECEIVED" />
    <data 
        android:scheme="sms"
        android:host="*"
        android:port="8095" />
    </intent-filter>

如果手机支持端口短信,那么定向的端口短信不会出现在用户的短信收件箱中。


感谢 @rupesh jain。有趣的解决方案!这是否意味着应用服务器基本上会根据电话号码向设备发送短信文本消息?这是否假定设备拥有电话线路(例如:Verizon)?消息会显示为手机上的短信吗?使用这种方法,我认为应用需要创建一个监听SMS端口并能够处理有效负载的服务。 - code
1
虽然短信路径有一些潜力,但实际上这是一种非常老派的做法。首先短信成本真的非常快速地累积。我之前在我的上一个公司试过,我们每个月的短信账单竟然高达 $10K。其次,你需要验证电话号码是否准确以及它们如何路由。每个运营商处理事情的方式都不同——无论是二进制短信还是GSM与CDMA之间存在一些限制。老实说,会遇到大量的麻烦。 - Shannph Wong

3
替换GCM并不是一件简单的任务。我强烈建议不要像之前提到的那样使用长轮询机制——事实上,这样做会非常耗费资源(电池寿命),而管理起来也会非常困难。你需要解决大量的错误情况,从网络断开到管理保证交付。
完全披露:我在Magnet Systems工作,该公司有一个产品——Magnet Message——提供了这些功能以及更多功能。
我们所做的是创建一个持久的与服务器的套接字(顺便说一下,这也是GCM和苹果的APNS所做的)。这个套接字用于向设备“推送”消息。通过理解套接字上的连接性,您将了解设备的存在,并知道是否可以向它们发送消息。
尽管如此,仍然很具有挑战性,例如向离线或终止的应用程序进行推送,并跨平台(可能不想忘记其他40%的iOS用户)——因此存在不同的挑战。为了解决这个问题,我们通过GCM发送一个“信号”来通知存在未处理的消息,并有一个广播接收器可以安全地获取消息。
由于我们允许您在自己的环境中部署我们的服务器代码,因此我们不必查看您发送的任何内容。(当然,我们也有SaaS模式)。
无论如何,您可以查看我们在http://developer.magnet.com所做的事情。它是免费的,可以使用并且我们有大量开源的东西。

我还没有尝试过,但可以检查一下Pushy。http://eladnava.com/pushy-a-new-alternative-to-google-cloud-messaging/ - sha
这很愚蠢,但我实际上无法尝试Magnet,因为页面无法向下滚动。无论我如何尝试滚动以尝试下载试用应用程序,页面都会跳回顶部。我的Chrome浏览器窗口不能比全高清更大,因此我根本无法到达页面的那个区域。我很困惑一个前端开发人员如何搞砸像滚动这样基础的东西。 - Paul Lammertsma

3
不建议绕过GCM,因为你可能使用的任何其他机制都需要一个持久连接从手机到你的服务器,这将消耗电池。GCM已经一直保持着一个连接,所以应尽可能地重复使用它。
然而,你想要隐藏数据不被GCM服务器发现是可以理解的。在这种情况下,应该简单地进行加密。Chrome团队(使用GCM)已经决定采取同样的方法(隐藏来自GCM服务器的有效负载),也许他们的加密方案对你也有用。你可以在https://groups.google.com/a/chromium.org/forum/#!searchin/blink-dev/Intent$20to$20Ship$3A$20Push$20Messaging$20Payloads/blink-dev/Vga32co0YMQ/4i6qXvfeAwAJ中看到他们的做法。
同样的链接包含了一个演示和相关的代码
请注意,这些示例的目的是在Chrome中实现,这并不完全符合你的需求。然而,实际的加密方法可以在Android中重复使用。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接