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

Posted

技术标签:

【中文标题】使用swift杀死应用程序时如何存储ios推送通知【英文标题】:How to store ios push notifications when the app is killed using swift 【发布时间】:2019-06-06 08:11:45 【问题描述】:

我用自己的服务器,用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】:

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

    “通知服务扩展”添加到您的应用中。 在您的应用中启用后台获取/远程通知功能。 在您的应用中启用“App Groups”,并通过您的“Notification Service Extension”启用它。

    现在您可以使用“应用程序组”访问您的数据库,并且可以在收到通知后立即将通知插入到您的数据库中。

使用“App Group”访问数据库,

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

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

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

为了将您的文件访问到扩展,请按照下图进行操作。

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

【讨论】:

感谢您的回答。这是我第一次使用这种方法。能否详细说明第3步、第4步,并提供一些代码?比如第3步,我只需要打开App和Notification Service扩展App Groups即可? 用 Point3 的图像更新了答案。您需要在第一次创建数据库时添加使用 Appgroup 创建数据库的代码(可能是您的数据库助手类)。之后,在服务扩展的 didReceiveNotificationRequest 方法中添加插入数据库的代码。 非常感谢您用图片指导我,让我完全明白!但是我仍然不知道代码要添加到哪里。是否在 AppDelegate.swift 中,我从中获取 FCM 消息并将其存储在 Realm 数据库中? @sinnnnenene 更新了我的答案。请检查。 谢谢你的解释,我使用的是Realm数据库,但是在NotificationService中无法导入RealmSwift和Firebase。我不明白。这里没有关于 FCM 的信息。如何存储信息?

以上是关于使用swift杀死应用程序时如何存储ios推送通知的主要内容,如果未能解决你的问题,请参考以下文章

如何在 ios 中单击通知时接收数据,当应用程序被杀死时,(react-native-fcm 模块在 IOS 中获取推送通知)

应用程序被杀死时未收到 IOS 13 VOIP 推送通知

如何将推送通知令牌存储到外部数据库 - iOS 10,Swift 3

iOS React 在应用程序被杀死时推送通知

应用程序被杀死/关闭/未打开时的 IOS 推送通知操作

当 iOS 应用程序被暂停/杀死并且用户点击通知时如何处理 Firebase 推送通知?