This is my App
on AppleWatch:
@main
struct AppleWatch_App: App {
@WKExtensionDelegateAdaptor(ExtensionDelegate.self) var delegate
}
and this is my ExtensionDelegate
:
import WatchKit
import UserNotifications
class ExtensionDelegate: NSObject, WKExtensionDelegate, UNUserNotificationCenterDelegate {
let container = CKContainer(identifier: "iCloud.pl.container")
var privateDatabase: CKDatabase {
return container.privateCloudDatabase
}
func userNotificationCenter(_ center: UNUserNotificationCenter, didReceive response: UNNotificationResponse) async {
// it is not called when I change Category record in iCloud, why?
print("notification arrived")
}
func applicationDidFinishLaunching() { // it is called when I launch the app
print("didFinishCalled")
let center = UNUserNotificationCenter.current()
center.delegate = self
Task {
do {
try await center.requestAuthorization(options: [.badge, .sound, .alert])
} catch {}
registerForPush()
}
}
func registerForPush() {
privateDatabase.save(CKRecordZone(zoneName: "fieldservice")) { _, _ in }
let options: CKQuerySubscription.Options = [.firesOnRecordCreation, .firesOnRecordUpdate, .firesOnRecordDeletion]
let categorySubscription = CKQuerySubscription(recordType: "Category", predicate: NSPredicate(value: true), options: options)
let notificationInfo = CKSubscription.NotificationInfo()
notificationInfo.shouldBadge = false
notificationInfo.shouldSendContentAvailable = true
categorySubscription.notificationInfo = notificationInfo
let privateSubscriptionsOperation = CKModifySubscriptionsOperation(subscriptionsToSave: [categorySubscription], subscriptionIDsToDelete: nil)
privateSubscriptionsOperation.database = privateDatabase
let queue = OperationQueue()
queue.maxConcurrentOperationCount = 1
queue.addOperation(privateSubscriptionsOperation)
}
}