Как получать пуши из нескольких источников

Может потребоваться подключить к приложению несколько поставщиков пуш-уведомлений – например edna и Firebase. Статья описывает порядок действий для создания такой интеграции в мобильных приложениях iOS и Android.

Android

  1. Наследуйте сервисы сторонних поставщиков от FcmPushService. Если используете пуш-сервисы Huawei и RuStore, пропишите наследование и для них тоже: HcmPushService (у Huawei две сигнатуры onNewToken) и RcmPushService.
  2. При получении пуша определите источник получения пуша. Проверку можно делать по наличию какого-либо поля, либо по специальному флагу. На стороне edna можем добавить во все пуши от edna флаг origin=edna, для этого обратитесь в службу технической поддержки.
  3. Для пушей от edna вызовите super в методах onMessageReceived и onNewToken.
{
  public void onNewToken(String s) {
    // Отправка пуш-токена другим поставщикам пушей
    super.onNewToken(s);
    }
  public void onMessageReceived(RemoteMessage message)
  {
  // Если Push относится к edna
    if (проверка что уведомление от edna)
      {
        super.onMessageReceived(message);
      }
    else
      {
      //Обработка уведомления от других поставщиков пушей
      }
  }
}

iOS

  1. Пропишите следующие настройки для pushX в методе application DidFinishLaunchingWithOptions в AppDelegate:
let pushXSettings = [
            "auto_register": false //отключает автоматическую подписку на пуш-уведомления
            "proxy_mode": true //переносит регистрацию в пуш-сервисе на уровень приложения
        ]

2. Вызовите метод для подписки на пуши в AppDelegate:

self.registerForRemoteNotification()

func registerForRemoteNotification(){
        let application = UIApplication.shared
        
        UNUserNotificationCenter.current().delegate = self
        application.registerForRemoteNotifications();

        UNUserNotificationCenter.current().requestAuthorization(options: [.badge, .sound, .alert]) { (isOk, error) in
            }
    }

3. Создайте расширение AppDelegate, подпишитесь на получение пушей и, если пуш от edna, передайте его на обработку в EDNAPushX:

extension AppDelegate: UNUserNotificationCenterDelegate{
    func userNotificationCenter(_ center: UNUserNotificationCenter, willPresent notification: UNNotification, withCompletionHandler completionHandler: @escaping (UNNotificationPresentationOptions) -> Void)
    {
        if EDNAPushX.isOriginPush(userInfo://проверка источника пуша notification.request.content.userInfo){
            EDNAPushX.userNotificationCenter(center, willPresent: notification, withCompletionHandler: completionHandler)
        }
    }

    func userNotificationCenter(_ center: UNUserNotificationCenter, didReceive response: UNNotificationResponse, withCompletionHandler completionHandler: @escaping () -> Void)
    {
        if EDNAPushX.isOriginPush(userInfo: //проверка источника пуша response.notification.request.content.userInfo){
            EDNAPushX.userNotificationCenter(center, didReceive: response, withCompletionHandler: completionHandler)
        }
    }
}

4. Для проверки принадлежности пуша к edna используйте метод:

@objc public static func isOriginPush(userInfo: [AnyHashable: Any]) -> Bool

Если по каким-то причинам не хотите передавать все пуши в этот метод, можете самостоятельно проверять и передавать пуш в PushX только при наличии параметра origin=edna.

In this article
Разделы статьи