Versions Compared

Key

  • This line was added.
  • This line was removed.
  • Formatting was changed.

コンテンツリストを表示
現在地:

...

ユーザーのサブスクリプション登録

Vapid 公開鍵の取得

PRIM_CAP.PrivateKey.VapidPublicKey

Vapid 公開鍵は、PRIM_CAP.PrivateKey を使ってprime256v1 EC プライベート・キーの PEM ファイルをロードすることで取得できます。ロードが終わると、Vapid 公開鍵が取得でき、この公開鍵が Web アプリケーションに渡すエンコーディングされた文字列を返します。

      Mthroutine Name(GetVapidKey) 
Define_Map For(*RESULT) Class(#Prim_dc.UnicodeString) Name(#result)
#xPushManagerPrivateKeyPath := *TEMP_DIR + 'PrivateKeys' + *PATHDELIM + 'ECPrivatekey.pem'  

If (#PrivateKey.LoadPemFile( #xPushManagerPrivateKeyPath ))  

#result := #PrivateKey.VapidPublicKey  

Endif  

Endroutine  

プッシュ・マネージャ

プッシュ・マネージャは Web コンポーネント内で定義され、プロパティ、メソッド、イベントにアクセスして、ユーザーのプッシュ通知を管理します。

      Define_Com Class(#PRIM_WEB.PushManager) Name(#PushManager)

メソッド

Query

Query はフィールド・サービスワーカーに問い合わせて、ユーザーのプッシュ通知の権限ステータス、プッシュ通知の機能ステータス、ユーザーのサブスクリプションの参照、通知履歴(ブラウザでそれまでにユーザーが受信したメッセージのリスト)を検出します。この処理によって changes イベントが起動し、適切なプロパティが収集されます。

      Mthroutine Name(CheckSubscription)   
#PushManager.Query

...

 
Endroutine

Subscribe

プッシュ通知を受信するためのユーザーのサブスクリプション登録を行います。サービスワーカーでサブスクリプション登録が完了すると、プッシュ・マネージャの changed イベントが起動します。


Evtroutine Handling(#ButtonSubscribe.Click)    

#Subscribing := True  
#PushManager.Subscribe( #xPushManagerVapidPublicKey )  

Endroutine  

Unsubscribe


ユーザーのプッシュ通知受信を停止します。サービスワーカーでサブスクリプション解除が完了すると、プッシュ・マネージャの changed イベントが起動します。
Evtroutine Handling(#ButtonUnsubscribe.Click)     #UnSubscribing := True   #PushManager.Unsubscribe   Endroutine  

イベント

Changed


changed イベントが起動するのは、プッシュ通知のステータスが変更された、またはサブスクリプションの詳細すべてを受信したことを示すためです。つまり、サービスワーカーから取り出されたプロパティは最新であるということです。


Evtroutine Handling(#PushManager.Changed)    

#xPushManagerFeatureStatus := #PushManager.FeatureStatus  
#xPushManagerPermissionsStatus := #PushManager.PermissionStatus  
#xPushSubscriptionObject #xPushSubscriptionEndpoint := ""    

If ((#xPushManagerFeatureStatus = 'Subscribed') *And (#xPushManagerPermissionsStatus = 'Granted'))      

#xPushSubscriptionObject := #PushManager.Subscription.SubscriptionObject    
#xPushSubscriptionEndpoint := #PushManager.Subscription.Endpoint      

#ButtonSubscribe.Enabled := False    
#ButtonUnsubscribe.Enabled := true      

If (#Subscribing)         

#com_self.SendSusbscription       
#Subscribing := False      

Endif

...

   

Else      

If (#UnSubscribing)         

#com_self.UnsubscribeUser       
#UnSubscribing := False      

Endif      

#ButtonSubscribe.Enabled := (#PushManager.FeatureStatus<>Unsupported) *And
(#PushManager.FeatureStatus<>Failed) *And (#PushManager.PermissionStatus<>Denied)    
#ButtonUnsubscribe.Enabled := False    

Endif  

...

 

Endroutine

プロパティ

権限のステータス (PermissionStatus)

該当の Web アプリに対するプッシュ通知の権限をもとに以下の列挙値を返します。

Unknown – 通知の権限が取得されていない、もしくは取得できませんでした。

Granted – ユーザーはプッシュ通知を受信する権限が付与されました。

Denied - ユーザーはこのアプリケーションからのプッシュ通知の受信要求が拒否されました。

Prompt - ユーザーが権限を許可する必要があります。

Failed - 通知ステータスの取得に失敗しました。

...


      #PushNotificationFeatureStatus := #PushManager.FeatureStatus   
#PushNotificationPermissionsStatus := #PushManager.

...

PermissionStatus 

機能のステータス (FeatureStatus)

FeatureStatus は Web アプリケーションのサービスワーカーとプッシュ通知の受信時ステータスをもとに、以下の列挙値を返します。

Unsupported - ユーザーが使用しているブラウザがプッシュ通知をサポートしていないか Web アプリケーションが PWA をサポートしていません。もしくはその両方です。

NotSubscribed – アプリケーションは通知をサポートしていますが、ユーザーのサブスクリプション登録がまだ行われていません。

Subscribed - ユーザーはプッシュ通知を受信するためのサブスクリプションが登録されています。

Pending - サービスワーカーがまだサブスクリプション登録を処理しています。

Failed - プッシュ通知サブスクリプションの作成時にエラーが発生しました。

...


#PushNotificationFeatureStatus := #PushManager.FeatureStatus  
#PushNotificationPermissionsStatus := #PushManager.

...

PermissionStatus 

サブスクリプション登録 (Subscription)

ユーザーのサブスクリプションへの参照を返します。詳細については、プッシュ・マネージャの Subscription を参照してください。

通知履歴

これまでに受信したプッシュ通知およびそのコンテンツの値が含まれる反復子を返します。この値は バッジ、本文、アイコン、イメージ、タグ、タイムスタンプ、タイトル、URL になります。


プッシュ・マネージャのサブスクリプション

プッシュ・マネージャの Subscription には、ユーザーのサブスクリプション詳細として次の 2 つ (SubscriptionObject と Endpoint) のプロパティが含まれます。

プロパティ

SubscriptionObject
SubscriptionObject は、ユーザーのサブスクリプション詳細を返すエンコードされた文字列です。プッシュ通知を送信するためにこの値を設定する場合、この SubscriptionObject は変更できません。
SubscriptionEndpoint
SubscriptionEndpoint は一意の URL で、ユーザー・エージェントを指し示した後、サービスワーカーに通知を転送します。

プッシュ通知の送信

PRIM_SRVM.HttpPushMessage
プッシュ通知の生成、暗号化、送信を管理します。
Define_Com Class(#Prim_srvm.HttpPushMessage) Name(#Push)

プロパティ

ClaimsSubject
JWT クレームで使用する、アプリケーションのアドミニストレータの電子メール・アドレスを指定します。個人の電子メール・アドレスではなく、グループの電子メール・アドレスの使用が推奨されています。

...

ValidationMessage
プッシュ通知の検証でエラーになった場合、エラーの詳細とともに値を返します。

メソッド

SendPush

プロパティを使用してプッシュ通知を構築し、暗号化したものを HTTP 経由で送信します。この処理には入力パラメータとして、Vapid 公開鍵の作成に使用するプライベートキーが必要です。
通知の送信前に設定する必要がある必須プロパティもあります。この必須プロパティは以下の通りです。

SubscriptionObject、ClaimsSubject、ClaimsExpiry、PushMessageTitle
Mthroutine Name(Send)   Define_Map For(*INPUT) Class(#xPushManagerSubscriptionStatus) Name(#iStatus) Mandatory(*SQLNULL)     Define_Com Class(#prim_Capi.PrivateKey) Name(#PushPrivateKey)     If (#PushPrivateKey.LoadPemFile( #COM_SELF.GetPrivateKeyPath ))       #Push.PushMessageBadgeUrl := #xPushMessageBadge     #Push.PushMessageBody := #xPushMessageBody     #Push.PushMessageDirection := #xPushMessageDirection     #Push.PushMessageIconUrl := #xPushMessageIcon     #Push.PushMessageImageUrl := #xPushMessageImage     #Push.PushMessageLang := #xPushMessageLanguage     #Push.PushMessageRenotify := #xPushMessageRenotify     #Push.PushMessageRequireAction := #xPushMessageRequireAction     #Push.PushMessageTag := #xPushMessageTag     #Push.PushMessageTimestamp := #xPushMessageTimestamp     #Push.PushMessageTitle := #xPushMessageTitle     #Push.PushMessageUrl := #xPushMessageData     #Push.ClaimsTokenTimespan := #xPushMessageClaimsExpiry     #Push.ClaimsSubject := #xPushMessageClaimsSubj#Push.TimeToLive := #xPushMessageTimeToLive     Select Fields(#xPushSubscriptionObject) From_File(xPushSubscriptions)          #Push.SubscriptionObject := #xPushSubscriptionObject          If (#Push.SendPush( #PushPrivateKey ))              #PushNotificationHttpIsSuccessfulRequest := #Push.HttpResponse.IsSuccessfulRequest            #PushNotificationHttpResponseCode := #Push.HttpResponse.HttpStatusCode              If (#PushNotificationHttpIsSuccessfulRequest.not)               #PushNotificationHttpErrorCode := #Push.HttpResponse.ErrorCode               #PushNotificationHttpErrorMessage := #Push.HttpResponse.ErrorMessage            Endif          Else           #PushNotificationHttpErrorMessage := #Push.ValidationMessage          Endif        Endselect    Endif    Endroutine

以下はこれらの機能を PWA に適用した例です。
Image Removed
 
コンテンツリストを表示Image Added