Push通知が多めに飛んできてしまう事案を解決する

せっかちな人用

CloudKit Dashboardにて要らないSubscriptiond Typesを消してください

はじめに

一部界隈において、論理的な思考をしないことで有名な私です。
理屈をコネるよりも手を動かそう。

CoreDataの取り扱いがうまく行ったことで調子に乗って、CloudKitを使ったPush通知に手を出しました。

そして今、なんとなくうまく動いているように見えて何かがおかしいソースコードを前に頭を抱えています。ここ何日か試行錯誤を繰り返しています。

現状の課題

現時点での課題を整理します。

  • バッジの数がリセットされない
  • 出した覚えの無い余計な通知が飛ばされる
  • プライベートデータベースに保存した内容を確認できない

バッジの数については今も増え続けています。
1500くらいになっています。困る。

一度に解決できれば良いのですが、そうもいかないので、一つずつ相手していきます。

今回立ち向かうお相手は?

出した覚えの無い余計な通知が飛ばされる件
です。

私の場合は、CoreDataに3件データを追加しその情報がPush通知されるはずが、実際は15件の通知が飛んでくる状態でした。

原因

func application(_ application: UIApplication, didRegisterForRemoteNotificationsWithDeviceToken deviceToken: Data)にて発行したSubscription(CKQuerySubscription)が残り続けていたことが原因です。

アプリの削除をしたり、通知の際に渡す情報を変えたりしても、すでに発行されたSubscriptionはそのまま生き残るようです。これが残っていると、通知のたびにそれぞれのSubscriptionが動きます。

対応

単純にきれいに掃除します。

CloudKit Dashboardで目的のコンテナのパネルを開きます。Schemaをクリック。

左上のRecordTypesをSubscriptions Typesに切り替えます。

写真では1つですが、左ペインに何やらずらずらと並びます。その中から不要なものを削除してください。
record typeが表示されているため消してはいけないものを消すことはないんじゃないかなと思います。

これでお目当ての通知だけが来るようになりました。

後で調べること

今回はDashboardで直接消しましたが、これってソースコードから消せるようにしておいたほうが良いですよね……
アプリを入れ直して初めて起動したとき、以前のSubscriptionを削除するとか。

課題を潰してもまた新たな課題が出てきますね〜