Подтвердить что ты не робот

Способы угадать, подключен ли C2DM

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

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

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

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

4b9b3361

Ответ 1

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

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

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

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

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

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

Ответ 2

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

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

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

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

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

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

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

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

Ответ 3

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

/Proc/нетто/NetStat

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

Ответ 4

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

Ответ 5

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

Ответ 6

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

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

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

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

Ответ 7

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

Ответ 8

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

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

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

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

Циферблат: ## 8255 ##

Theres также кнопка, которая посылает пульс прямо сейчас и сбрасывает таймаут.

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