我已经在我的目标应用程序中实现了NotificationServiceExtension,它工作正常。
创建的 AppgroupID
lazy var persistentStoreCoordinator: NSPersistentStoreCoordinator? = { var coordinator: NSPersistentStoreCoordinator? = NSPersistentStoreCoordinator(managedObjectModel: self.managedObjectModel) let options = [ NSMigratePersistentStoresAutomaticallyOption: true, NSInferMappingModelAutomaticallyOption: true ] let oldStoreUrl = self.applicationDocumentsDirectory.appendingPathComponent("Model.sqlite") let directory: NSURL = FileManager.default.containerURL(forSecurityApplicationGroupIdentifier: AppGroupID)! as NSURL let newStoreUrl = directory.appendingPathComponent("Model.sqlite")! var targetUrl : URL? = nil var needMigrate = false var needDeleteOld = false if FileManager.default.fileExists(atPath: oldStoreUrl.path){ needMigrate = true targetUrl = oldStoreUrl } if FileManager.default.fileExists(atPath: newStoreUrl.path){ needMigrate = false targetUrl = newStoreUrl if FileManager.default.fileExists(atPath: oldStoreUrl.path){ needDeleteOld = true } } if targetUrl == nil { targetUrl = newStoreUrl } if needMigrate { do { try coordinator?.addPersistentStore(ofType: NSSQLiteStoreType, configurationName: nil, at: targetUrl!, options: options) if let store = coordinator?.persistentStore(for: targetUrl!) { do { try coordinator?.migratePersistentStore(store, to: newStoreUrl, options: options, withType: NSSQLiteStoreType) } catch let error { print("migrate failed with error : \(error)") } } } catch let error { //CrashlyticsHelper.reportCrash(err: error as NSError, strMethodName: "migrateStore") print(error) } } if needDeleteOld { self.deleteDocumentAtUrl(url: oldStoreUrl) self.deleteDocumentAtUrl(url: self.applicationDocumentsDirectory.appendingPathComponent("Model.sqlite-shm")) self.deleteDocumentAtUrl(url: self.applicationDocumentsDirectory.appendingPathComponent("Model.sqlite-wal")) } do { try coordinator!.addPersistentStore(ofType: NSSQLiteStoreType, configurationName: nil, at: targetUrl, options: options) } catch var error as NSError { coordinator = nil NSLog("Unresolved error \(error), \(error.userInfo)") abort() } catch { fatalError() } return coordinator }() **EDIT:** lazy var applicationDocumentsDirectory: URL = { let urls = Foundation.FileManager.default.urls(for: .documentDirectory, in: .userDomainMask) return urls[urls.count-1]}() override func didReceive(_ request: UNNotificationRequest, withContentHandler contentHandler: @escaping (UNNotificationContent) -> Void) { self.contentHandler = contentHandler bestAttemptContent = (request.content.mutableCopy() as? UNMutableNotificationContent) if let bestAttemptContent = bestAttemptContent { // Modify the notification content here... print("Mutable Data %@",bestAttemptContent) bestAttemptContent.title = "\(bestAttemptContent.title)" //bestAttemptContent.title = "Notification" let apnsDic = bestAttemptContent.userInfo["aps"] as! NSDictionary // NotificationManager.sharedInstance.handlePushNotification(byUserTapped: true, content: apnsDic) contentHandler(bestAttemptContent) } } // Storing APNS dictionary into database from extension func handlePushNotification(byUserTapped : Bool,content : NSDictionary) { let moduelDataDic = content.mutableCopy() as! NSMutableDictionary let entity2 = NSEntityDescription.entity(forEntityName: "TextMessage", in: CoreDataStorage.sharedInstance.mainQueueCtxt!) let textMsg = NSManagedObject(entity: entity2!, insertInto: CoreDataStorage.sharedInstance.mainQueueCtxt) as? TextMessage let trimmedMessage = (moduelDataDic.object(forKey: "msgbody")! as AnyObject).trimmingCharacters(in: .whitespacesAndNewlines) textMsg?.message = trimmedMessage msgInfo?.toText = textMsg rosterInfo.time = composeMsgDate as Date rosterInfo.addToToMessageInfo(NSSet(object: msgInfo!)) DispatchQueue.main.async { let context = CoreDataStorage.sharedInstance.mainQueueCtxt if let moc = context { if moc.hasChanges { do { try moc.save() } catch { let nserror = error as NSError print("Could not save In NotficationManager \(nserror), \(nserror.userInfo)") } } } } }
在应用程序后台模式下,我正在获取存储在上述 NotificationServiceExtension 方法中的数据,在我的结果中,我可以从 manageObject 表(messageInfo)中获取数据,但没有任何数据进入关系“let setArray = rosterInfo?.toMessageInfo”
let resultPredicate = NSPredicate(format: "messageID == %@", moduelDataDic.object(forKey: "message_id")! as! CVarArg) let messageInfoAry = self.fetchMessagesFromCoreDataWithPredicate(resultPredicate: resultPredicate, sortDescriptorKey: "time", isAscending: true, fetchLimit: false, managedContext: self.getManageObjectContext()) if messageInfoAry.count > 0 { let rosterInfo = (messageInfoAry[0] as! MessageInfo).toRoster let msgInfo = messageInfoAry[0] as! MessageInfo // Here i don't see msgInfo in this relationship but after relaunching my application i can able to see that same object let setArray = rosterInfo?.toMessageInfo
任何人的帮助?