ユーザーのサブスクリプション登録
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 を参照してください。
通知履歴 (NotificationHistiory)
これまでに受信したプッシュ通知およびそのコンテンツの値が含まれる反復子を返します。この値は バッジ、本文、アイコン、イメージ、タグ、タイムスタンプ、タイトル、URL になります。
プッシュ・マネージャのサブスクリプション
プッシュ・マネージャの Subscription には、ユーザーのサブスクリプション詳細として次の 2 つ (SubscriptionObject と Endpoint) のプロパティが含まれます。
プロパティ
SubscriptionObject
SubscriptionObject は、ユーザーのサブスクリプション詳細を返すエンコードされた文字列です。プッシュ通知を送信するためにこの値を設定する場合、この SubscriptionObject は変更できません。
SubscriptionEndpoint
SubscriptionEndpoint は一意の URL で、ユーザー・エージェントを指し示した後、サービスワーカーに通知を転送します。
プッシュ通知の送信
PRIM_SRVM.HttpPushMessage
プッシュ通知の生成、暗号化、送信を管理します。
Define_Com Class(#Prim_srvm.HttpPushMessage) Name(#Push)
プロパティ
ClaimsSubject
JWT クレームで使用する、アプリケーションのアドミニストレータの電子メール・アドレスを指定します。個人の電子メール・アドレスではなく、グループの電子メール・アドレスの使用が推奨されています。
ClaimsTokenTimespan
JWT クレームが有効な時間を秒で指定します。値は 1 から 86,400 の間でなければいけません。
HttpResponse
PushSend メソッドからの HTTP 応答を返します。
PushMessageBadgeUrl
プッシュ通知のバッジとして使用するイメージを指定します。このバッジは通知内容を表示するスペースが十分ではない場合 (スマートフォンの通知センターなど) に表示されます。
PushMessageBody
表示するメッセージ本文の内容を指定します。
PushMessageDirection
列挙値の方向を指定します。値の意味は以下の通りです。
Auto – テキストの方向は使用している ISO 言語により決定されます。
RightToLeft – テキストは右から左に表示されます。
LeftToRight – テキストは左から右に表示されます。
PushMessageIconUrl
プッシュ通知のアイコンとして使用するイメージを指定します。
PushMessageImageUrl
PushMessageIconUrl はプッシュ通知のイメージとして使用するイメージを指定します。すべてのブラウザでサポートされるわけではありません。
PushMessageLang
ISO 形式のプッシュ通知コンテンツの ISO 言語を指定します。
PushMessageRenotify
ユーザーが通知を再度受信するかどうかを指定します。
PushMessageRequireAction
メッセージをユーザーが操作するまで画面に残すか、数秒間表示するのかを指定します。
PushMessageTag
メッセージの識別子を指定します。
PushMessageTimestamp
プッシュ・メッセージに設定するタイムスタンプを指定します。
PushMessageTitle
通知に表示するタイトルを指定します。
PushMessageUrl
通知のクリック時にナビゲートする URL を指定します。この URL は相対パスでも絶対パスでも構いませんが、Web アプリケーションに存在するものでなければいけません。URL が指定されていない場合は、デフォルトではアプリケーションのルート URL にナビゲートされます。
SubscriptionObject
プッシュ通知のユーザー・サブスクリプション登録から返されるエンコードされたサブスクリプション文字列を指定します。
TimeToLive
プッシュメッセージが送信されてから、プッシュ通知がエンドユーザーに表示されるまでの遅延時間を秒単位で指定します。
Urgency
メッセージの優先順位を指定します。非アクティブのユーザーがオンライン状態になった場合、通知はその優先順位と送信された時間の順に表示されます。
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 に適用した例です。
