用于使用 Google Cloud 消息传递的 API 的数据结构

Posted

技术标签:

【中文标题】用于使用 Google Cloud 消息传递的 API 的数据结构【英文标题】:Data structure for an API to use Google Cloud messaging 【发布时间】:2014-04-19 12:14:01 【问题描述】:

我已经编写了一个基于 Slim php 网络的 API,该网络将被 Web(浏览器)和 android 客户端使用,我有一个关于为 Android 客户端实现推送通知的 Google Cloud Messaging 的问题。基本上,这是我目前的数据结构

users:
--Fields:
----id
----name
----email
----password

posts:
--Fields:
----id
----post_title
----post_category
----post_content
----image_url
----created_at

comments:
--Fields:
----id
----comment
----mood
----created_at

post_comments (which holds the relationship between the post and the comment):
--Fields:
----id
----post_id
----comment_id

user_comments (which holds the relationship between the user and the comment):
--Fields:
----id
----user_id
----comment_id

我想要做的是在发布表添加一行时向所有设备(满足某些要求)发送通知。我很确定我了解 PHP 的实际推送功能,但我不确定如何构造它来注册在 android 设备上运行的设备。我正在考虑向我的用户表中添加两个字段,如下所示:

----has_device
----device_registration_id

并让 android 设备在登录时发送 has_device=1 参数(而不是 web 客户端发送 has_device=0 表示 false)并检查该用户的 device_registration_id 字段是否为空,如果是则生成新的注册id 并填充该字段。我在正确的轨道上吗?

编辑:这将是我的 PHP 发送函数。

function sendNotification( $apiKey, $registrationIdsArray, $messageData )
   
    $headers = array("Content-Type:" . "application/json", "Authorization:" . "key=" . $apiKey);
    $data = array(
        'data' => $messageData,
        'registration_ids' => $registrationIdsArray
    );

    $ch = curl_init();

    curl_setopt( $ch, CURLOPT_HTTPHEADER, $headers ); 
    curl_setopt( $ch, CURLOPT_URL, "https://android.googleapis.com/gcm/send" );
    curl_setopt( $ch, CURLOPT_SSL_VERIFYHOST, 0 );
    curl_setopt( $ch, CURLOPT_SSL_VERIFYPEER, 0 );
    curl_setopt( $ch, CURLOPT_RETURNTRANSFER, true );
    curl_setopt( $ch, CURLOPT_POSTFIELDS, json_encode($data) );

    $response = curl_exec($ch);
    curl_close($ch);

    return $response;

【问题讨论】:

我只是想知道将这两个字段添加到 users 表是否就足够了,或者我是否需要一个单独的 gcm_users 表。我以前从未使用过 GCM,所以我不知道业务逻辑是如何工作的。 【参考方案1】:

添加这两个字段是不够的,因为注册 ID 与设备相关联,而不是与当前在该设备上登录的用户相关联。

如果用户在设备上注销而另一个用户登录,您建议的实施意味着两个用户在您的数据库中将具有相同的注册 ID,并且向所有设备发送通知会向该设备发送两个通知。

如果您从注销用户的行中清除注册 ID 列,则可以解决此问题。 如果您希望拥有 Adnroid 设备的用户占所有用户的一小部分,那么拥有一个单独的 gcm_users 表会更有意义。这样,您无需遍历更大的用户表即可将 GCM 消息发送到所有设备。

最后,这里有一些关于how to store a GCM registration ID into mysql的额外建议。

【讨论】:

问题是大多数用户都有安卓设备。这就是为什么它让我感到困惑。我可以有一个 gcm_users 表,其结构为:id、user_id、device_registration_id,但这不能解决唯一注册 id 的问题。我想我得再考虑一下。 :/ 感谢您的洞察力。 我认为我需要的是 GCM 的新用户特定通知。我会对此进行一些研究并相应地更新我的问题。【参考方案2】:

我已经设法解决了这里的逻辑(部分感谢 Eran 指出了我的思考错误),对我的业务逻辑进行了非常简单的添加,并在数据库中添加了一个表。以防有人遇到我在这里遇到的特定问题。我添加的表的结构是:

--gcm_users
----id
----user_id
----gcm_device_id

在我的业务逻辑中,我是这样处理的。当用户登录时,我的 API 会检查 gcm_device_id 字段中是否已经存在 GCM 注册 ID。如果没有,则添加一个新行,其中包含登录用户的 ID (user_id) 和 GCM 注册 ID (gcm_device_id)。如果该行已经存在,则该行的 user_id 将更新为登录用户的 id。这解决了另一个用户在同一设备上登录的问题。再次感谢社区的大力支持,我希望这个答案有一天对某人有所帮助。

【讨论】:

以上是关于用于使用 Google Cloud 消息传递的 API 的数据结构的主要内容,如果未能解决你的问题,请参考以下文章

Google Cloud Platform 发布/订阅 - 消息未传递给订阅者

Parse.com 推送通知 VS。适用于 iOS 的 Google Cloud 消息传递?

Google Cloud Messaging VS Google Cloud Platform

google cloud pub sub中两个主题之间的消息传输

带有 Quickblox 的 Android 版 Google Cloud Messaging

Google Cloud Functions 无法使用 Pub/Sub 死信主题