NIFCLOUD-mbaas / UserCommunity

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

AndroidのPush通知時のInvalidRegistrationについて #187

Open Noz-O opened 9 years ago

Noz-O commented 9 years ago

はじめまして。 monacaを使って開発をしています。 monacaから、自サーバーにAjaxでリクエストを飛ばし、 自サーバーからPythonを使ってnifty mobile cloudのAPIにリクエストを飛ばしています。 現在、nifty mobile cloudに端末登録はできているのですが、 Push通知を飛ばすと、「配信済み(一部エラー)」となり、「配信エラー内容」がAndroid InvalidRegistrationとなります。 Push通知自体がはじめての実装なので、どこが間違っているのかご教授いただけないでしょうか。 monacaでのAjax部のコードを添付します。 また、なにか情報が足りない点があれば、わかる範囲で返信いたしますので、どうぞよろしくお願いします。

monacaのコード:

        monaca.getDeviceId( function(deviceId) { 
            localStorage.setItem('deviceId', deviceId);
            $.ajax({
                type: "POST",
                url: "http://xxxx/aaa",
                data: {"device_id":localStorage.getItem('deviceId')},
                success: function(json){
                    $.ajax({
                        type: "POST",
                       url: "http://xxxx/bbb",
                        data: {"device_id":localStorage.getItem('deviceId'),
                                "device_type":device.platform.toLowerCase()},
                        success: function(json){
                            localStorage.setItem('onetime', "created");
                            localStorage.setItem('push', 'ON:プッシュ設定');
                            showRankS();                            },
                        error: function(){
                            alert('プッシュ通知受取り設定に失敗しました。');
                        }
                    });
                },
                error: function(e){
                    alert("登録に失敗しました。")
                }
            });
        });
goofmint commented 9 years ago

エラー自体を見ると、正しくデバイストークンが登録されていないということになりますね。installation クラスに、 window.NCMB.monaca.setDeviceToken を使って登録した場合と同じように保存されているのか確認してもらうのが良いかと思います。 MonacaでNCMBのプッシュ通知プラグインを使うのは無料でできますので、そちらを使ってもらう方が早いかなと。

Noz-O commented 9 years ago

返信ありがとうございます。 教えていただいたとおり、window.NCMB.monaca.setDeviceTokenを使うことで、InvalidRegistrationが解消しました。配信済みのステータスに変わりました。 ありがとうございます。

しかし、登録した端末にPush通知が届きません。 http://mb.cloud.nifty.com/doc/sdkguide/javascript/push.html 上記URLを参考に実装しました。 なにか情報が足りない点があれば、わかる範囲で返信いたしますので、どうぞよろしくお願いします。

monacaのコード:

    document.addEventListener("deviceready", function(){
        if(window.NCMB != undefined){
            // プッシュ通知受信時のコールバックを登録
            window.NCMB.monaca.setHandler
            (
                function(jsonData){
                    // 送信時に指定したJSONが引数として渡されます
                     alert("callback :::" + JSON.stringify(jsonData));
                }
            );
        }
    },false);

nifty mobile cloud側のデータ(データストア):

XXXオブジェクトIDXXX 1.3.6 0 ["Atomos"] XXXデバイストークンXXX android 1.0.0 Asia/Tokyo XXXプロジェクト名XXX 2015-06-24T23:43:30.077+09:00 2015-06-24T23:44:49.239+09:00

nifty mobile cloud側のデータ(Push通知):

配信予定数 2 端末(予定) 配信数 2 端末 配信日時 2015-06-24T23:45:17+09:00 タイトル メッセージ test JSON {"message":"test"} URL 配信期限 1 hour プラットフォーム Android, iOS Android アクション 無し ダイアログ 無し iOS バッジ件数 インクリメントする 音声ファイル 無し カテゴリ 無し content-available 無効 配信端末の絞込条件 searchCondition ※詳しくはREST API リファレンス:クエリの指定方法をご参照ください。 { "channels": "Atomos" }

goofmint commented 9 years ago

@Noz-O Androidですよね…。

  1. Monacaでアプリ名を適切に設定
  2. アプリとしてビルド
  3. NCMBの管理画面でキーを設定

くらいだと思うのですが…。一度、チャンネルを設定しないで送ってみるといかがでしょう?

Noz-O commented 9 years ago

返信ありがとうございます。 ご指摘いただいた点を見直したのですが、通知は届きませんでした。。。

スモールなテストプロジェクトを作って、一から試してみることにします! このたびはご回答いただき、本当にありがとうございました。

Noz-O commented 9 years ago

最小限のアプリを作って実行したところ、うまくいきました。 問題は、「チャンネル設定」がうまくいっていないことでした。 nifty mobile cloud側の端末情報のチャンネルを手動で更新してテストしたのが原因です。 よく考えたら、pythonからAPIのPUTを使って端末情報を更新しているのですが、 それがそもそも更新できていませんでした。 もう少し色々と試してみます。

Noz-O commented 9 years ago

お世話になっております。 試した結果を報告いたします。

・ チャンネル設定について  チャンネル設定は手動でも、APIからの登録でも、配信済みにはなりますが、端末にPush通知は届きませんでした。代案として、「文字列」の新しいフィールドを追加することにより、サーバーごとの配信が可能となりました。 具体的には、データストアのinstallationに「server」というフィールドを追加し、 searchConditionにJSONの["server":"Atomos"]を入れることでサーバー特定ができ、通知も設定された端末に飛ぶようになりました。

他にも躓いている天があるのですが、このスレッドとは別に立てさせていただきます。 色々とアドバイスありがとうございました。今後ともよろしくお願いいたします!