- GCM – новый сервис Push-уведомлений от Google
- Настройка GCM
- Integrating Google Sign-In into Your Android App
- Before you begin
- Configure Google Sign-in and the GoogleSignInClient object
- Check for an existing signed-in user
- Add the Google Sign-in button to your app
- Start the sign-in flow
- Try Sign-In for Android
- Get the project
- Configure a Google API project
- Run the sample
- How it works
- Next steps
- Google Cloud Messaging: экономим батарею и нервную ткань с помощью Push-уведомлений
- Содержание статьи
- Введение
- Как это работает
- Xakep #207. Дистанционное банковское ограбление
- Регистрация
- Манифест-файл
- Проверки
- Токен
- Сообщения
- От сервера
- Топики
- Группы
- От клиента
- Получение сообщений
- Подписываемся на топики
- Генерация сообщений
- Troubleshooting
- Заключение
GCM – новый сервис Push-уведомлений от Google
Ранее в Android использовался C2DM (Cloud to Device Messaging), как сервис доставки Push-уведомлений на устройство. Но 26 июня он был официально отменен гуглом. На его место пришел новый GCM (Google Cloud Messaging).
Похожие названия. Одинаковая роль. В чем же разница ?
- Для использования GCM, необходимо получить Simple API Key в консоли Google APIs.
- Для GCM нужно получить Sender ID. Он является эквивалентом электронной почты в C2DM. Получить его можно опять-таки из консоли Google APIs, а точнее из URL:
code.google.com/apis/console/#project: - Уведомления в GCM имеют формат JSON вместе с простым текстом.
- GCM может отправлять уведомления сразу на несколько устройств.
- Теперь одно устройство с одним идентификатором регистрации может получать уведомления сразу с нескольких серверов.
- Теперь уведомления могут иметь время жизни до 4-х недель. GCM будет хранить их до истечения срока.
- Теперь можно отправлять уведомления до 4Кб с полезной нагрузкой. Это будет очень выгодно для реал-тайма различных чатов. Однако данный метод будет сильней кушать батарейку устройства.
- Теперь нет необходимости передавать идентификатор устройства на сервер, чтобы избежать повторных регистраций одного устройства. Канонический идентификатор регистрации определяется GCM по последней регистрации устройства. И если сервер отправит уведомление со старым идентификатором, то GCM вернет канонический (последний) идентификатор, на который надо будет заменить старый.
Настройка GCM
Начнем с Android Manifest
Сначала нужно прописать разрешения:
Затем ресивер и сервис:
*
Затем в корневом каталоге пакета создаем класс GCMIntentService, наследуемый от GCMBaseIntentService:
И уже после этого в главном активити прописываем:
Теперь все готово, за исключением отправки самих уведомлений с сервера, но думаю, что для одной статьи этого пока достаточно.
Источник
Integrating Google Sign-In into Your Android App
To integrate Google Sign-In into your Android app, configure Google Sign-In and add a button to your app’s layout that starts the sign-in flow.
Before you begin
Configure Google Sign-in and the GoogleSignInClient object
In your sign-in activity’s onCreate method, configure Google Sign-In to request the user data required by your app. For example, to configure Google Sign-In to request users’ ID and basic profile information, create a GoogleSignInOptions object with the DEFAULT_SIGN_IN parameter. To request users’ email addresses as well, create the GoogleSignInOptions object with the requestEmail option.
If you need to request additional scopes to access Google APIs, specify them with requestScopes . For the best user experience, on sign-in, only request the scopes that are required for your app to minimally function. Request any additional scopes only when you need them, so that your users see the consent screen in the context of an action they performed. See Requesting Additional Scopes.
Then, also in your sign-in activity’s onCreate method, create a GoogleSignInClient object with the options you specified.
Check for an existing signed-in user
In your activity’s onStart method, check if a user has already signed in to your app with Google.
If GoogleSignIn.getLastSignedInAccount returns a GoogleSignInAccount object (rather than null ), the user has already signed in to your app with Google. Update your UI accordingly—that is, hide the sign-in button, launch your main activity, or whatever is appropriate for your app.
If GoogleSignIn.getLastSignedInAccount returns null , the user has not yet signed in to your app with Google. Update your UI to display the Google Sign-in button.
Add the Google Sign-in button to your app
Add the SignInButton in your application’s layout:
Optional: If you are using the default sign-in button graphic instead of providing your own sign-in button assets, you can customize the button’s size with the setSize method.
In the Android activity (for example, in the onCreate method), register your button’s OnClickListener to sign in the user when clicked:
Start the sign-in flow
In the activity’s onClick method, handle sign-in button taps by creating a sign-in intent with the getSignInIntent method, and starting the intent with startActivityForResult .
Starting the intent prompts the user to select a Google account to sign in with. If you requested scopes beyond profile , email , and openid , the user is also prompted to grant access to the requested resources.
After the user signs in, you can get a GoogleSignInAccount object for the user in the activity’s onActivityResult method.
The GoogleSignInAccount object contains information about the signed-in user, such as the user’s name.
You can also get the user’s email address with getEmail , the user’s Google ID (for client-side use) with getId , and an ID token for the user with getIdToken . If you need to pass the currently signed-in user to a backend server, send the ID token to your backend server and validate the token on the server.
Except as otherwise noted, the content of this page is licensed under the Creative Commons Attribution 4.0 License, and code samples are licensed under the Apache 2.0 License. For details, see the Google Developers Site Policies. Java is a registered trademark of Oracle and/or its affiliates.
Источник
Try Sign-In for Android
Use our Android sample app to see how Sign-In works, or add Sign-In to your existing app.
Get the project
If this is your first time using a Google services sample, check out the google-services repository.
Open Android Studio.
Select File > Open, browse to where you cloned the google-services repository, and open google-services/android/signin .
Configure a Google API project
To use the sample, you need to provide some additional information to finish setting up your project. Click the button below, and specify the package name com .google .samples .quickstart .signin when prompted. You will also need to provide the SHA-1 hash of your signing certificate. See Authenticating Your Client for information.
The sample’s IdTokenActivity and ServerAuthCodeActivity examples require you to specify an OAuth 2.0 web client ID. In a real app, this client ID would represent your app’s backend server. A client ID for this purpose was created when you configured the project above.
Find this value by opening the Google API Console:
Your web server client ID is displayed next to Web client (Auto-created for Google Sign-in). Copy and paste the client ID into your project’s strings.xml file:
Run the sample
Now you’re ready to build the sample and run it from Android Studio.
Build the sample and click the run button and select a connected device or emulator with the latest version of Google Play services.
How it works
The application builds a GoogleSignInClient , specifying the sign-in options it needs. Then, when the sign-in button is clicked, the application starts the sign-in intent, which prompts the user to sign in with a Google account.
Next steps
If you want to see how you can implement Google Sign-In in your own app, take a look at our implementation guide.
Did you have a good experience? Run into trouble? Let us know!
Except as otherwise noted, the content of this page is licensed under the Creative Commons Attribution 4.0 License, and code samples are licensed under the Apache 2.0 License. For details, see the Google Developers Site Policies. Java is a registered trademark of Oracle and/or its affiliates.
Источник
Google Cloud Messaging: экономим батарею и нервную ткань с помощью Push-уведомлений
Содержание статьи
Здорово, когда у твоего приложения есть возможность постоянно получать апдейты с сервера. Конечно, реализовать периодические сетевые запросы легко, мы с тобой такое не раз делали. Однако, если дюжина приложений будет постоянно стучаться к своим управляющим серверам, батарея телефона или планшета разрядится еще до полудня.
Введение
Чтобы программисты не изобретали велосипед, в мобильных устройствах появилась система Push-уведомлений. Это сервис коротких сообщений, которые отправляются централизованно через серверы вендора ОС. Разработчики операционки самостоятельно реализуют периодическую связь устройства с сервером так, чтобы и сообщения приходили вовремя, и ресурсы устройства максимально экономились. Режим энергосбережения, роуминг, оптимальная длина сессии — обо всем этом уже позаботились, создав технологию Push.
Компания Google разработала API под названием Google Cloud Messaging, он доступен как для Android, так и для iOS. Использовать этот сервис можно совершенно бесплатно, то есть даром. Посмотрим, что же это за зверь и чем он хорош!
Google Cloud Messaging работает на всех ОС Android версии 2.2 и выше. Он предоставляет возможность удаленно отправить сообщение в приложение, ранее установленное на мобильное устройство. Полезный объем данных ограничен четырьмя килобайтами, при этом содержание таких сообщений может быть произвольным: от текстового уведомления для пользователя до системных команд приложению. В случае если мобильное устройство не в сети или включен режим энергосбережения, GCM создаст очередь из сообщений и доставит их позднее.
Как это работает
Во многих устройствах на базе Android есть приложения от Google с различной функциональностью, за правильную работу Push-сообщений отвечает пакет Google Play Services. Если такой пакет установлен, устройство периодически обращается к серверу с запросом о наличии новых Push-сообщений. Частота таких запросов зависит от многих параметров: способа интернет-соединения, состояния батареи и прочего. При этом для экономии трафика у пользователя есть возможность вообще отключить такой сервис.
Push-серверы служат «прослойкой» между устройством-получателем и отправителем сообщения. От разработчика, использующего GCM, требуется составить сообщение, следуя несложному синтаксису, а затем отправить POST-запрос на сервер Google, который в дальнейшем самостоятельно доставит сообщение на устройство.
Отправленное на устройство Push-сообщение имеет единственного конечного адресата — это приложение с уникальным идентификатором, другие приложения доступа к нему не получат. Для обработки полученных сообщений в приложении нужно реализовать методы, доступные через Google Play Services. Этим сегодня и займемся.
Рис. 1. Схема работы Google Cloud Messaging
Xakep #207. Дистанционное банковское ограбление
Регистрация
Как ты уже мог догадаться, главное звено в сервисе GCM — это серверы Google. Облако от этой компании осуществляет пропускной контроль и берет на себя все хлопоты по доставке сообщений, поэтому первым шагом будет регистрация в системе.
Для работы с GCM требуется создать несколько ключей доступа, их выдают после регистрации приложения на сайте Google (ссылка есть во врезке). Нужно указать точное название приложения и полное имя проекта. В результате ты получишь два уникальных параметра: Server Key и Sender ID. Важный момент: если проект или название приложение изменятся, ключи придется генерировать заново.
Также на странице регистрации есть большая синяя кнопка Generation configuration files. Она сформирует конфиг-файл google-services.json, в котором зашиты все необходимые параметры для работы сервиса, в том числе ключи. Чтобы добавить этот конфиг-файл в проект, просто скопируй его в корень папки app, где лежат исходные коды приложения.
Приложение будет использовать готовые инструменты, реализованные в Google Play Services, поэтому нужно подключить дополнительные модули к проекту. В Android Studio это делается путем правки файлов Gradle: в конфиг проекта подгружаем класс Google Services, а в конфиге приложения — плагины GCM и Google Play.
Манифест-файл
Теперь идем править манифест проекта. Чтобы сэкономить батарею, Android старается побыстрее отправлять устройство в сон, снижая расход батареи и уменьшая частоту процессора. Это может помешать передаче и приему данных, поэтому у приложения должна быть возможность воспрепятствовать такому маневру.
Чтобы стать получателем Push-сообщений, нужно добавить разрешение под названием C2D_MESSAGE, при этом в параметре name должно быть полное имя пакета.
В нашем приложении будут модули из Google Play Service, об этом нужно тоже написать в манифесте. Сервис GcmReceiver отвечает за прием сообщений от сервера, а также в случае необходимости помогает устройству не уйти в режим экономии энергии:
Обрати внимание, что еще совсем недавно (до октября прошлого года) Push-уведомления можно было отправить сервисом Cloud to Device Messaging, подключая соответствующее разрешение c2dm.permission.RECEIVE, теперь он окончательно закрыт.
Проверки
Как показывает практика использования различных API от Google, генерация ключей и устранение зависимостей — самые трудоемкие задачи. Реализация же логики API в проекте довольно проста: нужно только создать несколько объектов и переопределить их классы, отвечающие за получение и отправку данных. На устройстве может не быть приложений от Google, в этом случае придется отказаться от Push-сообщений. Проверка на наличие API выполняется следующим образом.
Токен
Ввести приложение в элитный клуб получателей Push-сообщений поможет один из методов Google API. Вызвать его будет удобно, воспользовавшись классом IntentService. Так же как и его родительский класс Service, он позволяет выполнять в фоне различные ресурсоемкие задачи, например сетевые вызовы. Главное преимущество IntentService в том, что после выполнения всех задач он будет самостоятельно остановлен системой, тогда как обычный Service продолжит висеть в фоне, ожидая команды stopSelf() или stopService(). Класс регистрации в GCM назовем RegistrationIntentService.
Собственно, разработчики Google все подготовили для нас, осталось только нажать большую красную кнопку и наслаждаться результатом. В GCM API есть класс InstanceID, способный самостоятельно сформировать сетевой пакет с регистрационными данными и отправить его на сервер. От разработчика требуется только указать уникальный идентификатор пакета (Sender ID, еще он иногда называется Project number). А если файл google-services.json был скопирован правильно, то переменная gcm_defaultSenderId сама появится в Android Studio.
Метод getToken возвращает еще один уникальный параметр — идентификатор устройства, на котором установлено приложение с включенным сервисом GCM. Этот токен пригодится чуть позже для отправки сообщений, поэтому его нужно как-то передать из приложения на сервер разработчика. В этот раз Google, к сожалению, не поможет, сетевую функциональность нужно реализовать самому. Но не так давно в статье о библиотеках я писал про Retrofit, тут она будет как раз к месту.
Компания Google рекомендует периодически обновлять токен, чтобы избежать его компрометации и использования злоумышленниками. Чтобы инициировать из приложения перевыпуск ключа, достаточно просто еще раз вызвать метод getToken. Еще можно с сервера отправить команду на обновления токена, за обработку такой команды в приложении отвечает класс InstanceIDListenerService. Наличие в приложении такого сервиса обязательно, без него GCM не заработает.
В этом классе существует единственный метод onTokenRefresh, он будет вызван системой в тот момент, когда приложение получит команду на обновление. Основная задача этого метода — запустить IntentService, содержащий InstanceID.
Сообщения
Разберем теперь особенности формирования сообщения. В GCM есть возможность отправлять сообщения как с сервера, так и с мобильного устройства на другие устройства с таким же приложением. При этом логика построения запросов сохраняется, разница будет только в полях адреса и отправителя.
Push-сообщения имеют организованную структуру с обязательными полями, необходимыми для авторизации отправителя и получателей. Для удобства разработчиков сообщения могут быть в формате JSON или XML, сегодня мы будем использовать JSON как более прогрессивный.
От сервера
Концепция GCM предполагает, что разработчик обладает веб-сервером, с которого будет идти рассылка сообщений. Для отправки сообщения с сервера на мобильное устройство (downstream message) нужно отправить запрос вот такого формата:
Формат общения не так сложен: на сервер Google методом POST отправляется HTTP-запрос, в теле которого содержится JSON-сообщение. Отправитель идентифицируется с помощью ключа Server key, который был выдан при регистрации, а получателем сообщения будет одно конкретное устройство, обладающее токеном, полученным из InstanceID.
Топики
Вполне вероятна ситуация, когда требуется отправить одинаковое сообщение сразу группе устройств. Для этого не нужно закидывать Google одинаковыми запросами, достаточно поменять адресата. В GCM есть возможность организовать своего рода подписку на топики новостей: чтобы создать рассылку всем подписчикам, достаточно в поле получателя указать что-то вроде
В этом примере сообщение получат все устройства, которые подписаны на топик xakep. Отмечу, что параметр «/topics/» является обязательным и неизменным.
Группы
Подписка на топики делается только внутри приложения, что не всегда удобно. Есть возможность со стороны сервера объединить несколько устройств в группу и рассылать им сообщения. Вот как будет создана группа pahomovGroup.
Принцип тот же — нужно указать регистрационные данные, а затем название группы и токены входящих в группу устройств, пустую группу создать нельзя.
От клиента
Приложение с реализованным GCM может посылать сообщения другим устройствам, на которых установлено приложение с такими же идентификаторами (upstream message). Для такой задачи есть класс с неожиданным именем GoogleCloudMessaging:
Отправить сообщение возможно какому-то конкретному приложению или на сервер с поднятым сервисом XMPP, разослать послание группе или подписчикам топика, к сожалению, нельзя.
Данные для сообщения задаются через класс Bundle путем генерации связки ключ — значение. Чтобы сформировать пакет и отправить запрос, достаточно вызвать метод send с указанием токена получателя, уникального ID сообщения (случайное число) и полезной нагрузки:
Получение сообщений
Получать сообщения довольно просто — в Google API, который мы уже подключили, доступен класс GcmListenerService. Его нужно явно объявить в проекте и переопределить единственный метод. Когда на устройство поступит новое сообщение, в приложении будет вызван метод onMessageReceived. В аргументах будут все необходимые данные: имя отправителя и тело POST-запроса, обернутое в объект класса Bundle. Так как в JSON информация хранится по принципу ключ — значение, получить данные из поля extra возможно вот таким способом:
Уведомления для пользователя выводятся с помощью классов NotificationManager и NotificationCompat.Builder. Сначала задается структура сообщения: его заголовок, основной текст и иконка, которая будет видна в панели уведомлений:
Затем нужно подключиться к сервису в Android, который отвечает за все уведомления в системе:
Вывод сообщения осуществляет метод notify, при этом сообщению нужно придумать уникальный внутри приложения идентификатор.
Рис. 2. Пример уведомления
Подписываемся на топики
Теперь реализуем подписку на топики, о которых мы говорили ранее. Чтобы подписаться на набор топиков, достаточно в цикле вызвать метод subscribe из класса GcmPubSub.
Теперь, если устройство получит сообщение, которое адресовано подписчикам таких топиков, будет вызван метод onMessageReceived.
Генерация сообщений
Сформировать POST-запрос по указанным требованиям можно разными способами. Если под рукой есть Linux-машина с консолью, то рекомендую тебе утилиту cURL, она позволяет отправлять и принимать сетевые запросы самых разных форматов. К примеру, вот так будет выглядеть сообщение от сервера с указанием токена:
Troubleshooting
При использовании GCM больше всего вопросов возникает на этапе подготовки. Использование самых свежих библиотек требует актуальной версии сборщика: модули Google Play Services, которые мы подключали в этой статье, будут работать с Gradle версией не ниже 2.10. Для этого в Android Studio выбрать параметр Use default Gradle wrapper и подправить distributionUrl в файле gradle-wrapper.properties.
Рис. 3. Настройка Gradle в Android Studio
В случае если приложение не проходит регистрацию в системе, от Google приходит одна-единственная ошибка service_not_available. В первую очередь нужно посмотреть, корректно ли при регистрации на сайте были заданы имя приложения и название пакета. У меня такая ошибка возникала из-за нестабильного интернет-соединения, на Stack Overflow советуют проверить настройки даты и времени, а также разрешения в манифест-файле.
Заключение
Push-уведомления — невероятно удобная вещь, которая используется практически в каждом приложении. Такими сообщениями принято напоминать о различных акциях, скидках и новостях, что побуждает пользователя чаще открывать приложение. Как ты смог убедиться, компания Google создала очень удобный API, работать с которым — одно удовольствие. Для лучшего понимания материала скачай с нашего сайта подробные исходники приложения, а также примеры запросов с помощью cURL. Если останутся вопросы — обязательно пиши мне на почту. Удачи!
Источник