Запутанные push-уведомления в Android

Я следовал этому руководству по push-уведомлениям.

Когда я закончил учебник, я обнаружил, что два класса не использовались: AuthenticationUtil и MessageUtil.

Кроме того, Вход через Google эта ссылка кажется неработоспособной. Во-вторых, это идентификатор токена для устройства Android или только для учетной записи? я думал, что push-уведомление - это push-сообщение для идентификатора токена устройства Android.

С другой стороны, я узнал, что bundle.putExtra(key, value) все ключи не использовались. Например поставил "app" но в C2DMRegistrationReceiver() ключ не попал.

В этом sendRegistrationIdToServer() кажется, что никогда не звонят.

Меня смущает этот учебник о push-уведомлениях.

Кто может направить меня или дать мне работающее руководство или пример о push-уведомлениях?

Я хотел бы, чтобы про указали, в чем моя ошибка.

Это мой регистрационный идентификатор

public static final String[] REGISTRATION_ID = {
        "APA91bFV6MwoAH0UNop69PZ2liKpSBUHSHenIuPzh44_6GdGKzVCLvoH_NM31eMZMVLZi-SAIFwP4iZaE72dSWkIh3GaD0RQYpPm9zO0ARWmnoxFyyyreL_KpQ9Qd_p0broclT12RhA4Ymk0cBT00CmpsbSHIwyxig",
        "APA91bEwmxgvs7zNbKC4p0n4DoTEM73DTihnQgBOP8Gxhf2sVW-fgltugDgS1Fh2S4KvN1wQHbMNJEIzieJ9F1nNPqs3NWeKGbB7IBYpKJq4xmN4Z7uzkjZQQUKGD8jW--AwfQY5McINBto9GAL_87_u5WkIq-kx3g",
        "APA91bH63Zgxn1X_MZ56UzrlRpffvmiLAIsqxvBUTMUHP2O_MT_VU9Ork_edXKHlml-PZSkjKEqdk8EKv5HvxbPdK1Vva3WtmqsPZfhXzEbtNIrwrqIvvRf7hL835rDc4t2E8EKUBj1dX2ta0OxY5pY3Xlhkyb1sBg",
        "APA91bGqT5Wo6eUaMdqT5r9TlGbKSX6GN2W6r-RjrRXz5T5v3j87flcQRyfSajmMNGXuPVe-fwZydRmvyYu63tWnYohDmpJyKkXOxs8Vx6P_FplFQ__ufR_hekwqGOspeUc6bfc8fhbMPGN3Ft9l-bfrghJwwk79jw"};

Messageutil

public static int sendMessage(String auth_token, String registrationId,
        String message, String title) throws IOException {

    StringBuilder postDataBuilder = new StringBuilder();
    postDataBuilder.append(PARAM_REGISTRATION_ID).append("=")
            .append(registrationId);
    postDataBuilder.append("&").append(PARAM_COLLAPSE_KEY).append("=")
            .append("0");
    postDataBuilder.append("&").append("data.payload").append("=")
            .append(URLEncoder.encode(message, UTF8));
    postDataBuilder.append("&").append("data.title").append("=")
            .append(URLEncoder.encode(title, UTF8));

    byte[] postData = postDataBuilder.toString().getBytes(UTF8);

    // Hit the dm URL.

    URL url = new URL("https://android.clients.google.com/c2dm/send");
    HttpsURLConnection
            .setDefaultHostnameVerifier(new CustomizedHostnameVerifier());
    HttpsURLConnection conn = (HttpsURLConnection) url.openConnection();
    conn.setDoOutput(true);
    conn.setUseCaches(false);
    conn.setRequestMethod("POST");
    conn.setRequestProperty("Content-Type",
            "application/x-www-form-urlencoded;charset=UTF-8");
    conn.setRequestProperty("Content-Length",
            Integer.toString(postData.length));
    conn.setRequestProperty("Authorization", "GoogleLogin auth="
            + auth_token);

    OutputStream out = conn.getOutputStream();
    out.write(postData);
    out.close();

    int responseCode = conn.getResponseCode();
    return responseCode;
}

private static class CustomizedHostnameVerifier implements HostnameVerifier {
    public boolean verify(String hostname, SSLSession session) {
        return true;
    }
}

Отправитель сообщения

public static void main(String[] args) throws IOException {
    String token = AuthenticationUtil.getToken(SecureStorage.USER,
            SecureStorage.PASSWORD);

    for (int i = 0; i < ServerConfiguration.REGISTRATION_ID.length; i++) {
        MessageUtil.sendMessage(token,
                ServerConfiguration.REGISTRATION_ID[i], "12358",
                "印尼羽賽:馬2單1雙止步入選賽");
        System.out.println(ServerConfiguration.REGISTRATION_ID[i]
                .toString());
    }
    System.out.println(token);

}

person Alan Lai    schedule 12.06.2012    source источник
comment
У вас будет больше шансов получить ответ об учебнике в их группе обсуждения (ссылка на странице). Если у вас есть конкретная проблема с кодом, опубликуйте подробности здесь.   -  person Nikolay Elenkov    schedule 12.06.2012


Ответы (3)


Вы должны следовать этому руководству по реализации Android c2dm.

Для сервера вы можете использовать что угодно, какой-нибудь образец кода, доступный в Интернете. Для сервера я использовал библиотеку .NET под названием "C2DM Sharp"

Процесс очень простой, как...

  • Сначала зарегистрируйте свою электронную почту Google для c2dm на - https://developers.google.com/android/c2dm/signup
  • Запустите приложение Android на Android 2.2 или выше и отправьте идентификатор регистрации, который вы можете получить в «C2DMReceiver», или получить этот идентификатор, написав в LOG
  • Используйте код сервера, для тестирования вставьте свой RegistrationID в код сервера, и вы готовы к работе.

Основной процесс C2DM: Регистрация телефона для C2DM -> Получить RegistrationID -> Отправить RegistrationID на сервер -> Сервер использует идентификатор Google для получения токена авторизации -> сервер использует RegistrationID и токен аутентификации для отправки сообщения.

person Samdrain    schedule 12.06.2012
comment
если это так, например, я использую [email protected] зарегистрироваться в качестве отправителя, а мое устройство Android зарегистрировало [email protected] на устройстве, поэтому оно отправляет сообщение только на устройство? мне нужно отправить на несколько устройств Android. - person Alan Lai; 12.06.2012
comment
нет... оба аккаунта не связаны. вы можете использовать эту учетную запись для отправки push-сообщений на любое устройство. Push-сообщение использует RegistrationID для отправки, не имеет значения, какой идентификатор зарегистрирован на этом устройстве. - person Samdrain; 12.06.2012
comment
я попробовал на вторых устройствах с таким же кодированием, оба устройства также не получили push-уведомление - person Alan Lai; 13.06.2012
comment
@AlanLai, можете ли вы рассказать мне больше, что вы использовали для сервера ?? bcz, если вы используете библиотеку .NET, вы можете отладить ее и найти любую ошибку. Вы меняете регистрационный идентификатор в коде сервера?? а также вам нужно добавить данные своей учетной записи Google, которые вы включили для c2dm в коде сервера. - person Samdrain; 13.06.2012
comment
я использую java в качестве простого тестирования сервера. я обновил код - person Alan Lai; 13.06.2012
comment
ваш код кажется правильным, вы зарегистрировали идентификатор Google для c2dm ?? если да, то я думаю, вам нужно отладить больше, чтобы найти. Я подозреваю о auth_token. - person Samdrain; 13.06.2012
comment
в настоящее время проблемы решены, новую проблему нельзя отменить, при вызове .UNREGISTER она станет .REGISTRATION - person Alan Lai; 14.06.2012
comment
ваше намерение должно совпадать с регистрацией unregIntent.putExtra(app, PendingIntent.getBroadcast(this, 0, new Intent(), 0)); - person Samdrain; 15.06.2012

Облачный обмен сообщениями Google для Android

Важно! C2DM (Android Cloud to Device Messaging Framework) официально объявлен устаревшим с 26 июня 2012 г. Это означает, что C2DM перестал принимать новых пользователей и запросы квот. В C2DM не будет добавлено никаких новых функций. Однако приложения, использующие C2DM, продолжат работать. Существующим разработчикам C2DM рекомендуется перейти на новую версию C2DM, которая называется Google Cloud Messaging для Android (GCM). Дополнительную информацию см. в документе «Миграция C2DM-to-GCM». Разработчики должны использовать GCM для новой разработки.

Пожалуйста, проверьте следующую ссылку:

http://developer.android.com/guide/google/gcm/index.html

person chiranjib    schedule 04.07.2012

Пожалуйста, смотрите мой вопрос здесь:

C2DM-сервер. Должны ли мы сейчас использовать OAuth?

Есть некоторая информация и ссылка на группу google с ответом.

Вкратце..

Похоже, OAuth2 будет работать, но я не нашел ни одного рабочего примера для реализации.

Вход в клиент работает, и это то место, где я запутался. Тебе следует:

  1. Настройте гугл-аккаунт. Я выбрал что-то вроде [email protected].
  2. Зарегистрируйтесь в C2DM, используя этот адрес электронной почты. Это важно.
  3. На стороне сервера используйте адрес электронной почты/пароль, который вы настроили, чтобы получить токен авторизации.
  4. Используйте этот токен для отправки сообщений с сервера.

Все остальное точно так же, как и во всех туториалах вокруг.

person katit    schedule 12.06.2012