c2dm почему неправильное приложение c2dm на моем телефоне получает сообщение - PullRequest
0 голосов
/ 09 июля 2011

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

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

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

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

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

Теперь, Почему сообщения из приложения «песочница» принимаются приложением, не входящим в «песочницу»?

Для программистов-любителей, таких как я, документацию для c2dm иногда трудно понять.
Я запутался в:

public static final String EXTRA_APPLICATION_PENDING_INTENT = "app";

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

Еще одна вещь, на которую я не могу найти ответ / документацию, это регистрационный_ид.
Я полагаю, что у телефона только один регистрационный_ид, но может быть несколько приложений 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" />

Ответы [ 3 ]

0 голосов
/ 17 июля 2011

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

Я думаю, что они на короткое время имели одинаковый регистрационный_идентификатор, пока я не удалил / переустановил их.

0 голосов
/ 24 июля 2011

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

0 голосов
/ 10 июля 2011

То, что я пишу здесь, я изначально получил со многих страниц, но лучший, который сделал это для меня, это 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 сообщения защищены подписью (которая является пакетом).

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

...