繁体   English   中英

当使用Swift杀死应用程序时如何存储ios推送通知

[英]How to store ios push notifications when the app is killed using swift

我使用自己的服务器,使用FCM将通知推送到ios设备,推送通知成功,我也使用Realm数据库系统来帮助我存储fcm推送通知,但是只有在以下两种情况下,存储才会成功。 情况1:应用运行时。

案例2:单击以推送横幅通知时,该应用程序被杀死或在后台运行。

但这不是我的主要意图。 我知道当应用程序被杀死时,我无法处理推送通知,因此我希望能够在用户打开应用程序时存储该推送通知。

对不起,我的英语不好。 如果有不清楚的地方,请告诉我。

境界类

class Order: Object {

    @objc dynamic var id = UUID().uuidString
    @objc dynamic var name = ""
    @objc dynamic var amount = ""
    @objc dynamic var createDate = Date()

    override static func primaryKey() -> String? {
        return "id"
    }

    let realm = try! Realm()
    let order: Order = Order()

AppDelegate.swift(当应用程序正在运行时存储fcm消息)

    func userNotificationCenter(_ center: UNUserNotificationCenter, willPresent notification: UNNotification, withCompletionHandler completionHandler: @escaping (UNNotificationPresentationOptions) -> Void) {


        let userInfo = notification.request.content.userInfo //
        print("userInfo: \(userInfo)")

        guard
        let aps = userInfo[AnyHashable("aps")] as? NSDictionary,
        let alert = aps["alert"] as? NSDictionary,
        let body = alert["body"] as? String,
        let title = alert["title"] as? String
        else {
            // handle any error here
            return
        }
        print("Title: \(title) \nBody:\(body)")

        order.name = title
        order.amount = body
        try! realm.write {
            realm.add(order)
        }
        completionHandler([.badge, .sound, .alert])
    }

单击以推送横幅通知AppDelegate.swift(当应用被杀死或在背景微弱时,单击以推送横幅通知)

   func userNotificationCenter(_ center: UNUserNotificationCenter, didReceive response: UNNotificationResponse, withCompletionHandler completionHandler: @escaping () -> Void) {  
        let userInfo = response.notification.request.content.userInfo

        print("userInfo: \(userInfo)")
        guard
            let aps = userInfo[AnyHashable("aps")] as? NSDictionary,
            let alert = aps["alert"] as? NSDictionary,
            let body = alert["body"] as? String,
            let title = alert["title"] as? String
            else {
                // handle any error here
                return
        }
        print("Title: \(title) \nBody:\(body)")

        order.name = title
        order.amount = body
        try! realm.write {
            realm.add(order)
        }
        completionHandler()
    }

请有经验的人来帮助我,非常感谢。

您可以在应用被终止后将通知存储到数据库中。

  1. “通知服务扩展”添加到您的应用中。
  2. 在您的应用中启用后台获取/远程通知功能
  3. 在您的应用中启用“应用组” ,然后在“通知服务扩展”中启用该功能。

在此处输入图片说明

在此处输入图片说明

  1. 现在,您可以使用“ App Groups”访问数据库,并且可以在收到通知后将通知插入数据库中。

要使用“应用程序组”访问数据库,

var fileMgr : FileManager!
let databasePathURL = fileMgr!.containerURL(forSecurityApplicationGroupIdentifier: "<APP_GROUPS_ID>")

从上述代码中,一旦您获得了数据库的路径,就可以对数据库执行插入操作。 这将是您正在执行的常规插入操作。

在此文件中以及下图突出显示的方法中插入用于保存数据的代码。

在此处输入图片说明

要将以下文件访问到Extension中,请执行以下操作。 在此处输入图片说明

如果您需要其他帮助,请告诉我。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM