了解手表应用何时收到来自 Cloudkit 的推送通知

Knowing when the watch app receives a push notification from Cloudkit

提问人:Duck 提问时间:11/7/2023 更新时间:11/7/2023 访问量:32

问:

我有一个具有 Apple Watch 扩展程序的 App。

两者都使用核心数据。

我已经在两者上启用了 CloudKit 功能。

我已经按照此处所述配置了这两个应用程序

我打开 iOS 应用程序,更改数据库,但手表上没有任何反应。我的意思是,结果不会在手表上更新。

两个问题:

  1. 我是否必须执行某些操作才能推送或接收来自 iCloud 的通知?
  2. 我如何知道手表何时收到来自 iCloud 的通知?这是调试它的方法吗?
iOS Swift SwiftUI Apple-Watch CloudKit

评论

0赞 lorem ipsum 11/7/2023
它们是否共享同一个 iCloud 容器?
0赞 Duck 11/7/2023
是的,同一个容器。
0赞 Paulw11 11/7/2023
这与你之前的问题有关吗?如果监视应用程序未嵌入到 iOS 应用程序中(即它是独立的),则可能需要显式设置 CloudKit 容器 stackoverflow.com/questions/33478860/...
0赞 Duck 11/7/2023
在你提到这个问题后,我已经删除了这个问题。这是我在这里发布的解决方案也解决了另一点。感谢您指出这一点。

答:

0赞 Duck 11/7/2023 #1

我已经按照 Apple 在我提到的文档中所写的内容 100% 配置了我的 iOS 和 Watch 应用程序,并且这些应用程序没有通过 CloudKit 同步。

解决方案是修改为:PersistenceController

import CoreData

struct PersistenceController {
  static let shared = PersistenceController()
  let container: NSPersistentCloudKitContainer
  
  var context: NSManagedObjectContext {
    return container.viewContext
  }
  
  init(inMemory: Bool = false) {
    container = NSPersistentCloudKitContainer(name: "MyApp")
    container.viewContext.automaticallyMergesChangesFromParent = true
    container.viewContext.mergePolicy = NSMergeByPropertyObjectTrumpMergePolicy

    guard let description = container.persistentStoreDescriptions.first else{
      fatalError("###\(#function): Failed to retrieve a persistent store description.")
    }
    
    description.setOption(true as NSNumber, forKey: NSPersistentHistoryTrackingKey)
    
    // Generate NOTIFICATIONS on remote changes
    description.setOption(true as NSNumber, forKey: NSPersistentStoreRemoteChangeNotificationPostOptionKey)
    description.cloudKitContainerOptions = NSPersistentCloudKitContainerOptions(containerIdentifier: "iCloud.com.myCompany.MyApp")

    
    if inMemory {
      container.persistentStoreDescriptions.first!.url = URL(fileURLWithPath: "/dev/null")
    }

    container.loadPersistentStores(completionHandler: { (storeDescription, error) in
      if let error = error as NSError? {
        fatalError("Unresolved error \(error), \(error.userInfo)")
      }
    })
  }
}

然后从 iPhone 和 Watch 中删除应用程序并再次运行。它将立即起作用。