c2dm, почему неправильное приложение c2dm на моем телефоне получает сообщение

[ОБНОВЛЕНИЕ]
(когда вы читаете мой вопрос, это полезно знать)
У меня была небольшая программная ошибка, и теперь она работает. Однако оба приложения на телефоне получают одно и то же сообщение, так что я что-то забыл сделать

[КОНЕЦ ОБНОВЛЕНИЯ]

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

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

В песочнице я изменил имя пакета в приложении.
На моем телефоне у меня установлены обе версии — нормально и денди.
Единственная разница в том, что приложение версии песочницы взаимодействует с сервером песочницы (конечно).
> почему неправильное приложение c2dm на моем телефоне получает сообщение?

Теперь, почему сообщения из приложения-песочницы принимаются приложением, не являющимся песочницей?

Программисту-любителю вроде меня иногда трудно понять документацию по c2dm.
Меня смущают:

public static final String EXTRA_APPLICATION_PENDING_INTENT = "app";

Должен ли я писать имя пакета здесь? Что-то должно однозначно идентифицировать два приложения, верно?

Еще одна вещь, по которой я не могу найти ответ/документацию, — это Registration_id.
Я полагаю, что телефон имеет только один Registration_id, но может иметь несколько приложений c2dm?
Это было мое предположение, с удовольствием поправьте меня, если я ошибаюсь.

я запутался, если проблема в том, как я обрабатываю Registration_id или в том, как я отправляю push-сообщения. не знаю, с чего начать здесь?

[ОБНОВИТЬ]...

    <receiver android:name="com.google.android.c2dm.C2DMBroadcastReceiver"
        android:permission="com.google.android.c2dm.permission.SEND">
        <intent-filter>
        <!-- Receive the actual message -->
            <action android:name="com.google.android.c2dm.intent.RECEIVE" />
            <category android:name="com.bent.blaster" />
        </intent-filter>
        <intent-filter>
        <!-- Receive the registration id -->
            <action android:name="com.google.android.c2dm.intent.REGISTRATION" />
            <category android:name="com.bent.blaster" />
        </intent-filter>
</receiver>

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
          package="com.bent.blaster" 
          android:versionCode="1" 
          android:versionName="0.52" 
          android:installLocation="preferExternal">
    <permission android:name="com.bent.blaster.permission.C2D_MESSAGE" android:protectionLevel="signature" />      
    <uses-permission android:name="com.bent.blaster.permission.C2D_MESSAGE" />
    <uses-permission android:name="com.google.android.c2dm.permission.RECEIVE" />
    <uses-permission android:name="android.permission.GET_ACCOUNTS" />      
    <uses-permission android:name="android.permission.INTERNET" />
    <uses-permission android:name="android.permission.WAKE_LOCK" /> 
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
    <uses-permission android:name="android.permission.VIBRATE" />
    <uses-sdk android:minSdkVersion="8" />

person Erik    schedule 09.07.2011    source источник
comment
@advantej спасибо за ваш замечательный блог на c2dm.   -  person Erik    schedule 09.07.2011


Ответы (3)


То, что я здесь пишу, изначально взято со многих страниц, но лучший из них — http://www.vogella.de/articles/AndroidCloudToDeviceMessaging/article.html#example_server сначала я посмотрел вступление Google I/O 2010 c2dm, а затем я посмотрел эту замечательную лекцию http://marakana.com/forums/android/general/272.html, но, наконец, эта ссылка там было все, что мне нужно, чтобы мое приложение работало.

Ответ: в манифесте, где вы указали получателя следующим образом (это элемент внутри тега приложения):

    <receiver android:name="com.google.android.c2dm.C2DMBroadcastReceiver"
        android:permission="com.google.android.c2dm.permission.SEND">
        <!-- Receive the actual message -->
        <intent-filter>
            <action android:name="com.google.android.c2dm.intent.RECEIVE" />
            <category android:name="de.vogella.android.c2dm" />
        </intent-filter>
        <!-- Receive the registration id -->
        <intent-filter>
            <action android:name="com.google.android.c2dm.intent.REGISTRATION" />
            <category android:name="de.vogella.android.c2dm" />
        </intent-filter>
    </receiver>

Обратите внимание на тег категории, я думаю, вы не назначили категорию с именем вашего пакета либо из этого, либо из этого разрешения отсутствует (это элемент внутри корневого тега манифеста):

<permission android:name="de.vogella.android.c2dm.permission.C2D_MESSAGE"
        android:protectionLevel="signature" />

как вы уже догадались, категория указывает, что только приложение с этим пакетом или подпакетами может читать сообщения c2dm, в то время как android:protectionLevel="signature" указывает, что ваши сообщения c2dm защищены подписью (которая является пакетом).

Хорошего дня надеюсь я помог

person Community    schedule 10.07.2011
comment
спасибо за изложение. Я сделал все это. Моя установка похожа на вашу. я обновляю свой вопрос. - person Erik; 10.07.2011
comment
Мое приложение и сервер работали нормально в течение месяца, но я не знаю подробностей о том, как это работает, я никогда даже не думал об этом раньше. Например, как узнать, какое приложение на телефоне (если их много) должно быть получателем сообщения, когда я отправляю push-уведомление с сервера с помощью reg.id телефона. Угадайте, что здесь играет роль подпись, верно? но у меня отличается. подписи на моих обоих приложениях, но, конечно, что-то я забыл - person Erik; 10.07.2011
comment
как насчет приложения EXTRA_APPLICATION_PENDING_INTENT =?? Должен ли я написать мне protectionLevel=signature там - person Erik; 10.07.2011
comment
цель регистрации одинакова для всех приложений, кроме ролевой учетной записи, если я правильно помню - person Shereef Marzouk; 11.07.2011
comment
У меня была небольшая программная ошибка, и теперь она работает. Однако оба приложения на телефоне получают одно и то же сообщение, так что я что-то забыл сделать - person Erik; 11.07.2011
comment
Извините за поздний ответ, у меня были экзамены, но я только что выпустился :) может быть, оба приложения имеют одинаковый пакет? как работает этот манифест? тег ‹manifest› должен содержать тег ‹application›, внутри которого находится ‹receiver›. Не могли бы вы исправить опубликованный вами манифест? - person Shereef Marzouk; 19.07.2011
comment
тег ‹receiver› есть в моем вопросе, я думаю, что проблема заключалась в том, что в течение короткого времени оба приложения имели один и тот же reg_id. Это изменилось, когда через 24 часа я удалил/переустановил один из них. Сначала это немного сбивает с толку, но после разговора с командой Google теперь все ясно, и все работает. Спасибо за ваше время - person Erik; 24.07.2011

Когда оба моих приложения получали один и тот же push, я
не понимал, что каждое приложение имеет свой собственный Registration_id.

Я думаю, что на короткое время у них был один и тот же Registration_id, пока я не удалил/переустановил их.

person Erik    schedule 16.07.2011

Я думаю, проблема заключалась в том, что в течение короткого времени оба приложения имели одинаковый reg_id. Это изменилось, когда через 24 часа я удалил/переустановил один из них. Сначала это немного сбивает с толку, но после разговора с командой Google теперь все ясно, и все работает. Спасибо за ваше время

person Erik    schedule 24.07.2011