ru:https://highload.today/blogs/kak-otpravlyat-push-soobshheniya-na-android-i-ios-iz-laravel-instruktsiya/ ua:https://highload.today/uk/blogs/yak-nadsilati-push-povidomlennya-na-android-ta-ios-z-laravel-instruktsiya/
logo
Back-end      04/07/2022

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

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

Full-Stack Developer в Grid Dynamics

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

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

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

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

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

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

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

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

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

composer require edujugon/push-notification

English For IT: Communication.
Почни легко працювати та спілкуватися з мультикультурними командами та міжнародними клієнтами. Отримайте знижку 10% за промокодом ITCENG.
Інформація про курс

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

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.

Розмовна англійська.
Після цього курсу ви зможете спілкуватись з іноземцями і цікаво розкажете про себе.
Приєднатися

Этот материал – не редакционный, это – личное мнение его автора. Редакция может не разделять это мнение.

Топ-5 самых популярных блогеров марта

Founder at Shallwe, Python Software Engineer (Django/React)
Всего просмотровВсего просмотров
95
#1
Всего просмотровВсего просмотров
95
Career Consultant в GoIT
Всего просмотровВсего просмотров
90
#2
Всего просмотровВсего просмотров
90
CEO & Founder в Trustee
Всего просмотровВсего просмотров
43
#3
Всего просмотровВсего просмотров
43
Рейтинг блогеров

Ваша жалоба отправлена модератору

Сообщить об опечатке

Текст, который будет отправлен нашим редакторам: