C2DM: только зарегистрированная учетная запись Google получает сообщения с сервера

Кажется, я застрял, часами пытаясь понять, что пошло не так. Такое ощущение, что я что-то совсем не понимаю. Так вот в чем дело:

Пытаясь заставить C2DM работать, я сначала зарегистрировался в службе Google C2DM с выделенным адресом электронной почты. Это тот, который я хочу использовать для отправки сообщений с сервера клиентам. Затем я добавил код в клиентское приложение и зарегистрировал устройство в C2DM. Полученный регистрационный идентификатор отправляется на сервер и сохраняется в БД.

Проблема возникает, когда я пытаюсь отправить сообщения (независимо от того, использую ли я curlили php) на устройства. Отправка на учетную запись, которую я использовал для регистрации в службе C2DM, в первую очередь работает без нареканий. Однако при отправке на любое другое устройство возникает ошибка Error=NotRegistered. И я просто не понимаю, почему. Я использую auth key из учетной записи регистрации и registration id, которую я создаю из клиентов. Я (повторно) создавал registration id сотни раз, но в соответствии с кодовой страницей Google Error=NotRegistered означает, что registration_id недействителен.

Попытка уточнения:

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

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

Что я упускаю/не понимаю?

Спасибо миллион, Стефф


person stfn    schedule 01.09.2011    source источник
comment
Ваш вопрос не очень ясен. Вы говорите, что отправка на учетную запись, которую я использовал для регистрации в службе C2DM, в первую очередь работает безупречно, но вы ничего не отправляете на эту учетную запись, вы отправляете сообщения на регистрационный идентификатор. Не могли бы вы уточнить, что именно вы делаете, и что работает, а что нет, потому что я прочитал ваш вопрос четыре раза, и неясно, в чем проблема.   -  person Ollie C    schedule 01.09.2011
comment
Конечно, я постараюсь уточнить. Я уже ожидал этого. Простите за беспорядок...   -  person stfn    schedule 01.09.2011


Ответы (5)


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

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

Я бы посоветовал это тоже прочитать. Это лучший учебник по C2DM, который я когда-либо видел. http://www.vogella.de/articles/AndroidCloudToDeviceMessaging/article.html

person Ollie C    schedule 01.09.2011
comment
Это именно тот учебник, которому я следовал. Более того, я пробовал 3 разных аккаунта на нескольких устройствах. Просто для моего понимания: auth_key (после получения) а) только для учетной записи сервера и «статический» (в том смысле, что он только один). Идентификаторы регистрации указаны для каждой учетной записи. То есть каждая учетная запись, отправившая свой регистрационный идентификатор, ДОЛЖНА иметь возможность получать сообщения через C2DM. Правильный? - person stfn; 01.09.2011
comment
Еще одно: согласно code.google.com/android/c2dm/#push Я действительно получаю положительный ответ сервера (200). Однако код ошибки сохраняется. - person stfn; 01.09.2011
comment
Я думаю, вы поняли это правильно. Есть один код авторизации, и он используется для аутентификации вас при отправке сообщения на серверы Google C2DM. Идентификатор регистрации — это место назначения, представляющее это конкретное приложение на конкретном устройстве. Я предполагаю, что имена пакетов на всех устройствах одинаковы? Каждый код аутентификации относится к имени пакета приложения. Получает ли ваш вещательный приемник что-либо от C2DM после подтверждения регистрации? - person Ollie C; 01.09.2011
comment
Однако вы сказали, что код ошибки сохраняется. Какой код ошибки и где? - person Ollie C; 01.09.2011
comment
Код ошибки, который я получаю в ответ от сервера C2DM. Пишет Ошибка=Не зарегистрирован. Я всегда обращаюсь к одному и тому же имени пакета и получаю ключ авторизации для этого имени пакета. Однако сейчас стало немного светлее. Похоже, проблема с устройством. Я добавил еще одну учетную запись в Nexus 1. Теперь он может получать сообщения для обеих учетных записей. Другие устройства, такие как Desire Z или SGS, к сожалению, не работают. И я как-то отказываюсь верить, что это проблема устройства... - person stfn; 02.09.2011
comment
Тем временем я могу отправить сообщение на сервер C2DM, который не сообщает об ошибке. Однако сообщение не доставляется на соответствующее устройство (Desire Z). - person stfn; 02.09.2011
comment
C2DM требует, чтобы на устройстве был установлен Market, что, впрочем, и на устройствах есть, а также чтобы пользователь вошел в учетную запись Google. Возможно ли, что на них не выполнен вход в учетную запись Google? вы сказали, что сервер C2DM возвращает Error=NotRegistered, но вы также сказали, что я могу отправить сообщение на сервер C2DM, который не сообщает об ошибке. Сервер C2DM сообщает об ошибке или нет? - person Ollie C; 02.09.2011
comment
Когда я задал свой первоначальный вопрос, я получил сообщение об 1 учетной записи, а 2 других не прошли с ошибкой = не зарегистрирован. После добавления 2-й учетной записи в Nexus все прошло безупречно для этих 2 учетных записей (3-я все еще отвечает с ошибкой = не зарегистрирована). После удаления учетной записи 2 из N1 и восстановления ее на Desire Z он не сообщил об этой ошибке, но также не доставил сообщение. Таким образом, я получаю 3 учетных записи на 3 устройствах: 1 получает отлично (N1), 1 нет получение и отсутствие ошибок и 1 не получение с Error=NotRegistered - person stfn; 02.09.2011
comment
Кстати: я всегда перерегистрировал устройства и обновлял Registration_id на сервере - person stfn; 02.09.2011
comment
Правление попросило меня продолжить это обсуждение в чате - person stfn; 02.09.2011

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

person Jeyhun Karimov    schedule 01.11.2011

У меня была такая же проблема, будущее: «данные в фоновом режиме» (настройка телефона) были отключены. Включение решило дело.

person twoj    schedule 25.03.2012

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

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

person Kasium    schedule 02.09.2011
comment
спасибо за ваш ответ, но это не совсем ответ на мой вопрос. Я думаю, что сделал все, что вы предложили. Спасибо, в любом случае - person stfn; 03.09.2011

допустим, вы подписались на C2DM с адресом электронной почты [email protected].

Впоследствии вы запрашиваете идентификатор регистрации в самом приложении. Причина, по которой вы можете отправлять push-уведомления только на идентификатор регистрации, связанный с '[email protected]', заключается в том, что вы должны запрашивать идентификаторы регистрации только с адресом электронной почты, который вы предоставляется при регистрации в C2DM.

Это решает ваш запрос?

person Earthling    schedule 30.09.2011