7

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 リクエスト/秒を無駄にします)。

物理デバイスとシミュレーターの両方で試しました。

4

0 に答える 0