【问题标题】:Setting up Android C2DM App Server设置 Android C2DM 应用服务器
【发布时间】:2012-10-20 09:34:39
【问题描述】:

我已经构建了一个与远程(免费)服务器通信的 android 应用程序 [一个知识交流论坛,灵感来自 stackoverflow :) ]。截至目前,应用程序根据用户需求获取/刷新内容。

我想实现推送通知,以便在有人发布他/她的问题的答案时通知用户。我听说 C2DM 是一个很好的 Android 设备推送通知服务。我也许可以处理的客户端代码,它是让我完全困惑的服务器端编程。我什至不知道从哪里开始。

列出的服务器功能包括 CGI、PHP、ASP.NET、SSI、FrontPage Extensions、Perl 和 Python。我目前正在使用 PHP 脚本在 MySQL 数据库上运行 SQL 查询并将数据传输到客户端(android 设备)。我必须使用服务器的哪些功能来实施 C2DM?在给定的能力下是否可行?

推送通知将大大增强我的应用程序的功能和可用性。我请求您提供有关设置服务器的指导。

提前感谢您的回复。

编辑:我注意到的一个区别是,当我使用 WEB 服务器时,http://code.google.com/android/c2dm/ 经常引用第 3 方 APPLICATION 服务器。想法?

【问题讨论】:

    标签: android android-c2dm


    【解决方案1】:

    我通过 Python Google App Engine 使用 c2dm 推送消息。您将需要 oauth 将您的 c2dm 凭据验证为令牌,然后只需 http get 即可将 c2dm 消息实际触发到 c2dm 服务器...

    这会将您的凭据转换为您可以使用的密钥:

    def get_auth_key():
     mk = __name__+".authkey"
     form_fields = {
            "accountType": "HOSTED",
            "Email": constants.c2dm_email,
            "Passwd": constants.c2dm_pwd,
            "service":constants.c2dm_service, ## ( c2dm_service = "ac2dm" )
            "source": constants.c2dm_source,
        }
      form_data = urllib.urlencode(form_fields)
      result = urlfetch.fetch(url=constants.client_auth_url,
                                payload=form_data,
                                method=urlfetch.POST,
                                headers={'Content-Type': 'application/x-www-form-urlencoded'})
    
      d = dict()
      fields=result.content.split("\n")
      for r in fields:
            if "=" in r:
                (k,v)=r.split("=")
                d[k]=v
                logging.debug(result)           
    
      logging.debug("Not in memcache :-(" )
      auth = d["Auth"]
      logging.debug("Now got key %s " % auth)
      memcache.set(mk,auth)
      return auth
    

    然后只需将它与从 Android 客户端注册中获得的 c2dm 密钥一起使用,一切都会好起来的......(请原谅应用引擎日志记录/内存缓存的东西)。

    【讨论】:

    • 在 Google App Engine 上运行的应用程序与我的数据库的接口究竟如何?应用程序是否不需要知道内容何时发布到数据库,以便广播通知?
    • 您可以使用任何连接互联网的服务器...只是我的选择是 GAE。只要您的服务器可以在注册时从 Android 客户端接收传入的 c2dm 密钥并执行某种形式的 oauth,那么您就可以开始了……我只是在将用户名+密码凭据转换为合适的密钥时遇到了“问题”用于针对 C2DM 推送服务器。这有意义吗/
    • 我只是在这个例子中使用了 GAE,但是任何连接互联网的服务器都可以。您只需要它 (1) 从 android 客户端接收 c2dm 注册密钥并 (2) 将您拥有的 c2dm 凭据转换为密钥,然后 (3) 使用 (1)+(2) 向该客户端发送消息.这有帮助吗?
    • 当设备(客户端)注册 C2DM(它的注册 ID 发送到我的数据库)时,是否也可以发送一些其他数据?就像登录我的应用程序的用户的用户名...
    • 是的,这正是您需要做的,这样您就可以将您的内部 ID 与将用于向该客户发送消息的“密钥”相关联。
    【解决方案2】:

    我们已经完全在 java 中实现了 C2DM 推送通知功能。为了拥有完整的推送生态系统,我们做了以下操作

    1. 在客户端更改代码以获取注册密钥。

    2. 提供一项服务,Android 客户端应用程序可以使用该服务将设备注册密钥发送到我们的内部服务器。我们在 tomcat 上部署了一个简单的 web 服务,它将注册密钥作为 post 参数。然后持久化在 MySQL 数据库中。

    3. 为了发送推送消息,我们创建了一个独立的 Java 应用程序,它从 MySQL 读取注册密钥,然后向 Google c2dm 服务器发出 HTTP 发布请求。我们的应用程序是多线程的,因此它可以同时向 Google 服务器发出多个 POST 请求。

    另外,您还可以查看城市航空船等产品。

    【讨论】:

    • 1.明白了。 2. Web 服务可以是 PHP 脚本,对吗?应用程序发布到哪个? 3.不幸的是,就在我头上:(你能详细说明一下吗?Java应用程序应该在哪里运行?我们使用的服务器是免费的,只为我们提供cPanelX作为控制我们活动的接口。我究竟如何实现的功能Java 应用程序?
    • 2.只要您可以捕获和存储注册令牌,Web 服务可以是任何语言。 3. java 应用程序将在您的托管环境中运行。在我们的例子中,我们在 Linux 机器上部署了 java 应用程序。我们编写了一个 shell 脚本来启动我们的应用程序。然后我们安排我们的 shell 脚本每 30 分钟启动一次。您的 java 应用程序基本上会做两件事 1. 读取存储在 mysql 中的所有注册密钥。 2. 使用密钥和消息文本向 google 服务器发出 http post 请求。 vogella.de/articles/AndroidCloudToDeviceMessaging/article.html
    • 哦,等一下 - 我可以使用 Cron 作业安排一个脚本每(比如说)15 分钟运行一次,它会检查数据库中的注册密钥并将相关数据发送给预期的收件人吗?我认为服务器不允许我运行 Java 代码,但我可以正确使用任何其他语言(PHP/Perl/Python)?
    • 你可以使用任何你喜欢的语言,最重要的是用这里定义的所有数据元素向谷歌服务器发出http post请求code.google.com/android/c2dm/#push
    • 谢谢,这很有帮助:)
    【解决方案3】:

    与推送服务器建立低级套接字连接非常重要。使用 PHP 和 mySQL 很容易导致性能问题和重叠推送请求。应避免每 x 分钟执行一次 Cron 作业和启动 shell 脚本。

    还有一些托管解决方案可以直接设置您,而无需为服务器端实现而烦恼,例如:www.urbainairship.com 和 XS2 推送服务器 http://xs2technology.wordpress.com/2012/05/06/xs2-push-notification-platform_a-hosted-solution/

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多