Delphi kbmMW ServerにおけるDPush通知機能の実装手法

業務アプリケーションにおいて、アプリがバックグラウンドまたは終了状態にある場合でも、重要な業務フローの発生(他ユーザーによる申請など)をリアルタイムでユーザーに通知する機能は、ユーザビリティを向上させるために不可欠です。しかし、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の柔軟性を組み合わせることで、効率的なメッセージング基盤を構築することが可能です。

7月24日 07:18 投稿