Concept of isometric mobile phone and many icons of sms, mail, messages,calls, emoticons around it. Vector illustration.
Привіт! Сьогодні я хочу поділитися з вами робочим механізмом надсилання 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: як я навчилася вирішувати непрості задачі
Днями я завзято нила про щось ChatGPT (експериментую між сеансами з живим терапевтом). І от…
«Крутіть колесо, щоб отримати знижку до 50%!» «Натисніть тут, щоб відкрити таємничу пропозицію!» «Зареєструйтесь зараз,…
Дуже хочеться робити якісь десктопні апки. Сумую за часами коли всі програми були offline-first, і…
Надсилаючи криптовалюту, багато новачків ставлять запитання: як працюють комісії та чому вони відрізняються в різних…
Нова афера набирає обертів — ось детальний розбір того, як фальшиві потенційні роботодавці намагаються вкрасти…
Соцмережа з можливістю вбудовувати повноцінні додатки прямо в пости — звучить як фантастика, але Farcaster…