2016-11-09 9 views
0

私はRailsアプリケーションを開発している、と私は特定のアクションが発生したときに特定のユーザーにウェブプッシュ通知を送りたい、例えば:特定のユーザー

ユーザーはタイマーを追跡し始めたが、タイマーは6時間以上実行されています。その後、アプリはそのユーザーにウェブ通知を送信します。

私は調査を行っていて、this tutorialが見つかりました。著者はRailsのプッシュ通知を実装していますが、ユーザーを特定する方法についての洞察はありません。

私が理解したところでは、プッシュ通知を取得するにはブラウザから登録する必要がありますが、各ユーザーが複数のブラウザからアプリケーションを使用できるため、通知を自動的に登録/彼らが使用しているすべてのブラウザ?

答えて

0

したがって、notification_subscriptionモデルをUserモデルに追加しました。私JavaScriptを

は、私は、現在のブラウザのサブスクリプションが存在うかどうかを確認:

this.serviceWorkerReady() 
    .then((serviceWorkerRegistration) => { 
    serviceWorkerRegistration.pushManager.getSubscription() 
    .then((pushSubscription) => { 
     if (pushSubscription && _.includes(subscriptionEndpoints, pushSubscription.endpoint)) { 
      return; 
    } 

    this.subscribe(); 
    }); 
}); 

私は現在のサブスクリプションは、ユーザー保存されたエンドポイントですでに存在しているかどうかを確認し、そうでない場合は登録してください。サブスクリプションで

私は、ユーザーに新しいサブスクリプションを追加し、バックエンドに新しいエンドポイントを送信します。

$.post(Routes.users_subscriptions_path({ format: 'json' }), { 
    subscription: subscription.toJSON() 
}); 

その後、私はすべてのエンドポイントにユーザーに通知を送信することができます

def push_notifications_to_user(user) 
    message = { 
     title: "A message!", 
     tag: 'notification-tag' 
    } 

    user.notification_subscriptions.each do |subscription| 
     begin 
     Webpush.payload_send(
      message: JSON.generate(message), 
      endpoint: endpoint, 
      p256dh: p256dh, 
      auth: auth, 
      api_key: public_key 
     ) 
     rescue Webpush::InvalidSubscription => exception 
     subscription.destroy 
     end 
    end 
    end 

webpush gemは、エンドポイントが無効である場合にはInvalidSubscription例外を発生させ、そのエンドポイントを破棄してユーザーからの有効なエンドポイントのみを保持することができます。

0

エンドポイントはブラウザによって一意であるため、新しいエンドポイントとともにユーザーの情報を送信するために、アプリの上部に追加の認証方式が必要です。

+0

これを拡張できますか?私はアプリケーション内での認証のためにDeviseを使用していますが、ユーザーのすべての購読を保存し、これらの購読すべてに通知を送信することを考えていました。ただし、購読**の有効期限は切れることはありませんが、実際に有効期限が切れる方法についての詳細はほとんどありません。 –

+0

正確には、すべてのサブスクリプションを同じアプリケーションレベルのIDでパッケージ化しておく必要があります。私は失効について別途質問します。 – Salva

1

は、あなたがそれを格納する場合、サーバー上のエンドポイントに(ユーザーID IE)のメタデータを添付する必要があります:私は、ユーザーIDに署名するか、秘密のトークンを使用することをお勧め第2のケースで

@subscription = Subscriptions.new endpoint: params[:endpoint] 

@subscription.user = current_user 
// or if you send with AJAX the user id together with the endpoint 
@subscription.user = User.find params[:user_id] 

、そうしなければ、誰かが別のユーザーであるかのようにプッシュ通知を購読することができます。

次に、そのユーザーIDに属するすべてのエンドポイントをデータベースから削除して、すべてのデバイスを登録解除することができます。

しかし、私はそれが良い習慣ではないと思います。ユーザはデバイス上の通知を受信したい場合があります。

プッシュ通知のユーザー認証を自分で管理したくない場合は、このサービスを使用できます。特にこの機能:https://pushpad.xyz/docs/identifying_users

関連する問題