当应用程序处于后台时,从推送通知中插入 coredata 记录

Posted

技术标签:

【中文标题】当应用程序处于后台时,从推送通知中插入 coredata 记录【英文标题】:Insert coredata records from push notification when app is in background 【发布时间】:2018-03-02 07:56:32 【问题描述】:

当应用程序在后台时,我需要从一个推送通知中将记录插入到 2 个实体的核心数据中,但是当我尝试插入时,它会在从现有记录中获取数据时停止执行,并在另一个通知发生或当用户发生时继续执行点击通知。 我希望在用户未点击推送通知且应用处于后台状态时插入数据。

这是我获取记录并插入的代码部分:

static func insertFromNotificationMessage(_ context: NSManagedObjectContext, message: [AnyHashable: Any]) -> myData        
        var myData : myData?
        context.performAndWait 
            myData = NSEntityDescription.insertNewObject(
                forEntityName: "myData", into: context) as? myData
            myData?.guid = message["id"] as? String
            myData?.title =  message["ttl"] as! String
            let anotherData = anotherData.getByUUID(context, UUID: message["id"] as! String) ?? anotherData.insertFromNotificationMessage(context, details: message)
            myData?.author = author

        do
            try context.saveContextAndWait()
        catch let error
            print("Error\(error)")
        
    
    return myData!


static func getByUUID(_ context: NSManagedObjectContext, UUID : String)-> anotherData?
        let fetchSingleRequest = NSFetchRequest<NSFetchRequestResult>(entityName: "anotherData")
        fetchSingleRequest.predicate = NSPredicate(format: "guid =[c] %@", UUID)
        do
            let fetchedUser = try context.fetch(fetchSingleRequest) as! [anotherData]
            if fetchedUser.count > 0
                return fetchedUser.first
            
        catch
            print("Failed to fetch: \(error)")
        
        return nil
    

【问题讨论】:

请通过在每个“静态函数”前添加 4 个空格来更好地格式化您的代码,我尝试这样做,但编辑器不允许我保存更改。 【参考方案1】:

在应用委托中执行:

func application(application: UIApplication, didReceiveRemoteNotification userInfo: [NSObject : AnyObject], fetchCompletionHandler completionHandler: (UIBackgroundFetchResult) -> Void) 
    YOUR OBJECT CLASS.saveMessage(userInfo) // code to save into core data
    completionHandler(.NewData)

这是我保存数据的示例函数

static func saveMessage(userInfo: [NSObject : AnyObject]) -> Message 

    let alertInfo = userInfo["aps"]?["alert"]!
    let title:String?
    let body:String?

    if let alertTitle = alertInfo!["title"] as? String
        title = alertTitle
        body = alertInfo!["body"] as? String
     else 
        title = userInfo["title"] as? String ?? "CUSTOM TITLE"
        body = alertInfo as? String
    

    let message = Message(date: NSDate(), title: title!, message: body!, isReaded: false)
    DBUtil.saveContext()
    return message

【讨论】:

以上是关于当应用程序处于后台时,从推送通知中插入 coredata 记录的主要内容,如果未能解决你的问题,请参考以下文章

当应用程序处于后台或终止状态时如何增加推送通知批处理计数

当应用程序处于后台状态时,FCM 多个推送通知无法正常工作

当应用程序处于后台状态时,FCM多次推送通知无法正常工作

应用程序在 iOS 11 中处于后台时未收到推送通知

当应用程序处于后台时接收 Apple 推送通知

当应用程序处于后台时,Android 2nd 推送通知有效负载数据未在附加中接收