Меню

Настройка работы с push уведомлениями через Firebase в мобильном приложении Apache Cordova

Настройка работы с push уведомлениями через Firebase в мобильном приложении Apache Cordova

Задача: Apache Cordova предоставляет удобный способ разработки кроссплатформенных мобильных приложений. В данной статье расскажу, как настроить отправку push уведомлений на платформах iOS и Android с использованием Firebase.
Для отправки Push-уведомления конкретному пользователю с помощью Firebase и Apache Cordova.
Получение токена устройства:
Код
document.addEventListener('deviceready', onDeviceReady, false);
function onDeviceReady() {
    window.FirebasePlugin.getToken(function (token) {
        // Сохраняем этот токен в базе данных сайта
        // alert(token); 
    }, function (error) {
        alert(error);
    });
}

Обновление токена устройства (при смене)
Код
document.addEventListener('deviceready', onDeviceReady, false);
function onDeviceReady() {
    window.FirebasePlugin.onTokenRefresh(function (token) {
        // Обновляем токен в базе данных сайта
        // alert(token);
    }, function (error) {
        // alert(error);
    });
}
В новой версии API что бы поставить звук по умолчанию для уведомления, теперь не подходит просто передать ключ
sound: default в блоке 'notification'
Нужно вот так, под каждую платформу:
Код
$notification = [
    'message' => [
        'token' => $DEVICE_TOKEN,
        'notification' => [
            'title' => 'Новый заказ',
            'body' => '"Еда в Миг" новый заказ N' . $arResult["ORDER"]['ID'],
        ],
        'android' => [
            'notification' => [
                'sound' => 'default'
            ]
        ],
        'apns' => [
            'payload' => [
                'aps' => [
                    'sound' => 'default'
                ]
            ]
        ]
    ],
];
Еще один вариант отправки push через новое API c Oauth токеном.
Можно использовать kreait/firebase-php
Пример:
Код
composer require kreait/firebase-php

И код
Код
require 'vendor/autoload.php';

use Kreait\Firebase\Factory;
use Kreait\Firebase\Messaging\CloudMessage;
use Kreait\Firebase\Messaging\Notification;

// Путь к вашему файлу с учетными данными
$serviceAccount = __DIR__'/ВАШ_ФАЙЛ_С_КЛЮЧАМИ.json';

// Создаем экземпляр Firebase
$factory = (new Factory)->withServiceAccount($serviceAccount);

// Получаем экземпляр Messaging
$messaging = $factory->createMessaging();

// Заголовок и тело уведомления
$title = 'Привет';
$body = 'Я первый пуш';

// Массив токенов устройств, на которые нужно отправить уведомления
$deviceTokens = [
    'token_1',
    'token_2',
    // Добавьте сюда другие токены устройств
];

// Или в топик на несколько устройств
$message = CloudMessage::withTarget('topic', 'allUsers')
    ->withNotification($notification);

foreach ($deviceTokens as $token) {
    // Создаем уведомление
    $notification = Notification::create($title, $body);
    
    // Создаем сообщение
    $message = CloudMessage::withTarget('token', $token)
        ->withNotification($notification);
    
    // Отправляем сообщение
    try {
        $messaging->send($message);
        echo "Уведомление отправлено на устройство с токеном: $token\n";
    } catch (\Kreait\Firebase\Exception\MessagingException $e) {
        echo "Ошибка при отправке уведомления на устройство с токеном $token: " . $e->getMessage() . "\n";
    }
}

И подписка на топик для массовой рассылки push (для персонализированной есть пример выше)
Код
// Запрос разрешения на отправку push
            window.FirebasePlugin.grantPermission(function () {
            }, function (error) {
                // alert(error); Ошибка получения разрешения
            });

            // Подписка на топик для push
            const topic = 'main_topik'; // Замените на имя вашего топика
            window.FirebasePlugin.subscribe(topic, function () {
                //  alert('Successfully subscribed to topic: ' + topic);
            }, function (error) {
                // alert('Error subscribing to topic: ' + error);
            });
            // Styles
Если возникает проблема с pod-ами. Нужно их деинтегрировать, очистить и снова установить:
Код
cd ios
pod cache clean --all
Pod clean
pod deintegrate
sudo gem install cocoapods-deintegrate cocoapods-clean

sudo arch -x86_64 gem install ffi
arch -x86_64 pod repo update
arch -x86_64 pod install
Вариант через homebrew
Код
brew update
brew upgrade ruby
brew link --overwrite cocoapods
sudo gem install ffi
sudo gem install cocoapods
cd ios
pod deintegrate
pod install --repo-update
Видеоуроки по
1С-Битрикс
на моем Boosty канале Видео
Форма ответов
 
Текст сообщения*
Перетащите файлы
Ничего не найдено
Файл
Загрузить файлы
 

Блог-note: заметки разработчика

Помечаем новинки лейблом в каталоге битрикс

Достаточно часто, при разработке каталога товаров или интернет магазина на системе управления Битрикс, встает задача как...

Дополнительные опции/услуги, добавляемые в корзину, в карточке товаров

Задача: в детальной карточке товара сделать возможность добавления услуги или опции, при добавлении товара в корзину.

Показать пользователю накопительную скидку за все сделанные заказы, из модуля маркетинга

Задача: показать, текущему авторизованному, пользователю сумму всех выполненных заказов и процент накопительной скидки- ...

Глобальные фильтры на всякие случаи жизни

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

Вывести артикул в печатную форму бланка заказа

Задача: в печатную форму бланка заказа добавить артикулы товаров и данные о пользователе.

Получение местоположений через API Битрикс c поиском по select.

Если нужно получить список городов из модуля "Местоположения" можно воспользоваться API Битрикс. Данные местоположения м...

Как выводить пользовательские поля и названия разделов инфоблока в Битриксе

Если вам необходимо вывести дополнительное пользовательское поле типа "Привязка к разделам инфоблока", эта записка может...

Прятать или показывать описание раздела каталога

В новых компонентах и шаблонах catalog.section есть не документированный и не выводимый параметр: "Скрывать описание раз...

Вывести список всех пользователей с необходимой информацией

Если нужно, на какой-либо странице сайта, вывести всех пользователей из группы "Зарегистирированные пользователи", прост...