我的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,以便知道谁是收件人。
客户端仍然只会收到一条消息,但现在它知道该消息是针对当前帐户还是针对另一个帐户。所以现在,如果用户点击消息,我可以询问他是否想切换到另一个帐户来查看消息。