業務アプリケーションにおいて、アプリがバックグラウンドまたは終了状態にある場合でも、重要な業務フローの発生(他ユーザーによる申請など)をリアルタイムでユーザーに通知する機能は、ユーザビリティを向上させるために不可欠です。しかし、Delphi環境でGoogleのFCM等の制約を受けることなく、各デバイスメーカー(Huawei、Xiaomi、OPPO、Vivoなど)のプッシュ通知を統一的に扱うのは容易ではありません。
DPushを導入することで、クライアント側のオフライン受信とサーバー側の各メーカーへの配信を一元的に管理できるようになります。本記事では、kbmMW Server環境にDPushのサーバーコンポーネントを統合し、通知システムを構築する手順を解説します。
実装を開始する前に、DPushサービスの契約と初期設定が必要です。管理コンソールから以下の接続情報を取得してください。
- プッシュサーバーアドレス: APIリクエストのエンドポイントURL
- 認証情報: AppName, AppKey, APIアカウント, API暗号化キー
これらの情報は、kbmMWサーバーがDPushプロキシサーバーへアクセスし、メッセージを中継するために使用されます。アーキテクチャとしては、kbmMW ServerがDPushプロキシを経由して各メーカーのプッシュサーバーへ通信を行い、最終的に端末へ通知が届く流れとなります。
以下に、Delphiコードによる具体的な実装例を示します。
まず、Leo.PushServer.DPush.Appユニットを参照し、アプリケーションの起動時や初期化処理にてサーバー登録を行います。この登録処理は、DPushプロキシサーバーとの接続確立を意味します。
uses Leo.PushServer.DPush.App;
procedure RegisterPushService;
var
ServiceEndpoint: string;
AppIdentifier: string;
AppAccessKey: string;
ApiUser: string;
ApiSecret: string;
begin
// 設定ファイルや環境変数から各種キーを取得する想定
ServiceEndpoint := 'http://dpush.yseas.com/your_service_url';
AppIdentifier := 'YourAppName';
AppAccessKey := 'YourAppKey';
ApiUser := 'ApiAccountName';
ApiSecret := 'ApiSecretKey';
// プッシュサーバーの登録を実行
// 第1引数のKeyは、後ほどメッセージ送信時にインスタンスを特定するために使用されます
TLeoDPushServerAppGroup.GetAddApp(
AppIdentifier, // 管理用キー (AKey)
ServiceEndpoint, // サーバーアドレス (AServerUrl)
AppIdentifier, // アプリ名 (AAppName)
AppAccessKey, // アプリキー (AAppKey)
ApiUser, // APIアカウント (AAccount)
ApiSecret // APIシークレット (APwd)
);
end;
GetAddAppメソッドはクラスメソッドであり、指定されたキーが既に登録されている場合はそのプロキシを返し、未登録の場合は新規にインスタンスを生成して登録します。これにより、TLeoDPushServerAppProxyオブジェクトを通じてメッセージの送信が可能となります。
続いて、実際の通知送信処理を実装します。以下は、特定のユーザーに対してメッセージを送信するメソッドの例です。
function TBusinessService.DispatchNotification(const AArgs: array of Variant): string;
var
TargetUserID, Header, Summary, PayloadJson, ErrorMsg: string;
PushProxy: TLeoDPushServerAppProxy;
begin
// 引数の解析
TargetUserID := AArgs[0]; // 送信対象のユーザーIDまたはアカウント
Header := AArgs[1]; // 通知タイトル
Summary := AArgs[2]; // 通知概要
PayloadJson := AArgs[3]; // JSON形式のペイロードデータ
try
// 登録時に指定したキー(ここではAppIdentifierと同じと仮定)でプロキシを取得
PushProxy := TLeoDPushServerAppGroup.FindApp('YourAppName');
if Assigned(PushProxy) then
begin
// 通知の送信を実行
if PushProxy.SendPush(TargetUserID, Header, Summary, SO(PayloadJson), ErrorMsg) then
begin
// ログ記録等の成功処理
WriteLog('プッシュ通知の送信に成功しました。');
Result := 'OK';
end
else
begin
// エラー処理
WriteLog('プッシュ通知送信エラー: ' + ErrorMsg);
Result := ErrorMsg;
end;
end
else
begin
WriteLog('プッシュサービスが見つかりません。初期設定を確認してください。');
Result := 'SERVICE_UNAVAILABLE';
end;
except
on E: Exception do
begin
WriteLog('例外が発生しました: ' + E.Message);
Result := E.Message;
end;
end;
end;
使用されるSendPushメソッドのシグネチャは以下の通りです。
function TLeoDPushServerAppProxy.SendPush(const aAccount, ATitle,
ASubject: string; const ASeriaNetData: ILeoSuperObject;
out AErrorMsg: string): Boolean;
各パラメータの仕様は以下の通りです。
aAccount: 通知を受け取るユーザーの識別子(アカウント名やID)ATitle: 通知のタイトルASubject: 通知のサマリーまたは本文ASeriaNetData: JSON形式の追加データペイロードAErrorMsg: エラー発生時に詳細メッセージを格納する出力パラメータ
開発者はSendPushを呼び出すだけで、DPushプロキシサーバーが各ベンダー(Huawei、Xiaomiなど)への振り分け処理を引き受けます。これにより、複雑な各社APIの差異を意識することなく、クライアントアプリへの通知到達を実現できます。
サーバー側の統合は、大きく分けて「プロキシサーバーの登録」と「通知送信メソッドの実装」の2ステップで完了します。kbmMW Serverの堅牢性とDPushの柔軟性を組み合わせることで、効率的なメッセージング基盤を構築することが可能です。