切换帐户后获取GCM消息



我的Android应用程序可以与设备的谷歌帐户一起使用。因此,如果我有账户"a.gmail"和账户"b.gmail",我可以在它们之间切换,而无需重新启动应用程序。

当我切换到一个帐户时,比如"a.gmail",我会将GCM regId发送到服务器,并可以从中获得推送消息。一切都很好。

但是,如果用户在我使用帐户"a.gmail"运行应用程序时向帐户b.gmail"发送推送消息,我就会松脱它。如果在服务器发送消息后我切换到帐户<em]"b.gmail">,我没有收到任何通知。

有没有办法处理这样的情况?我原以为delay_while_idle标志就足够了,但这无济于事。

这就是我格式化消息的方式(PHP):

$fields = array(
    'to'   => $to,
    'delay_while_idle' => true,
    'data' => array(
        "title" => "this is the title",
        "body"  => "this is the body",
        "icon" => "@drawable/icon_notif")
);

根据最新的GCM服务器设置建议,您将安装自己的服务器,该服务器负责将消息推送到GCM。您的设备主要与服务器进行通信,以设置注册ID和其他本地更改。

如果您的服务器是这样设计的,则(用户向帐户"b.gmail"发送推送消息)将通过服务器发生。然后

你必须间接地告诉你的服务器你已经切换了帐户,用户消息还不应该发送给你。

我找到了一个解决方案,也许它对有类似问题的人有用,所以我把它写下来。

幸运的是,我使用"id"将用户存储在数据库中,但也使用设备的SIM和SubscriberId。因此,对于每个设备,如果用户有多个帐户,我会获得他所有的注册ID。

查询如下:

SELECT `RegId` FROM `UserGCM` WHERE `UserId` IN
(
    SELECT ru2.`UserId`
    FROM `RegisteredUser` ru1
    INNER JOIN `RegisteredUser` ru2 ON
        ru1.`SubscriberId` = ru2.`SubscriberId` AND ru1.`SIM` = ru2.`SIM`
    WHERE ru1.`UserId` = ?
)

然后,对于找到的每个regId,我都会发送一条消息:

...
$query->bind_param('i', $did);
$query->execute();
$query->bind_result($regId);
while ($row = $query->fetch())
{
    $response = $gcpm->send($regId, $did, $nam);
}

did是客户端需要的目的地id,以便知道谁是收件人。

客户端仍然只会收到一条消息,但现在它知道该消息是针对当前帐户还是针对另一个帐户。所以现在,如果用户点击消息,我可以询问他是否想切换到另一个帐户来查看消息。

相关内容

  • 没有找到相关文章

最新更新