1

Я использую ТСМ для отправки пуш уведомления устройств, использующих этот методКак получить содержимое удаленного уведомления с помощью FCM (iOS)?

func push(message: String, toUser: String) { 
    var token: String? 
    for person in self.users { 
     if toUser == person.username && person.firebaseToken != nil { 
      token = person.firebaseToken 
     } 
    } 
    if token != nil { 
     var request = URLRequest(url: URL(string: "https://fcm.googleapis.com/fcm/send")!) 
     request.httpMethod = "POST" 
     request.setValue("application/json", forHTTPHeaderField: "Content-Type") 
     request.setValue("key=[your FCM Server Key]", forHTTPHeaderField: "Authorization") 
     let json = [ 
      "to" : token!, 
      "priority" : "high", 
      "notification" : [ 
       "body" : message 
      ] 
     ] as [String : Any] 
     do { 
      let jsonData = try JSONSerialization.data(withJSONObject: json, options: .prettyPrinted) 
      request.httpBody = jsonData 
      let task = URLSession.shared.dataTask(with: request) { data, response, error in 
       guard let data = data, error == nil else { 
        print("Error=\(error)") 
        return 
       } 

       if let httpStatus = response as? HTTPURLResponse, httpStatus.statusCode != 200 { 
        // check for http errors 
        print("Status Code should be 200, but is \(httpStatus.statusCode)") 
        print("Response = \(response)") 
       } 

       let responseString = String(data: data, encoding: .utf8) 
       print("responseString = \(responseString)") 
      } 
      task.resume() 
     } 
     catch { 
      print(error) 
     } 
    } 
} 

Но эти устройства просто получают сообщение, ничего не делая с ним. Я также пытаюсь сохранить его содержимое. Как я могу это сделать? Единственный вариант - сохранить его в базе данных Firebase?

Спасибо.

ответ

2

Вам необходимо обрабатывать уведомления через AppDelegate. Сначала вы зарегистрируетесь для уведомлений в файле didFinishLaunchingWithOptions. Поскольку firebase оленьей кожи есть ключ, когда он первый начинает для обмена сообщений, вам необходимо зарегистрироваться, чтобы заметить, что значение, а также:

// register for remote notifications: 
    if #available(iOS 10.0, *) { 
     let authOptions: UNAuthorizationOptions = [.alert, .badge, .sound] 
     UNUserNotificationCenter.current().requestAuthorization(options: authOptions, completionHandler: { (_, _) in }) 
     UNUserNotificationCenter.current().delegate = self 
     FIRMessaging.messaging().remoteMessageDelegate = self 
    } else { 
     let settings: UIUserNotificationSettings = UIUserNotificationSettings(types: [.alert, .badge, .sound], categories: nil) 
     application.registerUserNotificationSettings(settings) 
    } 


    application.registerForRemoteNotifications() 

    NotificationCenter.default.addObserver(forName: NSNotification.Name.firInstanceIDTokenRefresh, object: nil, queue: nil, using: tokenRefreshNotification(_:)) 

и тогда вам нужен способ подключение к ТСМУ:

extension AppDelegate { 
    func connectToFCM() { 
     FIRMessaging.messaging().connect { (error) in 
      if error != nil { 
       print("unable to connect to FCM \(error)") 
      } else { 
       print("connected to FCM") 
      } 
     } 
    } 
} 

И способ справиться, когда вы получаете новый маркер:

extension AppDelegate { 
    func tokenRefreshNotification(_ notification: Notification) { 
     if let refreshedToken = FIRInstanceID.instanceID().token() { 
      UserDefaults.standard.set(refreshedToken, forKey: "registrationToken") 
     } 

     connectToFCM() 
    } 
} 

Наконец, вам нужно на самом деле обрабатывать уведомления. Фактическое содержание нажимного уведомления в объекте «уведомление» для прошивки 10 и выше:

@available(iOS 10, *) 
extension AppDelegate : UNUserNotificationCenterDelegate { 

    // Receive displayed notifications for iOS 10 devices. 
    func userNotificationCenter(_ center: UNUserNotificationCenter, 
          willPresent notification: UNNotification, 
          withCompletionHandler completionHandler: @escaping (UNNotificationPresentationOptions) -> Void) { 

     let userInfo = notification.request.content.userInfo 

     PushService.handle(userInfo) // do whatever you need with this 

    } 
} 

И обрабатывать другие типы уведомлений, вы падаете назад к старому:

func application(_ application: UIApplication, didReceiveRemoteNotification userInfo: [AnyHashable : Any]) { 
    //user tapped on notification 
    PushService.handle(userInfo) // do what you need with the userInfo dict here, which contains the push notification information 

} 
+0

Благодаря! Знаете ли вы, сколько времени уведомление останется, если устройство не получит его? Если я отправлю уведомление, которое говорит «123», а другое устройство будет закрыто, а затем я открою его через неделю, приложение получит нажатие? Или, если приложение открыто, все равно будет вызывать эту функцию для сохранения данных? – MuMtaZ

+0

После того, как уведомление получено на устройстве, оно остается на устройстве, пока приложение не откроется снова. Если приложение было запрограммировано, оно вызывает callReceieveRemoteNotification или эквивалент ios 10 (userNotificationCenter), но если приложение было закрыто, то полезная нагрузка push-уведомления будет содержаться в «вариантах» приложения (didFinishLaunchingWithOptions) –