4

У меня есть Firebase childAdded прослушиватель событий для таблицы уведомлений в моем приложении, что я хотел бы запускать push-уведомления, когда приложение находится в фоновом режиме.Слушатель Firebase, когда приложение находится в фоновом режиме

Вот слушатель:

@objc func observeNotificationsChildAddedBackground() { 
    self.notificationsBackgroundHandler = FIREBASE_REF!.child("notifications/\(Defaults.userUID!)") 
    self.notificationsBackgroundHandler!.queryOrdered(byChild: "date").queryLimited(toLast: 99).observe(.childAdded, with: { snapshot in 
     let newNotificationJSON = snapshot.value as? [String : Any] 
     if let newNotificationJSON = newNotificationJSON { 
      let status = newNotificationJSON["status"] 
      if let status = status as? Int { 
       if status == 1 { 
        self.sendPushNotification() 
       } 
      } 
     } 
    }) 
} 

func sendPushNotification() { 
    let content = UNMutableNotificationContent() 
    content.title = "Here is a new notification" 
    content.subtitle = "new notification push" 
    content.body = "Someone did something which triggered a notification" 
    content.sound = UNNotificationSound.default() 

    let request = UNNotificationRequest(identifier: "\(self.notificationBackgroundProcessName)", content: content, trigger: nil) 
    NotificationCenter.default.post(name: notificationBackgroundProcessName, object: nil) 
    UNUserNotificationCenter.current().delegate = self 
    UNUserNotificationCenter.current().add(request){ error in 
     if error != nil { 
      print("error sending a push notification :\(error?.localizedDescription)") 
     } 
    } 
} 

Это прекрасно работает, когда приложение находится на переднем плане. Затем я добавить фоновую наблюдателя в своих делегатов приложение applicationWillResignActive метод, чтобы наблюдать его в фоновом режиме:

func applicationWillResignActive(_ application: UIApplication) { 
    NotificationCenter.default.addObserver(self, selector: #selector(MainNavViewController.observeNotificationsChildAdded), name: notificationBackgroundProcessName, object: nil) 
} 

Но наблюдатель событие не срабатывает, когда приложение работает в фоновом режиме. Ive посмотрел в Firebase Cloud Посланник, чтобы решить эту проблему и через сообщения, как это:

Is it possible to send PushNotifications, using Firebase Cloud Messaging (FCM) to special UDID, directly from device?

однако я не пытаюсь отправить уведомление толчка от одного пользователя к другому, я пытаюсь активировать UNNotificationRequest изнутри слушателя базы данных.

Я также нашел этот пост: FCM background notifications not working in iOS , но опять же, это отличается от моего случая использования, потому что его используют в FIRMessaging рамках.

Итак, возможно ли запустить этот прослушиватель базы данных, когда приложение находится в фоновом режиме? Если нет, возможно ли, чтобы Firebase Cloud Messenger наблюдал изменения в таблице и отправлял уведомление?

ответ

1

Устройства имеют свой собственный способ управления фоновыми сетевыми вызовами, поэтому обработка фоновых push-уведомлений, подобных этому, не будет работать на реальных устройствах. Наблюдатели удаляются из памяти вскоре после того, как приложение переходит в фоновый режим. Я смог решить это, создав сервер Node.js, который наблюдает таблицу notifications и обрабатывает push-уведомления с использованием инфраструктуры Firebase-Messenger. Это было довольно легко. Я использовал этот блог, как мой гид: Sending notifications between Android devices with Firebase Database and Cloud Messaging

Этот метод будет работать, однако в тренажере (, но не на реальных устройствах) до тех пор, как вы передаете объект, содержащий наблюдателя (приложение делегата в данном случае) в фоновый поток:

func applicationWillResignActive(_ application: UIApplication) { 
    NotificationCenter.default.addObserver(self, 
              selector: #selector(self.observeNotificationsChildAddedBackground), 
              name: notificationBackgroundProcessName, 
              object: self) 
} 
1

Простым решением является использование фоновой выборки. Вы также можете использовать фоновый выбор, чтобы периодически получать таблицу для новых записей и показывать уведомление, если новая строка добавлена.

Это не гарантирует немедленное получение уведомлений. Но реализация намного проще по сравнению с использованием APN.

+0

Это, безусловно, отличный вариант, который я изучил. Это не сработало для меня лично, потому что мне нужно, чтобы уведомления были вживую, где этот метод вызывает периодические изъятия. –

2

У меня была такая же проблема и наткнулся на ваше сообщение несколько месяцев назад. Мне удалось наконец понять, что требуется для наблюдения за уведомлениями в фоновом режиме.

Я подробно решение, которое я использую в этой должности https://stackoverflow.com/a/42240984/7048719

Методика заключается в следующем

  1. использовать пользовательский класс службы данных
  2. инициализацию sharedInstance из данных класс обслуживания
  3. вызов соответствующей функции в службе данных e class sharedInstance с вашего начального контроллера.

Таким образом, наблюдатель остается в памяти

Update: Apple, внедрили обновления в отношении фоновых режимов, которые прекратили этот метод работать.

+0

@DustinSpengler Спасибо, надеюсь, это полезно. Помните об использовании памяти в отношении наблюдателей с помощью бомбардировщиков, но в противном случае с этой системой в течение долгого времени с большим успехом – shektek

Смежные вопросы