将所有从“Firebase 推送通知”接收的消息存储在移动数据库/本地

Posted

技术标签:

【中文标题】将所有从“Firebase 推送通知”接收的消息存储在移动数据库/本地【英文标题】:Store all messages receiving from "Firebase Push Notification" in mobile db/locally 【发布时间】:2020-03-25 10:12:05 【问题描述】:

我正在尝试使用 UserDefaults 将来自 Firebase 推送通知的所有消息存储在移动数据库中。但它只存储最新消息。但我希望数据库存储所有接收消息。请帮我解决这个问题。我被这个困住了。

 let notificationBody = userInfo[AnyHashable("text")]! as! String
 UserDefaults.standard.set(notificationBody, forKey: "notifications") 

---- 这仅打印最后一个通知-----

【问题讨论】:

【参考方案1】:

每次您使用此代码存储通知时,它都会覆盖当前值。这就是您只收到最新消息的原因。您可以创建一个通知数组并将其存储在 userDefaults 中。那么每次收到新通知时,您都可以将新通知附加到 UserDefaults 中的当前通知数组中

首先你为通知创建一个可编码的类

class FNotifications: Codable 
  let fnotifications:[FNotification]

    init(fnotifications:[FNotification]) 
        self.fnotifications = fnotifications
    


class FNotification: Codable 

    let id:String
    let type:Int
    let header:String
    let description:String
    let date:String
    let badge:Int
    var status: UInt8

    init(id:String,type:Int,header:String,description:String,date:String,badge:Int,status:UInt8, recordID:String) 
        self.id = id
        self.type = type
        self.header = header
        self.description = description
        self.date = date
        self.badge = badge
        self.status = status
    

然后您可以创建一个 FNotification 数组并将其存储到 userDefaults(仅在您第一次要创建数组时。第二次您可以获取保存的数组并向其附加新通知)

//define notification array when its first time
var notification: [FNotification] = []

//add new notification to array
notification.append(FNotification(id: "" ,type: "",header: "", description: "", date:"" , badge: 1, status: 1))

do
//save to user defaults
UserDefaults.standard.set(try? PropertyListEncoder().encode(notification), forKey: "notifications")
UserDefaults.standard.synchronize()

catch
    print(error)

使用这种方式保存通知后,您可以获得这样的通知

if let notiArray =  UserDefaults.standard.object(forKey: "notifications") as? Data 
        if notiArray.count != 0 
            notification = try! PropertyListDecoder().decode(Array<FNotification>.self, from: notiArray)
            print("notification \(notification)")
        
 

【讨论】:

我得到了解决方案。参考本教程,youtube.com/watch?v=c4wLS9py1rU 并能够在前台模式下从数据库中插入和获取通知。 感谢您的建议,让我研究一下。 我无法在后台模式下保存通知。你能提出一个解决方案。我不知道该使用哪个代表。 您可以将这些放在 AppDelegate 1 中的以下 firebase 函数中。` func application(_ application: UIApplication, didReceiveRemoteNotification userInfo: [AnyHashable : Any], fetchCompletionHandler completionHandler: @escaping (UIBackgroundFetchResult) -> Void) 2.func application(_ application: UIApplication, didReceiveRemoteNotification userInfo: [AnyHashable : Any]) 我明白了。谢谢。

以上是关于将所有从“Firebase 推送通知”接收的消息存储在移动数据库/本地的主要内容,如果未能解决你的问题,请参考以下文章

Android - 所有 Android 版本都可以接收 Firebase 推送通知吗

应用程序处于前台时未收到 Firebase 推送通知

聊天应用程序的 Firebase 推送通知

Firebase推送通知如何在IOS上运行?

应用关闭时,Firebase消息传递无法接收通知(React Native)

通过 Firebase 推送通知