Как использовать push-уведомления GCM и Urban Airship для Android

Реализую push-уведомления для Android. Мой клиент хочет, чтобы приложение поддерживало Urban Airship в дополнение к обычному сервису GCM. Вот у меня проблема.

Чтобы включить GCM, я использовал gcm.jar от Google, выполнил все остальные настройки и подтвердил, что могу без проблем отправлять push-уведомления со своего сервера. Это часть AndroidManifest.

<receiver android:name="com.google.android.gcm.GCMBroadcastReceiver" android:permission="com.google.android.c2dm.permission.SEND">
    <intent-filter>
        <action android:name="com.google.android.c2dm.intent.RECEIVE" />
        <action android:name="com.google.android.c2dm.intent.REGISTRATION" />
        <category android:name="my.package.name"/>
    </intent-filter>
</receiver>
<service android:name="my.package.name.GCMIntentService" />

А для реализации Urban Airship я использовал urbanairship-lib-3.1.0.jar и выполнил все настройки. Работает отлично.

<receiver android:name="com.urbanairship.CoreReceiver" />
<receiver android:name="com.urbanairship.push.GCMPushReceiver" android:permission="com.google.android.c2dm.permission.SEND" >
    <intent-filter>
        <action android:name="com.google.android.c2dm.intent.RECEIVE" />
        <action android:name="com.google.android.c2dm.intent.REGISTRATION" />
        <category android:name="my.package.name"/>
    </intent-filter>
</receiver>

Проблема: когда я отправляю push-уведомление с Urban Airship, приложение получает 2 уведомления.

Когда это происходит, я могу подавить одно ненужное окно с предупреждением, написав соответствующий код, но я не могу понять, как удалить то, которое находится на верхней панели уведомлений.

Я не уверен, что это правильный способ использовать GCM и Urban Airship в одном приложении. Кому-нибудь когда-нибудь удавалось это или какая-либо другая идея? Могу я что-нибудь сделать с intent-filter?


person mmrn    schedule 04.10.2013    source источник
comment
Вопрос непонятный. Почему вам нужно поддерживать и городской дирижабль, и обычный GCM? Городской дирижабль уже использует GCM. Вы регистрируетесь с одним и тем же идентификатором отправителя в Urban Airship и в обычном GCM? Вы можете просто подавить дублирование уведомлений, удалив один из приемников широковещательной рассылки. Вопрос в том, зачем вам и то, и другое?   -  person Eran    schedule 04.10.2013
comment
Спасибо. Причина в том, что мы хотели бы отправлять уведомления из Urban, когда спешите, и с нашего сервера (не используя Urban), когда не спешите, чтобы сэкономить деньги. Если я удалю один из широковещательных приемников для GCM, я больше не смогу получать обычный GCM, и это проблема. Это понятно?   -  person mmrn    schedule 05.10.2013
comment
И да, сейчас я использую один и тот же идентификатор отправителя для Urban и обычного GCM, поэтому использование разных идентификаторов может быть хорошей идеей. Я попробую.   -  person mmrn    schedule 05.10.2013
comment
Я пробовал использовать разные идентификаторы отправителя для каждой службы, но не смог получить желаемый результат.   -  person mmrn    schedule 05.10.2013


Ответы (1)


Насколько мне известно, городской дирижабль использует GCM для отправки уведомлений на Android. Это означает, что независимо от того, кто отправляет уведомление на стороне сервера, один получатель может получить все сообщения. Вот почему вы получаете два уведомления, поскольку оба получателя получают одно и то же сообщение и отображают уведомление. Ваш собственный приемник может обрабатывать как сообщения, отправленные вами, так и Urban Airship.

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

Кроме того, я не понимаю, как отправка сообщений через Urban Airship может ускорить их доставку, поскольку они также отправляют сообщение на серверы GCM, которые и выполняют фактическую доставку. Единственный способ, которым Urban Airship может быть быстрее, - это использование API сервера облачных подключений, в то время как вы используете более простой HTTP API для прямых вызовов GCM.

person Eran    schedule 05.10.2013
comment
Спасибо за подсказки. Я думаю, мне лучше использовать один приемник для не-UA GCM и UA, а не использовать два приемника, поэтому я пытаюсь это сделать. Поскольку мне не удалось получить уведомления UA от получателя, отличного от UA, я пытаюсь заставить получатель UA правильно получать все уведомления. Я использую UA для более быстрой отправки уведомлений, потому что наш сервер имеет низкие характеристики (EC2 small), поэтому он не может отправлять много уведомлений одновременно. UA может отправлять намного быстрее. - person mmrn; 06.10.2013