2

私は PushPad を統合し、それを静的な Push で動作させることができました。今、私はそれをいくつかのPHPおよびJavascript関数と組み合わせて動的にしたいと考えました。これが私のコードです:

<script>
    (function(p,u,s,h,x){p.pushpad=p.pushpad||function(){(p.pushpad.q=p.pushpad.q||[]).push(arguments)};h=u.getElementsByTagName('head')[0];x=u.createElement('script');x.async=1;x.src=s;h.appendChild(x);})(window,document,'https://pushpad.xyz/pushpad.js');

    //Install Pushpad
    pushpad('init', myprojectnumber);
    alert("Pushpad initialised");
    //Check subscribe-status
    pushpad('status', function (isSubscribed, tags){
        //User is already subscribed
        if (isSubscribed){
            alert("Already subscribed");
        //User has not subscribed
        }else{
            alert("Not subscribed");
            //Check in database if this logged-in-user has already subscribed with 5 different devices, if not generate UID and UID_SIGNATURE
            var username = $('#username_show').html();

            alert('Username: ' + username);
            $.ajax
            ({                                        
                type: "POST",
                data: {username: username},
                dataType: "json",
                url: "setNotifications.php",
                cache: false,
                success: function(data)
                {
                    alert("Ajax successfull. UID generated.");

                    if (data.uid != 0){
                        //Set UID and UID-SIGNATURE
                        pushpad('uid', data.uid, data.uid_signature);
                        alert('UID:' + data.uid);
                        //Subscribe
                        pushpad('subscribe', function(isSubscribed){
                            if (isSubscribed){
                                alert("Subscribed");
                            }else{
                                alert("Notifications blocked");
                            }

                        });
                    //Already 5 devices subscribed
                    }else{
                        alert("Already 5 devices");
                    }
                },
                error: function()
                {
                    alert('Error');
                }
            });
        }
    });
</script>

一見すると、すべてが正常に機能します。初めてサイトにアクセスすると、「UID」アラートまでのすべてのアラートがポップアップ表示されます。次に、Chrome からプッシュ通知を受け入れるように求められます。許可をクリックすると、「登録済み」というアラートが表示されます。

ここでサイトを更新すると、「登録済み」アラートまですべてが繰り返されます (ただし、Chrome によるプッシュ通知を許可するよう求められることはもうありません)。以前に購読したことがあるので、「購読済み」というアラートが表示されるはずだと思っていましたが、そうではありません。

誰かが助けてくれれば幸いです:-)

4

1 に答える 1

1

問題は、現在のユーザー (uid)statusのサブスクリプション ステータスを返すことです。サブスクライブの uid のみを設定し、ステータスはそれについて知りません。

これはあなたのコードで何が起こるかです:

  1. ユーザーは実際にプッシュ通知を購読しています
  2. ページを更新します
  3. statusuid = のサブスクリプションがあるかどうかを確認しますnull(まだ設定されていないため、実際のユーザー ID ではありません!)
  4. uid = のサブスクリプションがないため、false を返します。null
  5. サブスクリプション プロセスが再度トリガーされます

解決策は、すべての Pushpad コードを AJAX 成功コールバック内に移動することです。したがって、次のシーケンス:

  1. プッシュパッド('init')
  2. あなたの ajax コールバック
  3. 成功すると、puspad('uid') で uid を設定します
  4. プッシュパッド('ステータス')
  5. pushpad('status') コールバック内で pushpad('subscribe') を使用

ところで、なぜ AJAX コールバックを使用して uid を取得するのですか? Pushpad コードを含むページをレンダリングするときにユーザーが Web サイトにログインしている場合、おそらく既に uid (ユーザーの電子メールまたはデータベース内のユーザーの ID) を知っているでしょう。次のようなことができますpushpad('uid', '<?= $uid ?>', '<?= $uid_signature ?>');

于 2016-05-25T08:43:52.383 に答える