NIFCLOUD-mbaas / UserCommunity

ニフクラ mobile backend ユーザーコミュニティ
https://mbaas.nifcloud.com/
82 stars 18 forks source link

MonacaアプリのPUSH通知の使い方でinstallationが削除された時 #814

Open OnlineKanazawa opened 6 years ago

OnlineKanazawa commented 6 years ago

Monacaを用いてアプリを作成し、NCMBをPUSH通知の送受信に使用しております。

ユーザー数が多くなってきた中で、リリース初期から登録しているユーザーの中にPUSH通知を受信できなくなったユーザーが現れております。 対象のユーザーのobjectIdをデータストアのinstallationから絞込み機能で検索してもデータが見つかりません。 調べた中で下記URLのドキュメントにある「アプリがアンインストールされた端末情報(installation)の自動削除」によってデータが削除されたものかと推測しております。

http://mb.cloud.nifty.com/doc/current/common/dev_guide.html#%E3%83%97%E3%83%83%E3%82%B7%E3%83%A5%E9%80%9A%E7%9F%A5%E3%81%AB%E3%81%A4%E3%81%84%E3%81%A6

iOSやAndroidのドキュメントには「PUSH通知の基本的な使い方」の中に「installationが削除された時を考慮する場合」という項目があり対策方法が書かれていますが、Monacaのドキュメントにはそれがなく、代わりになるコードも見つかりません。

どなたか再登録の仕方がわかる方がいらっしゃいましたら、教えていただけますと幸いです。 Cordovaバージョンは6.2.0、ncmbのプラグインバージョンは2.0.4で、Installationの登録は下記のコードでdevicereadyの後に毎回実行しております。

window.NCMB.monaca.setDeviceToken( "apikey", "clientkey", "sendkey" );

宜しくお願いします。

goofmint commented 6 years ago

Monacaの場合、同機能はあらかじめ組み込まれています。ただ、再登録のため、データは同じobjectIdではなくなっているようです。 `getInstallationIdで探してみてください。

function getInstallationId() {
  // 登録されたinstallationのobjectIdを取得します。
  window.NCMB.monaca.getInstallationId(function(id) {
    alert("installationID is: " + id);
  }
)};

http://mb.cloud.nifty.com/doc/current/push/basic_usage_monaca.html#Monaca%20側の設定

OnlineKanazawa commented 6 years ago

回答ありがとうございます。 goofmintさんのおっしゃる通り、getInstallationIdで取得は試みておりますが、新しいobjectIdが得られません。

setDeviceTokenでコールバックが使えることに気付きましたので、コードを下記に修正して検証してみました。


window.NCMB.monaca.setDeviceToken(
    "apikey",
    "clientkey",
    "sendkey",
    function() {
        // 成功時のコールバック
        window.NCMB.monaca.getInstallationId(function(id) {
            alert("installationID is: " + id);
        }
    },
    function(err) {
        // 失敗時のコールバック
        alert(JSON.stringify(err));
    }
);

検証手順

  1. アプリを起動することで新しいobjectIdが登録される
  2. NCMBの管理ページのinstrallationデータストアから登録したobjectIdを検索して削除する
  3. アプリを再起動して再登録を確認する

検証結果

Androidでは再登録時にエラーが出ましたが、もう一度再起動させると再登録できました。 エラーが出たときの詳細は下記の通りです。

{
    "code":"E404001",
    "message":"Failed to save registration ID."
}

しかし、iOSでは何度再起動させてもエラーとなってしまいます。 エラーの中身は下記の通りです。

{
    "E404001":"code",
    "installation save error.":"message"
}

エラー後にgetInstallationIdでobjectIdを取得してみると、Androidではnull、iOSでは消したはずのobjectIdが返されます。

また、NCMBプラグインのバージョンを2.0.6にアップデートして同様の検証をしてみました。 Androidでは2.0.4のときと同じ結果となりました。 iOSでは問題なくobjectIdが再登録されました。


ひとまず、プラグインのバージョンアップでアプリの問題は解決しそうです。 ありがとうございました。