2015-06-27 2 views
0

Мое приложение Android можно использовать с учетными записями Google устройства. Итак, если у меня есть счет «a.gmail» и счет «b.gmail», я могу переключаться между ними без перезапуска приложения.Получить сообщения GCM после переключения учетной записи

Когда я переключаюсь на счет, скажем, «a.gmail», я отправить GCM RegID на сервер и может получить толчок сообщения от него. Все в порядке.

Но если пользователь отправляет извещающее сообщение для учета «b.gmail» в то время как я бег приложения с учетной записью «a.gmail», я разрешу. Если я переключусь на счет «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") 
); 
+0

Возможно, нет решения: То же устройство, несколько учетных записей, несколько _registration ids_ зарегистрированы в GCM. Устройство находится в сети, поэтому GCM отправляет ему сообщение. Приложение в настоящее время зарегистрировано другим _regId_ (_ "a.gmail" _), поэтому _ "b.gmail "_ не получает сообщение, и он потерян навсегда Может ли это быть правильно? – marco

ответ

1

В соответствии с последней рекомендацией установки GCM сервера, вы собираетесь установить свой собственный сервер, который отвечает за толкая сообщение GCM. В основном устройство связывается с вашим сервером, чтобы установить идентификатор регистрации и другие локальные изменения.

Если ваш сервер спроектирован таким образом, пользователь (отправляет push-сообщение в учетную запись «b.gmail») происходит через сервер. Затем ..

Вы должны сообщить своему серверу, что вы включили учетную запись, косвенно, что сообщение пользователя еще не отправлено вам.

+0

уже нашел решение, спасибо. Но вы правы, я должен был сделать это на своем сервере. – marco

0

Я нашел решение, возможно, он может быть полезен для кого-то с аналогичной проблемой, поэтому я записываю его.

К счастью, я сохраняю пользователя в базе данных с помощью «id», но также использую SIM и SubscriberId устройства. Итак, для каждого устройства я получаю все идентификаторы регистрации пользователя, если у него несколько учетных записей.

Запрос что-то вроде этого:

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 является идентификатор назначения, который необходим клиенту, чтобы знать, кто был получателем.

Клиент все равно получит только одно сообщение, но теперь он знает, если это сообщение для текущей учетной записи или для другого. Итак, если пользователь нажимает сообщение, я могу спросить, хочет ли он переключиться на другую учетную запись, чтобы увидеть сообщение.

Смежные вопросы