如何从 Google App Engine 推送 Android 应用程序中的事件流

Posted

技术标签:

【中文标题】如何从 Google App Engine 推送 Android 应用程序中的事件流【英文标题】:How to push stream of events in Android app from Google App Engine 【发布时间】:2014-07-22 13:30:07 【问题描述】:

我对 android 开发和 Google App 引擎的东西还很陌生。我仍在处理有关它的文档和教程。

我有一个 Android 游戏概念,基于 2 名玩家的回合制战斗,但回合非常短(

应用程序有没有办法警告客户其他玩家已经玩过,并做出相应的反应?由于是“小”计时器,因此预计不会在战斗期间离开应用程序。

到目前为止,我已经找到了 Channel API,但它不适用于 Android 客户端。

提前谢谢你!

【问题讨论】:

看看:developer.android.com/google/gcm/index.html 哦,所以它不仅限于通知。我会进一步研究那个。但是如果用户禁用了推送,为了节省电池寿命,它就不能再工作了,对吧? 其他问题:100 条正在进行的消息限制是每个设备还是整个应用程序?如果它是整个应用程序,它将无法很好地扩展。 【参考方案1】:

Google Cloud Messaging for Android 仅用于从服务器推送到 Android 客户端。 您将需要 Messages with payload 并在您的 Android 应用程序中处理它。

对于大量推送消息,您还应该考虑使用Socket API 保持专用实时连接

【讨论】:

好的,这就是这样做的方法。然而,我仍然想知道 100 条消息的限制:是每个设备还是整个 API 密钥?如果是每个 API 密钥,它看起来很小。 100 是设备不消费(离线)时可以存储在 GCM 中的消息的限制。当用户玩多人游戏时,情况不应该如此 GCM 索引页 (developer.android.com/google/gcm/index.html) 第一段说:“无论您的消息传递需求有多大,GCM 都是完全免费的,并且没有配额”【参考方案2】:

我个人建议使用 PubNub 库 http://www.pubnub.com/docs/java/android/android-sdk.html,它比 GCM 更强大。

当一个游戏由 x 个玩家创建时,每个玩家都会以编程方式订阅一个 pubnub 频道。

当玩家 X 在游戏中做某事时,该动作会立即发布到频道中,所有订阅该频道的玩家都会立即收到通知 (在代码中)该操作,因此您可以采用该指示并可见通知等待的玩家轮到她了。

这是在客户端使用 Pubnub id 库的 sn-p,以接收特定 chan 上的传入消息:

    public void Startpubnub(String channel) 
Toast.makeText(this, channelName+"TransportLine activated...", Toast.LENGTH_LONG).show();
Log.i("PUBNUB", channelName+"TransportLine activated...");
try 
    pubnub.subscribe(new String[] channel, new Callback() 
        public void connectCallback(String channel) 
            notifyUser("CONNECT on channel:" + channel);
        
        public void disconnectCallback(String channel) 
            notifyUser("DISCONNECT on channel:" + channel);
        
        public void reconnectCallback(String channel) 
            notifyUser("RECONNECT on channel:" + channel);
        
        @Override
        public void successCallback(String channel, Object message) 
            Log.i("tag","broadcast is sent!");
            notifyUser(channel + " " + message.toString());
            Log.i("afterBroadcastisSent", message.toString());
            try 
                Message m = Message.obtain();
                Bundle b = new Bundle();
                b.putString("message", message.toString());
                m.setData(b);
                mMessageHandler.sendMessage(m);
             catch (Exception e) 
                e.printStackTrace();
            
        
        @Override
        public void errorCallback(String channel, Object message) 
            notifyUser(channel + " " + message.toString());
        
    );
 catch (PubnubException e) 


然后在您的后端订阅该频道http://www.pubnub.com/docs/java/javase/javase-sdk.html, https://github.com/pubnub/python, 然后根据传入的 msg 将 msg 发布回 chan。

您甚至可以通过 PubNub 与 GCM 通信。

如果您计划支持设备,尤其是基于国际的设备,由于许可问题而没有安装 google play 服务,那么 PubNub 是终极的快速实时推送/拉取机制。 PubNub 本质上是上面@Ashish 描述的 Socket 通信,但在 Google 基础架构之外。

【讨论】:

以上是关于如何从 Google App Engine 推送 Android 应用程序中的事件流的主要内容,如果未能解决你的问题,请参考以下文章

是否可以在 Google App Engine 应用程序中实现 iPhone 推送通知?

用于开发 iPhone 推送通知服务的 Google App Engine 的 Java 替代方案是啥?

如何在 Google Cloud App Engine 上使用 PubSub 创建订阅者,该订阅者通过 Publisher 从 Google Cloud App Engine Flex 收听消息?

Google App Engine“解析./app.yaml时出错:未知的url处理程序类型”

如何从 Python 中的 App Engine 在 Google BigQuery 上创建架构?

app-engine iOS 推送通知异常:“指定的队列未知”