我使用后台使用FCM
将消息推送到iOS
设备,我想存储推送信息(使用Realm
)。
只有两种情况可以成功保存。
1.app 运行
2.app 被杀死/后台,点击推送横幅通知 我希望我可以关闭/后台操作应用程序并保存它,而无需单击横幅通知。
所以我使用了以下方法
- 在项目中添加通知服务扩展
- 启用后台提取/远程通知
- 项目和通知服务扩展已添加到应用组
下一个问题出现了。我使用与UNNotificationServiceExtension
中的AppDelegates
相同的方法来存储推送代码,但它不起作用。我查看了一些相关信息。似乎因为扩展无法共享 Realm 数据库,我应该怎么做才能让他们共享数据? ?
还是我的问题不在我的叙述中?请有经验的人指导我,非常感谢,我的英语不好,如果我的问题不清楚,请告诉我。
领域类
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"
}
}
class RealmDao: NSObject {
static let shared = RealmDao()
private var realm: Realm!
private override init() {
self.realm = try! Realm()
}
func getRealmObject() -> Realm {
return self.realm
}
}
类通知服务(通知服务.swift)
import UserNotifications
import UIKit
import RealmSwift
import Realm
class NotificationService: UNNotificationServiceExtension {
//
let realm = try! Realm()
let order: Order = Order()
//
var contentHandler: ((UNNotificationContent) -> Void)?
var bestAttemptContent: UNMutableNotificationContent?
override func didReceive(_ request: UNNotificationRequest, withContentHandler contentHandler: @escaping (UNNotificationContent) -> Void) {
self.contentHandler = contentHandler
bestAttemptContent = (request.content.mutableCopy() as? UNMutableNotificationContent)
let message = request.content.userInfo
print("userInfo: (message)")
guard
let aps = message[AnyHashable("aps")] as? NSDictionary,
let alert = aps["alert"] as? NSDictionary,
let title = alert["body"] as? String,
let body = 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)
}
if let bestAttemptContent = bestAttemptContent {
// Modify the notification content here...
bestAttemptContent.body = "(bestAttemptContent.body) [test]"
contentHandler(bestAttemptContent)
}
}
override func serviceExtensionTimeWillExpire() {
if let contentHandler = contentHandler, let bestAttemptContent = bestAttemptContent {
contentHandler(bestAttemptContent)
}
}
}
应用代表.swift运行保存消息的应用
let realm = try! Realm()
let order: Order = Order()
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])
}
这个问题仍然与你相关吗? 我认为您的问题是任何扩展名的 RAM 都受到某些内存值(我知道的最后一个值 - 是 12 MB)的限制。当您尝试初始化 Realm 数据库时,iOS 会从内存中卸载扩展,因为超出了限制。
就我而言,我能够保存数据,有时无法保存,此时应用程序没有崩溃,只是没有达到结果。但是,如果我开始调试扩展并逐步完成所有初始化行,我会看到在断点代替 Realm init 之后,调试模式被关闭,这表明超出了内存限制。
为了避免这种情况,您可以使用 Realm.Configuration 显式地指定模式。在显式给出模式时,Realm 不会调用 objc_copyClassList(),因为不需要枚举所有类。
let necessaryTypes = [SomeClass.self, AnotherClass.self]
let dataBaseURL = FileManager.default
.containerURL(forSecurityApplicationGroupIdentifier: "yourIdentifier")!
.appendingPathComponent("default.realm")
let config = Realm.Configuration(fileURL: dataBaseURL, objectTypes: necessaryTypes)
let realm = try Realm(configuration: config)