Рубріки: Back-end

Як надсилати push-повідомлення на Android та iOS з Laravel: інструкція

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

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

Отож, для довідки, почну з визначення.

Push-повідомлення це сповіщення зазвичай невеликого розміру, яке періодично з’являється у додатках чи в браузері.

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

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

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

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: як я навчилася вирішувати непрості задачі

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

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

IT в Україні йде до свого фінального кінця. І потраплятимуть туди виключно за покликом душі

Коротко про українську IT-сферу у 2024 році Це коли на одну вакансію Middle розробника по…

26.03.2024

Блокчейн-розробка сьогодні: зарплати і перспективи на ринку праці

Формування криптовалютної галузі в Україні почалося ще у 2014 – саме тоді з'явилися перші стартапи,…

18.03.2024

Скільки рішень ухвалює розробник? Погляд новачка, який запускає продукт

Автор цього блогу — Python-девелопер Сергій Солдатов, який вирішив створити досить унікальний продукт. І це…

12.03.2024

Чи треба готуватись до співбесіди?

Думки шукачів діляться на: «так, однозначно» і «ні, не вартує, я все і так про…

04.03.2024

Відкладаєте до останнього? Що таке «синдром студента» і як з ним боротися

Синдром студента — це форма прокрастинації, яка полягає в тому, що людина, якій дали завдання,…

23.02.2024

Вчимося працювати з Git: основи конфігурації, гілки, додавання файлів та директорій

Git — це найпопулярніша CVS прямо зараз, яка дозволяє відстежувати історію розробки і спільно працювати.…

20.02.2024