iOS 10 引入了消息扩展,这是第一个(据我所知)不需要主机应用程序的扩展。我正在尝试在没有主机应用程序的消息扩展中使用 CloudKit。
据我所知,CKSubscription
依赖于推送通知。但是,我无法UIApplication
在应用程序扩展中以通常的方式(通过)注册推送通知:
let app = UIApplication.shared // Error: not available here blah blah blah
CKSubscription
这意味着在消息应用程序中接收通知似乎是不可能的。我确实在 new 中找到了希望UserNotifications.framework
,但它没有提供任何注册远程通知的机制。我试过了:
override func willBecomeActive(with conversation: MSConversation) {
// ...
let center = UNUserNotificationCenter.current()
center.requestAuthorization(options: [.badge, .alert]) { success, error in
if error != nil { fatalError() }
}
center.delegate = self
// ...
}
// MARK: UNUserNotificationCenterDelegate
func userNotificationCenter(_ center: UNUserNotificationCenter, willPresent notification: UNNotification, withCompletionHandler completionHandler: (UNNotificationPresentationOptions) -> Void) {
fatalError() // This never gets called :(
}
但是,当我更新作为 my 主题的记录时CKSubscription
,不会向用户显示任何通知,也不会通知委托人。
这是我的CKSubscription
代码:
let sub = CKRecordZoneSubscription(zoneID: legitimateZone)
let notifInfo = CKNotificationInfo()
notifInfo.alertBody = "Wow it works! Amazing!"
sub.notificationInfo = notifInfo
privateDB.save(sub) { sub, error in
if let e = error {
fatalError("Error saving zone sub: \(e)")
}
print("Saved subscription")
}
如何CKSubscription
在消息扩展中获得通知?
我什至不需要向用户显示通知,也不需要在后台接收它们。我只想知道在我的扩展程序运行时记录何时更新。
如果除了我也愿意听到之外还有其他方法可以做到这一点CKSubscription
(只要它不会不断地轮询 CloudKit,浪费我宝贵的 40 个请求/秒)。
我在物理设备和模拟器上都试过了。