繁体   English   中英

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

[英]Data structure for an API to use Google Cloud messaging

我已经写了一个基于Slim PHP网络的API,该API将同时由网络(浏览器)和Android客户端使用,并且对于实现Google Cloud Messaging来为Android客户端的推送通知存在疑问。 基本上,这是我当前的数据结构

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;
}

仅将这两个字段相加是不够的,因为注册ID与设备绑定,而不与该设备上当前登录的用户绑定。

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

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

最后,这里有一些关于如何将GCM注册ID存储到mysql中的其他建议。

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM