Webのプッシュ通知

質問

Webのプッシュ通知を実装することはできますか?

回答

LANSA V16ではリアルタイムのプッシュ通知の機能が追加されました。
詳細は下記のLANSA Japan Channelの動画をご覧ください。

LANSA Japan Channel

マニュアル

サンプル

1. 秘密鍵

秘密鍵ECPrivatekey.pemを作成してください。
LANSAのTempフォルダにフォルダPrivateKeysを作成し、作成した秘密鍵をその中に保存してください。

IBM i Path 例
/LANSA_dcxpgmlib/x_lansa/tmp/PrivateKeys/ECPrivatekey.pem

Windows Path 例
C:¥Program Files (x86)¥LANSA¥tmp¥PrivateKeys¥ECPrivatekey.pem

2. サーバーモジュール

(1) サーバーモジュールを作成し、下記のコードを貼り付けてください。

Begin_Com Role(*EXTENDS #PRIM_SRVM) Sessionkeymethod(SecureCookie)

Define_Com Class(#PRIM_CAPI.PrivateKey) Name(#PrivateKey)
Define_Com Class(#Prim_srvm.HttpPushMessage) Name(#Push)

Define Field(#PrivateKeyPath) Type(*NVARCHAR)
Define Field(#Vapid) Type(*NVARCHAR)

Define Field(#SubscrptionObject) Type(*NVARCHAR) Length(2048)
Define Field(#SubscrptionEndpoint) Type(*NVARCHAR) Length(2048)

Define Field(#PushHttpIsSuccessfullReuqust) Type(*BOOLEAN)
Define Field(#PushHttpStatusCode) Type(*SIGNED) Length(3) Decimals(0)
Define Field(#PushHttpErrorCode) Type(*NVARCHAR)
Define Field(#PushHttpErrorMessage) Type(*NVARCHAR)

Persist Fields(#PrivateKeyPath)

Srvroutine Name(Start)
#COM_OWNER.StartSession
#PrivateKeyPath := *TEMP_DIR + 'PrivateKeys’ + *PATHDELIM + 'ECPrivatekey.pem’
Endroutine

Srvroutine Name(GetVapidKey) Session(*REQUIRED)
Field_Map For(*OUTPUT) Field(#Vapid) Parameter_Name(Vapid)
If (#PrivateKey.LoadPemFile( #PrivateKeyPath ))
#Vapid := #PrivateKey.VapidPublicKey
Endif
Endroutine

Srvroutine Name(SendPush) Session(*REQUIRED)
Field_Map For(*INPUT) Field(#SubscrptionObject)
Field_Map For(*INPUT) Field(#SubscrptionEndpoint)
Field_Map For(*OUTPUT) Field(#PushHttpIsSuccessfullReuqust)
Field_Map For(*OUTPUT) Field(#PushHttpStatusCode)
Field_Map For(*OUTPUT) Field(#PushHttpErrorCode)
Field_Map For(*OUTPUT) Field(#PushHttpErrorMessage)
* 秘密鍵のロード
If (#PrivateKey.LoadPemFile( #PrivateKeyPath ))
* 送信プロパティの設定
#Push.SubscriptionObject := #SubscrptionObject
#Push.ClaimsSubject := 'メールアドレス’
#Push.ClaimsTokenTimespan := 60
#Push.PushMessageTitle := 'タイトル’
#Push.PushMessageBody := 'メッセージ’
#Push.TimeToLive := 180
* SNIの設定
#Push.SetMiscProperty Name('sni_fqdn’) Value(#SubscrptionEndpoint)
#Push.SetMiscProperty Name('sni_critical’) Value('false’)
* プッシュ通知の送信
If Cond(#Push.SendPush( #PrivateKey ))
* HTTPステータスの確認
#PushHttpIsSuccessfullReuqust := #Push.HttpResponse.IsSuccessfulRequest
#PushHttpStatusCode := #Push.HttpResponse.HttpStatusCode
* HTTPエラーの取得
If Cond(#PushHttpIsSuccessfullReuqust *EQ False)
#PushHttpErrorCode := #Push.HttpResponse.ErrorCode
#PushHttpErrorMessage := #Push.HttpResponse.ErrorMessage
Endif
Else
* 認証エラーの取得
#PushHttpErrorMessage := #Push.ValidationMessage
Endif
Endif
Endroutine

End_Com

(2) 43行目にメールアドレスを指定し、コンパイルしてください。

#Push.ClaimsSubject := 'メールアドレス’

3. Webページ

(1) Webページを作成し、下記のコードを貼り付けてください。

Begin_Com Role(*EXTENDS #PRIM_WEB) Theme(#SYS_THEME) Height(248) Width(640)

Define_Com Class(#PRIM_MD.RaisedButton) Name(#Button_Subscribe) Caption('サブスクライブ’) Displayposition(1) Left(5) Parent(#COM_OWNER) Tabposition(1) Themedrawstyle('MediumTitle’) Top(5) Width(170)
Define_Com Class(#PRIM_MD.RaisedButton) Name(#Button_SendPush) Caption('プッシュ通知’) Displayposition(2) Left(5) Parent(#COM_OWNER) Tabposition(3) Themedrawstyle('MediumSuccess’) Top(46) Width(170)
Define_Com Class(#PRIM_MD.RaisedButton) Name(#Button_Unsubscribe) Caption('アンサブスクライブ’) Displayposition(3) Left(182) Parent(#COM_OWNER) Tabposition(2) Top(5) Width(168) Enabled(False) Themedrawstyle('MediumError’)

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

Define Field(#Vapid) Type(*NVARCHAR) Length(512)

Define Field(#SubscrptionObject) Type(*NVARCHAR) Length(2048)
Define Field(#SubscrptionEndpoint) Type(*NVARCHAR) Length(2048)

Define Field(#PushHttpIsSuccessfullReuqust) Type(*BOOLEAN)
Define Field(#PushHttpStatusCode) Type(*SIGNED) Length(3) Decimals(0)
Define Field(#PushHttpErrorCode) Type(*NVARCHAR)
Define Field(#PushHttpErrorMessage) Type(*NVARCHAR)

Evtroutine Handling(#COM_OWNER.CreateInstance)
Define_Com Class(#KPUSHS.Start) Name(#Start)
#Start.Execute
Endroutine

Evtroutine Handling(#Button_Subscribe.Click)
Define_Com Class(#KPUSHS.GetVapidKey) Name(#GetVapidKey)
#GetVapidKey.Execute Vapid(#Vapid)
#PushManager.Subscribe( #Vapid )
Endroutine

Evtroutine Handling(#PushManager.Changed)
#SYS_WEB.Console.Log Text('PermissionStatus: ' + #PushManager.PermissionStatus)
#SYS_WEB.Console.Log Text('FeatureStatus: ' + #PushManager.FeatureStatus)
If Cond((#PushManager.PermissionStatus *EQ 'Granted’) *And (#PushManager.FeatureStatus *EQ 'Subscribed’))
#Button_Subscribe.Enabled := False
#Button_Unsubscribe.Enabled := True
#SubscrptionObject := #PushManager.Subscription.SubscriptionObject
#SubscrptionEndpoint := #PushManager.Subscription.Endpoint.Remove( 'https://’ )
#SubscrptionEndpoint := #SubscrptionEndpoint.Substring( 1 (#SubscrptionEndpoint.PositionOf( '/’ ) – 1) )
#SYS_WEB.Console.Log Text('SubscriptionObject: ' + #SubscrptionObject)
#SYS_WEB.Console.Log Text('SubscriptionEndpoint: ' + #SubscrptionEndpoint)
Endif
Endroutine

Evtroutine Handling(#Button_SendPush.Click)
Define_Com Class(#KPUSHS.SendPush) Name(#SendPush)
#SendPush.Execute Subscrptionobject(#SubscrptionObject) Subscrptionendpoint(#SubscrptionEndpoint) Pushhttpissuccessfullreuqust(#PushHttpIsSuccessfullReuqust) Pushhttpstatuscode(#PushHttpStatusCode) Pushhttperrorcode(#PushHttpErrorCode) Pushhttperrormessage(#PushHttpErrorMessage)
#SYS_WEB.Console.Log Text('IsSuccessfullReuqust: ' + #PushHttpIsSuccessfullReuqust.AsString)
#SYS_WEB.Console.Log Text('HttpStatusCode: ' + #PushHttpStatusCode.AsString)
#SYS_WEB.Console.Log Text('HttpErrorCode: ' + #PushHttpErrorCode)
#SYS_WEB.Console.Log Text('HttpErrorMessage: ' + #PushHttpErrorMessage)
Endroutine

Evtroutine Handling(#Button_Unsubscribe.Click)
#PushManager.Unsubscribe
#Button_Subscribe.Enabled := True
#Button_Unsubscribe.Enabled := False
Endroutine

End_Com

(2) 以下の3行のKPUSHSを作成したサーバーモジュールの名前に変更してください。

20行目 Define_Com Class(#KPUSHS.Start) Name(#Start)
25行目 Define_Com Class(#KPUSHS.GetVapidKey) Name(#GetVapidKey)
45行目 Define_Com Class(#KPUSHS.SendPush)

(3) Webページの「オフライン サポート」タブの「オフライン サポート」に「Web アプリ マニフェスト/サービスワーカー」を指定してください。

(4) Webページをコンパイルしてください。

4. 実行

(1) 作成したWebページを実行してください。

(2) 「サブスクライブ」ボタンをクリックしてください。プッシュ通知の登録がサブスクライブされます。

(3) 「プッシュ通知」ボタンをクリックしてください。プッシュ通知が送信されます。

(4) 「アンサブスクライブ」ボタンをクリックしてください。プッシュ通知の登録がアンサブスクライブされます。

有償の「LANSAテクニカル・ホットライン・サービス」をご契約いただければ、過去データベースの検索から今回ご紹介した以外の技術情報を探すことも出来ます。 「LANSAテクニカル・ホットライン・サービス」のご契約についてはお問い合わせフォーム(https://www.lansa.jp/inquiryform/)よりお問い合わせください。

LANSAコミュニティに登録する

IBMi(AS/400)をご利用の企業様必読!
LANSAを利用したIBM iの活用方法・成功事例をお届け致します。