2016-11-09 23 views
0

我正在開發一個Rails應用程序,和我想的Web推送通知發送給特定的用戶,當某些行爲發生,如:Rails中的Web推送通知標識用戶

用戶開始追蹤一個計時器,但該計時器已運行超過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

恰恰是,您需要將所有訂閱_packaged_保留在相同的應用程序級別標識下。我會單獨詢問到期日期。 – Salva

1

你需要的時候你保存它附加的元數據(即用戶ID)到終端服務器上:

@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或使用祕密令牌,否則任何人都可以訂閱推送通知,就好像它是另一個用戶一樣。

然後,您可以從數據庫中刪除屬於該用戶ID的所有端點以取消訂閱他所有的設備。

但我認爲這不是一個好習慣:用戶可能希望在設備上接收通知,而不是在另一個設備上接收通知。

如果您不想自己管理推送通知的用戶身份驗證,則可以使用此服務。此功能特別是:https://pushpad.xyz/docs/identifying_users