Я использую фон, чтобы использовать FCM
для отправки сообщений на устройство iOS
, я хочу сохранить push-информацию (используя Realm
).
Есть только два случая, которые могут быть успешно сохранены.
1.app работает
2.app убит / фон, и нажмите, чтобы подтолкнуть уведомления баннера
Я надеюсь, что смогу отключить приложение / фон и сохранить его, не нажимая на уведомление о баннере.
Итак, я использовал следующий метод
- Добавление расширения службы уведомлений в проект
- Включить фоновую выборку / Удаленные уведомления
- Расширение службы проектов и уведомлений добавлено в группы приложений
Возникает следующий вопрос. Я использовал то же, что и AppDelegates
в UNNotificationServiceExtension
для хранения push-кода, но это не сработало. Я посмотрел на некоторую связанную информацию. Кажется, что поскольку Extension не может совместно использовать базу данных 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
}
}
класс NotificationService (NotificationService.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)
}
}
}
AppDelegates.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])
}