Способы угадать, подключен ли C2DM - PullRequest
16 голосов
/ 26 октября 2011

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

Я создал приложение, которое полагается на передачу информации на телефон, когда она физически недоступна. Я понимаю, что C2DM не является гарантированной доставкой, но я бы по крайней мере хотел бы знать, когда доставка сообщения вообще возможна; когда это не так, мы возвращаемся к нашей собственной службе push-уведомлений (и можем фактически определить, когда мы подключены).

Я заметил, что C2DM на Android по-прежнему будет выдавать токены авторизации, даже если в аккаунте Google нет входа; сообщения все еще, кажется, доставлены в этом случае, даже если заявлено, что они не должны быть. Если GTalk не подключен (брандмауэр или другие причины), при запросе аутентификационного токена ответ вообще не возвращается. Авторизационные токены возвращаются в приложение, когда телефон находится в режиме полета. Это означает, что это не так просто, как проверить, доступен ли интернет. Я не могу найти надежный способ проверить, вошел ли GTalk в систему.

Опять же, мне не нужно гарантировать доставку сообщений, но я бы по крайней мере хотел бы знать, возможна ли хотя бы возможность . У кого-нибудь есть интересные решения?

Ответы [ 8 ]

11 голосов
/ 31 октября 2011

Иди посмотри это видео , это разговор о вводе-выводе Google о C2DM, как его использовать и как он работает.AFAIK, ты не можешь знать, подключен он или нет.Вероятно, большую часть времени они даже не знают (пока они не доставят сообщение и не получат сообщение).

Тем не менее, настоятельно рекомендуется (также в видео), чтобы вы не отправляли важные данные черезC2DM (так как сообщения могут потеряться).Услугу следует использовать только как «сетевой тикл» (с минимально возможным размером).Ваше приложение должно быть разбужено этим тиклом, и оно должно начать получать необходимую ему информацию * .

Теперь, если вы реализуете это таким образом, должен быть простой механизм реализации опроса,Поскольку вы уже отделили «тикл» от фактического поиска информации, вы можете просто запускать поиск время от времени, если нет щекотки.

То, что вы можете сделать, чтобы проверить, подключен ли C2DM, - этоping:

  1. Отправить сообщение на телефон через C2DM
  2. Приложение получает (или не получает) сообщение и отправляет «pong» обратно на ваш сервер
  3. Сервер ждет «pong» в течение заданного промежутка времени (я бы сказал, 1-2 минуты), прежде чем пометить устройство как «отключенное».

Редактировать: полагаться на GTalk невозможно.GTalk опирается на C2DM, как и ваше приложение, в нем нет ничего «лишнего».Также GTalk присутствует не на всех устройствах.Я не уверен, как приложение GTalk определяет, находится ли оно в автономном режиме или нет (к сожалению, оно не является открытым исходным кодом), но я предполагаю, что оно просто пытается пропинговать сервер и дает сбой.

7 голосов
/ 01 ноября 2011

Нет, это невозможно. Поскольку вы аутентифицируете устройство один раз, генерируете регистрационный ID и отправляете на сторонний сервер (Как вы уже знаете). Теперь ваша работа заканчивается, когда устройство зарегистрировано. Так что дождитесь сообщения, которое вы получили или нет (нет гарантии доставки сообщения, поскольку C2DM использует протокол UDP).

Альтернативное решение

Хотя это невозможно проверить непосредственно со стороны Google, как я упоминал выше, но если у вас есть необходимость проверить соединение с телефона тогда вы можете использовать такой подход

Шаг 1): создайте один веб-сервис для проверки соединения

Шаг 2). Вызовите этот веб-сервис из приложения, которое отправит команду серверу на отправку push-уведомления для проверки.

Шаг 3). Теперь со стороны сервера сервер немедленно отправит push-уведомление для определенного устройства (ОТ которого оно получает команду)

Шаг 4): Теперь, если вы получили push-уведомление, это означает, что вы все еще подключены к C2DM.

это не займет много времени. Но следуйте этому, только если проверка соединения срочна, и это для пользователя

1 голос
/ 04 ноября 2011

Это может быть немного наивно, так как я не активный пользователь C2DM, но я не смог бы прочитать

/ proc / net / netstat

и посмотрите, есть ли активные соединения TCP.Если их нет, C2DM не может работать.Вы также можете сделать эту технику более универсальной, сформировав белый список C2DM, который вы ожидаете найти (или, возможно, его можно отфильтровать на специальном порту C2DM?)

0 голосов
/ 12 сентября 2012

Что-то связанное с длительным C2DM-соединением, которое используется для доставки триггеров:

  • В WLAN он отправляет сердцебиение каждые 15 минут.
  • В мобильных сетях время ожиданиясоставляет 28 минут.

28 Минуты могут быть слишком длинными, в зависимости от оборудования, используемого вашим оператором мобильной связи, повторителей 2 г / 3 г в гаражах и т. д.

Вы можете получить много информациио подключении, открыв приложение Google Talk Service Monitor: http://www.honeytechblog.com/monitor-google-talk-service-android/

Наберите: # # 8255 # #

Также есть кнопкакоторый отправляет сердцебиение прямо сейчас и сбрасывает время ожидания.

Если вы хотите (на стороне клиента), чтобы c2dm-сообщения могли быть получены в данный момент времени, лучше всего повторно отправить сердцебиение,Это может быть сделано программно - только на корневых устройствах.Я мог бы выпустить apk на рынок когда-нибудь, который делает именно это.

0 голосов
/ 03 ноября 2011

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

0 голосов
/ 31 октября 2011

Я не думаю, что в ADVANCE есть какой-либо способ определить, сработает ли попытка толчка, но я могу придумать довольно простой способ проверки получения (но не очереди для будущей доставки через C2DM) - просто завершить цикл сообщений.

Помните, что главное преимущество C2DM заключается в том, что он позволяет получать уведомления, когда телефон находится в спящем режиме и номинально отключен. Как только ваше приложение получит уведомление, вам мало что помешает вам в этот момент разбудить телефон, подключить сеть и отправить подтверждение. Я не думаю, что вам даже придется запрашивать разрешения «держать телефон в активном состоянии», потому что я считаю, что простого акта регистрации для получения уведомлений C2DM и их получения достаточно, чтобы разбудить телефон и позволить приложению продолжить нормальную работу ( по крайней мере, достаточно долго, чтобы открыть сеть и отправить подтверждение).

Пока вы занимаетесь этим, вы должны отслеживать подтверждения, которые происходят ДОЛГО после того, как вы ожидали, что они будут проиграны. Если вы видите более нескольких, вам, возможно, придется изменить стратегию повторной отправки.

Единственный реальный крайний случай, когда это может не получиться, - это если бы у вас были пользователи, которые наклонялись назад, чтобы отключить данные, оставляя голосовой / SMS включенным (я почти уверен, что C2DM использует 4 байта дейтаграммы ответа, отправленной, когда телефон опросы входящих звонков и текстовых сообщений, которые изначально были отведены для RIM, а затем переназначены для Apple и Google).

0 голосов
/ 31 октября 2011

Я немного работал с C2Dm, я создал свой собственный сторонний сервер push. Я реализовал небольшую логику, основанную на http-коде ответа C2DM, чтобы узнать, было ли отправлено push-сообщение или нет. Вот часть кода, который я использовал:

int responseCode = conn.getResponseCode();

    if (responseCode == HttpServletResponse.SC_UNAUTHORIZED || responseCode == HttpServletResponse.SC_FORBIDDEN) {

        LOGGER.warn("Unauthorized - need token");

        return false;
    }

здесь я почти уверен, что push-сообщение было отправлено с серверов c2dm, потому что у меня есть идентификатор в ответе:

if (responseParts[0].equals("id")) {
        LOGGER.info("Successfully sent data message to device: " + responseLine);

        return true;
    }

Я использовал другие методы, чтобы получить другие коды результатов от Google, если вы хотите, я могу опубликовать их. Надеюсь, я вам немного помог.

0 голосов
/ 29 октября 2011

Если устройство недоступно, даже ваша резервная система push-сообщений не будет работать.C2DM не гарантирует, что доставит ваше сообщение, но случай недоставки будет очень редким.Так будет и с любым другим сервисом.Лучший способ обойти это - опросить сервер, чтобы проверить, есть ли у вас новые сообщения, которые еще не доставлены.Я предполагаю, что ваше приложение таково, что очень важно не пропустить ни одного сообщения из 500, а может быть и 1000. В этом случае вы можете реализовать гибрид push и pull.

...