Рубріки: Back-end

Как отправлять push-сообщения на Android и iOS из Laravel: инструкция

Тетяна Козельська

Привет! Сегодня я хочу поделиться с вами рабочим механизмом отправки push-сообщений на Android и iOS из веб-фреймворка Laravel.

Итак, для справки начну с определения.

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

В моем случае это сообщение на телефоне в мобильное приложение, которое работает через АРI с моим сайтом.

Отправка сообщений на мобильный телефон может происходить при разных потребностях и по разным схемам. К примеру, это может быть регулярная рассылка в конкретные числа месяца. Для реализации такой логики будет удобно использовать Laravel Cron Jobs. Это скрипт, который может вызвать отправку сообщений в нужное время.

Другой вариант, который мне пришлось реализовывать на проекте в Grid Dynamics, — это рассылка на девайсы, как только событие было создано в веб-приложении. Но для любого варианта нам нужно, чтобы работала отправка на мобильный.

Сразу отмечу, что этот функционал невозможно реализовать без знания мобильной разработки.

Поэтому вам нужен Mobile Developer, который обеспечит все необходимые детали со своей стороны. Или вы сами должны знать, как это сделать. У меня есть коллега, который создает мобильные приложения. 

Для работы с push-сообщениями можно использовать curl-запросы, но лично мне этот метод не очень нравится, поэтому я использую библиотеку Edujugon/PushNotification. Она достаточно проста и понятна, а настройки — базовые. Первым нашим шагом будет установка этого расширения с помощью composer:

composer require edujugon/push-notification

Далее нам нужно запаблишить провайдер как это всегда бывает с установкой расширения во фреймворк:

php artisan vendor:publish --provider="EdujugonPushNotificationProvidersPushNotificationServiceProvider" --tag="config"

После этих действий у нас есть файл конфигурации (config/pushnotification.php), где нам нужно внести правки. Этот файл содержит следующий код:

<?php
/**
* @see https://github.com/Edujugon/PushNotification
*/return [
   'gcm' => [
       'priority' => 'normal',
       'dry_run' => false,
       'apiKey' => 'My_ApiKey',
   ],
   'fcm' => [
       'priority' => 'normal',
       'dry_run' => false,
       'apiKey' => env('API_KEY'),
   ],
   'apn' => [
       'certificate' =>  __DIR__ . env('IOS_CERTIFICATE'),
       'passPhrase' => '', //Optional
       'passFile' => '',
       'dry_run' => false,
       'app_bundle_id' => env('APNS_TOPIC')
   ],
];

Здесь у нас есть три элемента в массиве для различных систем: apn для iOS, fcm для Android, gcm для отправки через Google Cloud Messaging. В моем файле внесены изменения для apn и fcm, для каждого из них я использую .env-файл. Почему? Потому что это правильно, и наши данные, указанные в файле, будут изменяться.

Дело в том, что для тестовой и продакшн-сборки мобильных приложений на iOS будут разные файлы сертификатов и топики. Для Android у нас есть только один АРI-ключ для всех окружений. То есть для начала работы у вас должны быть эти ресурсы. Кроме того, в конфигурации вы можете увидеть значение 'dry_run' => false. Если сборка мобильного приложения тестовая, вам необходимо изменить это значение на true

Дальше мы должны узнать идентификаторы наших устройств, куда мы будем посылать сообщения.Для этого нужно добавить в вашу базу данных поле, которое будет хранить этот идентификатор. Получить этот токен можно из АРI. Я использую отдельный запрос, в котором разработчик мобильного приложения присылает мне id. Это может быть один идентификатор для одного аккаунта или несколько идентификаторов для одного пользователя из разных устройств — все зависит от ваших потребностей. Так что в файле роутов для АРI у меня такой маршрут для вложенного пользователя:

Route::post('saveDeviceToken', 'ApiController@saveDeviceToken')->name('saveDeviceToken');

В ApiController.php у вас должен быть метод, который сбережет токен для залогинившегося юзера. Кроме этого, вам необходимо знать операционную систему телефона, поэтому я сохраняю еще одно поле, которое будет указывать на Android и iOS. Думаю, что это довольно простой код и вы знаете, как это сделать. 

Еще один момент, касающийся токена, — это его удаление. Конечно, если токен неактивен или приложение удалено, сообщение отправлено не будет. Можно также добавить роут и функцию для удаления токена.

Следующий шаг к отправке сообщения — информация о том, хочет ли пользователь получать уведомления. Сейчас у нас все чаще есть возможность отказаться от рассылки разного рода сообщений. Поэтому у меня обычно есть флажок в данных пользователя, показывающий, хочет ли он получать нашу информацию или нет. Этот флажок юзер может включить/выключить как в мобильном приложении, так и на веб-ресурсе, если имеет туда доступ. 

Ну и, наконец, самая главная часть всего этого — это сама отправка. Перед кодом отправки у вас может быть множество своих условий, когда и кому отправить. Но у вас точно должна быть выборка пользователей из базы с условием, что они хотят получать сообщения и что у нас есть токен для пользователя. У меня это выглядит так:

$users = User::all()->where('pushNotification', '=', true)->where('deviceTokens', '!=', ' ');

После этого вы можете добавить свои проверки или просто пройти циклом по выбранным данным. Методы отправки на iOS и Android разные, поэтому есть еще одна необходимая проверка на систему. Все это будет выглядеть так:

foreach ($users as $user) {
    if ($user->OSType == 'Android') {
        $service = 'fcm';
        $message = ['notification' => ['title' => ‘Your title’, 'body' => ‘Your description’, 'sound' => 'default']];
    } else {
        $service = 'apn';
        $message = ['aps' => ['alert' => ['title' => ‘Your title’, 'body' => ‘Yout description’], 'sound' => 'default', ‘content-  available' => '1'], 'headers' => ['apns-topic' => env('APNS_TOPIC')]];
    }
    $res = PushNotification::setService($service)>setMessage($message)>setDevicesToken($user->token)>send()>getFeedback();
}

В этом коде я использую библиотеку для отправки сообщений, поэтому в файле, где вы будете производить отправку, также необходимо указать использование файла: 

use EdujugonPushNotificationFacadesPushNotification;

Вот и все. Обязательно проверяйте, что для iOS вы используете правильные данные для нотификации, а именно: сертификат и топик. Соблюдая все условия и успешно получив токен, на тестовый девайс должно прилететь сообщение, которое отправили именно вы. Удачи!

Читайте также: Моя история с Laravel, MongoDB и выдачей токена для API: как я научилась решать непростые задачи

If you have found a spelling error, please, notify us by selecting that text and pressing Ctrl+Enter.

Останні статті

Токсичные коллеги. Как не стать одним из них и прекратить ныть

В благословенные офисные времена, когда не было большой войны и коронавируса, люди гораздо больше общались…

07.12.2023

Делать что-то впервые всегда очень трудно. Две истории о начале карьеры PM

Вот две истории из собственного опыта, с тех пор, когда только начинал делать свою карьеру…

04.12.2023

«Тыжпрограммист». Как люди не из ІТ-отрасли обесценивают профессию

«Ты же программист». За свою жизнь я много раз слышал эту фразу. От всех. Кто…

15.11.2023

Почему чат GitHub Copilot лучше для разработчиков, чем ChatGPT

Отличные новости! Если вы пропустили, GitHub Copilot — это уже не отдельный продукт, а набор…

13.11.2023

Как мы используем ИИ и Low-Code технологии для разработки IT-продукта

Несколько месяцев назад мы с командой Promodo (агентство инвестировало в продукт более $100 000) запустили…

07.11.2023

Университет или курсы. Что лучше для получения IT-образования

Пару дней назад прочитал сообщение о том, что хорошие курсы могут стать альтернативой классическому образованию.…

19.10.2023