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-повідомлення це сповіщення зазвичай невеликого розміру, яке періодично з’являється у додатках чи в браузері.

У моєму випадку це повідомлення на телефон у мобільний додаток, який працює через АРІ з моїм сайтом.

Надсилання повідомлень на мобільний може відбуватися за різних потреб та за різними схемами. Наприклад, це може бути регулярна розсилка в конкретну дату місяця. Для реалізації такої логіки буде зручно використовувати Laravel Cron Jobs. Це скрипт, який зможе викликати надсилання повідомлень у потрібний час.

Інший варіант, що мені довелося реалізовувати на проєкті в Grid Dynamics, це розсилка на девайси, щойно подія була створена у вебдодатку. Але для будь-якого варіанту нам треба, щоб працювало відправлення на мобільний.

Одразу треба сказати, що цей функціонал неможливо реалізувати без знання мобільної розробки.

Тому вам потрібен або Mobile Developer, який забезпечить всі необхідні деталі зі свого боку. Або ви самі маєте знати, як це зробити. У мене є колега, який робить мобільні додатки. 

Для роботи з push-повідомленнями можна використовувати curl-запити, але особисто мені цей метод не дуже подобається, тому я використовую бібліотеку Edujugon/PushNotification. Вона є досить простою і зрозумілою, а налаштування базовими. Першим нашим кроком буде встановлення цього розширення за допомогою composer:

composer require edujugon/push-notification

Курс QA від Mate academy.
Найпростіший шлях розпочати кар'єру в ІТ та ще й з гарантованим працевлаштуванням.
Інформація про курс

Далі нам потрібно запаблішити провайдер як це завжди буває із встановленням розширення у фреймворк:

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 у нас є тільки один АРІ-ключ для всіх оточень. Тобто для початку роботи вам треба мати ці ресурси. Окрім того, в конфігурації ви можете бачити значення 'dry_run' => false. Якщо збірка мобільного додатка є тестовою, то вам необхідно змінити це значення на true

Далі ми маємо дізнатися ідентифікатори наших пристроїв, куди ми будемо надсилати повідомлення. Для цього необхідно додати у вашу базу даних поле, яке буде зберігати цей ідентифікатор. Отримати цей токен можна з АРІ. Я використовую окремий запит, в якому розробник мобільного додатка надсилає мені id. Це може бути один ідентифікатор для одного акаунту або декілька ідентифікаторів для одного юзера з різних пристроїв все залежить від ваших потреб. Тож у файлі роутів для АРІ я маю такий маршрут для залогіненого юзера:

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

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

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

Наступний крок до відправлення повідомлення інформація про те, чи хоче юзер отримувати нотифікацію? Зараз ми всі найчастіше маємо змогу відмовитися від розсилки різного роду повідомлень. Тому у мене зазвичай є прапорець у даних юзера, що показує, хоче він отримувати нашу інформацію чи ні. Цей прапорець юзер може ввімкнути/вимкнути як у мобільному додатку, так і в вебресурсі, якщо має туди доступ. 

Ну і, нарешті, найголовніша частина всього цього це саме відправлення. Перед безпосередньо кодом надсилання у вас може бути безліч своїх умов, коли й кому надіслати. Але у вас точно має бути вибірка юзерів з бази з умовою, що вони хочуть отримувати повідомлення і що ми маємо токен для користувача. У мене це має такий вигляд:

Курс-професія "Web Design" від Skvot.
Для тих, хто давно хоче опанувати професію вебдизайнера, але не знає, з чого почати.Після 4 місяців навчання — старт в карʼєрі з двома кейсами у портфоліо.
Програма курсу і реєстрація
$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: як я навчилася вирішувати непрості задачі

Якщо ви знайшли помилку, будь ласка, виділіть фрагмент тексту та натисніть Ctrl+Enter.

Онлайн-курс "Проджект-менеджер в ІТ" від Laba.
Навчіться запускати, контролювати й успішно реалізовувати ІТ-проєкти. Пройти весь шлях проєктного управління на реальному кейсі вам допоможе PMD із 19-річним досвідом в ІТ.
Детальніше про курс

Цей матеріал – не редакційний, це – особиста думка його автора. Редакція може не поділяти цю думку.

Топ-5 найпопулярніших блогерів березня

PHP Developer в ScrumLaunch
Всего просмотровВсього переглядів
2434
#1
Всего просмотровВсього переглядів
2434
Founder at Shallwe, Python Software Engineer (Django/React)
Всего просмотровВсього переглядів
113
#2
Всего просмотровВсього переглядів
113
Career Consultant в GoIT
Всего просмотровВсього переглядів
95
#3
Всего просмотровВсього переглядів
95
CEO & Founder в Trustee
Всего просмотровВсього переглядів
94
#4
Всего просмотровВсього переглядів
94
Рейтинг блогерів

Найбільш обговорювані статті

Топ текстів

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

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

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