iOS 10 で導入されたメッセージ拡張機能は、(私の知る限り) ホスト アプリケーションを必要としない最初の拡張機能です。ホスト アプリを持たないメッセージ拡張機能で CloudKit を使用しようとしています。
私が知る限りCKSubscription
、プッシュ通知に依存しています。UIApplication
ただし、アプリの拡張機能で通常の方法 (経由) でプッシュ通知に登録することはできません。
let app = UIApplication.shared // Error: not available here blah blah blah
CKSubscription
つまり、メッセージ アプリで通知を受け取ることは一見不可能です。新しい に望みはありました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 :(
}
しかし、私の対象であるレコードを更新すると、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 リクエスト/秒を無駄にします)。
物理デバイスとシミュレーターの両方で試しました。