如何在后台处理/存储推送内容到核心数据?

在我的应用程序中,我们有一项function,可以将内容接收从推送通知存储到本地核心数据,并且在背景状态下面临数据丢失问题,

我们遵循的步骤:

1 – 在didReceiveRemoteNotification方法中接收推送。

2 – 从推入核心数据中插入新数据(仅在单个类和单个上下文中处理所有核心数据流程)

self.getManagedContext().perform { do { if self.getManagedContext().hasChanges { print("Core Data class: saveChanges.....") try self.getManagedContext().save() } } catch { let saveError = error as NSError print("Core Data class: saveChanges) print("\(saveError), \(saveError.localizedDescription)") } } 

3 – 在屏幕上,从核心数据中读取所有已保存的列表并显示。

案例:

1 – 前景:它工作正常 – 数据存储,可以读取所有数据。

2 – 关闭状态(退出):用户强制关闭应用程序,我们从Web API读取数据以获取基于上次时间戳的所有列表。

3 – 背景:

  -> On App run from Xcode - Debug: We received push notification and can read push data, store in DB. But failed sometimes, we can get stored data on display (some times we can't read all data only even when app is running in XCode). -> Open Installed Application(not run from Xcode) -> App failed to list all stored data (its obviously not stored, can't get single data for push received while background mode ). 

这里有两种情况,我们确信在xcode中添加了content_available和’后台模式’。 请检查

背景模式

  AnyHashable("aps"): { alert = { body = "Hello and 6"; title = "iPhone 6s "; }; badge = 2; "content-available" = 1;} 

1 – 应用程序没有在后台运行,但我们在FCM的推送通知中使用100%确定content_available键,因此app应该带来后台模式silent push notification -> if app is suspended then the system wakes up or launches your app and puts it into the background running state

2 – 应用程序处于挂起状态 – 如何知道应用程序进入挂起状态或本地数据库无法将数据存储到主上下文。

我们在前进的applicationDidEnterBackground上调用saveContext并且每次收到推送(插入成功时)。

请分享是否有任何解决方案/任何其他可能性来处理推送内容以在本地存储,如背景提取(但我们的应用程序需要定期更新推送收到与实时聊天相同)

如果需要更多信息,请告诉我。

谢谢!

注意:Swift 3.3

更新

在iOS 11中,没有在backgrund上调用Push委托方法,这是上述问题的原因。

iOS 10 – >工作正常

在iOS 11中不起作用,但我们可以在调试模式下接收推送委托方法。

任何想法?

[AnyHashable(“gcm.notification.type”):0,AnyHashable(“gcm.notification.msg”):{“extraType”:“Text”,“content”:“Test sound”},AnyHashable(“gcm.message_id” “):0:1531860472186830%c52fb209c52fb209,AnyHashable(”google.cae“):1,AnyHashable(”aps“):{alert = {body =”text body“; title =“Gopi k”; }; badge = 2; “content-available”= 1; sound =默认; }]

任何想法,为什么委托人没有打电话,因为我们在推送消息中添加了"content-available" = 1

谢谢!

问题中的推送通知有效负载包含面向用户的元素以及指示静默通知的content-available标志。 通知不能同时面向用户静默。

您的通知有效负载应该是两个单独的通知,一个用于静默推送,一个用于用户可见通知:

 aps : { alert : { body : "Hello and 6", title : "iPhone 6s ", }, badge : 2, } 

无声推送:

 aps : { "content-available" : 1; } 

您可以使用我的APNS有效负载validation工具来检查您的推送有效负载是否有效。

如果用户强制关闭您的应用,则无声推送不会导致应用被唤醒以执行后台工作。

至于在后台状态下使用CoreData,您会发现一些挑战。

首先,当应用程序在后台并且手机可能被锁定时,CoreData存储必须是可写的。 必须使用非常宽松的数据保护值( NSPersistentStoreFileProtectionKey )创建CoreData持久性存储。

其次,如果您在应用程序处于任何状态但处于活动状态时将CoreData存储打开太长时间,iOS将终止您的应用程序(例外代码0xdead10cc )。 这意味着当应用程序从前台或活动状态转换时,应保存CoreData存储并从内存中删除 – 这必须在后台任务断言中完成。 清理CoreData存储可能需要一些时间,系统可能会在保存过程中终止应用程序,而无需后台任务断言。 当应用程序被静默推送唤醒后台工作时,它将不得不重新创建CoreData存储,执行它必须执行的任何工作,然后干净地保存并从内存中删除存储。 应用程序完成后,不应保留CoreData文件。