パッケージ、リポジトリ、アプリカテゴリを検索

パッケージ詳細v1.1.0

deeplink_rpc

Dartで書かれた、デープリンクを介したRPC通信ライブラリです。これはFlutterモバイルアプリケーション(iOS / Android)専用です。

AndroidiOSmacOSWindowsLinux
30日間ダウンロード
142
いいね数
4
Pub ポイント
130

パッケージをインストール

flutter pub add deeplink_rpc

パッケージ概要

公開情報に基づく選定ガイドです。参考としてご利用ください。

Dartベースのライブラリで、iOSおよびAndroid向けのFlutterアプリケーションにおいて、ディープリンクを通じたRPC(リモートプロシージャコール)通信を可能にします。ディープリンクURLを利用して、アプリ間または単一アプリのコンポーネント間でメソッドを呼び出し、データを交換することで、安全なクロスプラットフォーム間アプリ通信を実現します。モバイル環境とのシームレスな統合を目的としており、構造化されたメッセージ送信をサポートし、従来のネットワーク呼び出しに頼らずにアプリ間連携が必要な状況に最適です。このライブラリはオープンソースであり、Archethic Foundationによって維持管理されています。

用途

  • アプリ間通信
  • Flutter アプリ内のモジュール間メッセージング
  • セキュアなリモートメソッド呼び出し
  • ディープリンクを介した外部アクションの処理
  • データ転送によるシンプルなナビゲーション

主な機能

  • ディープリンクベースのRPC
  • クロスプラットフォーム対応(iOS/Android)
  • セキュアなメッセージシリアライゼーション
  • Flutterとの簡単な統合
  • オープンソースで積極的にメンテナンスされています

適している対象

  • Flutter を使用するモバイルアプリ開発者
  • アプリ間通信を必要とするアプリ
  • セキュアなディープリンクワークフローを実装する開発者
  • 軽量RPCの代替が必要なプロジェクト
  • モジュール型またはマイクロフロントエンドアーキテクチャを構築するチーム

注意事項

  • ターゲットプラットフォームでの適切なディープリンク構成が必要です
  • モバイルおよびデスクトッププラットフォームに限定(Web版なし)
  • 正しいURLスキームのセットアップに依存しています
  • 機密データに対して追加のセキュリティ対策が必要になる場合があります
  • 高周波または低遅延通信には適していません

元の README

関連するソースリポジトリの README 原文のスナップショットです。最新の内容はリポジトリをご覧ください。

Deeplink RPC

A RPC-via-deeplink communication library coded in Dart. This is dedicated to Flutter mobile applications (iOS / Android).

Protocol

Deeplink codec

Deeplink messages are appended to the deeplink URI. Because of that, there are limitations in the available formatting.

To get it working, the message is encoded that way :

                     +--------------+   +------+   +-----------+
method_payload :     | Json Message |-> | gzip |-> | base64Url |
                     +--------------+   +------+   +-----------+


Deeplink Url : `<scheme>://<host>/<method_name>/<method_payload>`

Example :

                     +--------------------------+      +----------------------------------------------------------------+
method_payload :     | { "param1" : "a_value" } |----> | "H4sIAAAAAAAAA6tWUCpILErMNVRSsFJQSowvS8wpTVVSqAUAhIgKchgAAAA=" |
                     +--------------------------+      +----------------------------------------------------------------+


Deeplink Url : `scheme://host/a_method/H4sIAAAAAAAAA6tWUCpILErMNVRSsFJQSowvS8wpTVVSqAUAhIgKchgAAAA=`

Request formatting

Requests payload are encapsulated in a JSON-RPC 2.0 message.

{
  "id": Number,                     // An unique client-generated integer identifying the request
  "replyUrl": String,               // Deeplink URL to which send the invokation result. This should be a Deeplink URL handled by the DApp.
  "params": {
    "origin": {
      "name": String,               // Human readable identifier of the DApp
      "url": String | undefined,    // URL of the DApp
      "logo": Base64 | undefined,   // Logo of the DApp 
    },
    "version": 2,                   // Version of the DApp API
    "payload": Object,              // Method parameters
  }
}
Success Response formatting
{
  "id": Number,                     // The request identifier
  "result":  Object,                // Result payload
}
Failure Response formatting
{
  "id": Number,                     // The request identifier
  "failure": {
    "code": Number,                 // Error code
    "message": String | undefined,  // Error description
    "data": Object | undefined,     // Error data
  },
}

Usage

Server - listening to incoming requests
/// 1. Enable deeplinking for your application (https://docs.flutter.dev/development/ui/navigation/deep-linking)

/// 2. Declare the deeplink-rpc receiver
/// When a RPC call <scheme>://a_rpc_command/<payload> is received, the payload is decoded
/// and transmitted to the `handle` method.
final _deeplinkRpcServer = DeeplinkRpcServer()
    ..registerHandler(
      DeeplinkRpcRequestHandler(
        route: const DeeplinkRpcRoute('a_rpc_command'),
        handle: (request) {
            log('Command received');
        }
      ),
    );


class MyApp extends StatelessWidget {
  const MyApp({super.key});

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'DeeplinkRPC Demo',
      home: const SendForm(),
      onGenerateRoute: (settings) {
        /// 3. Listen to incoming deeplink requests
        if (_deeplinkRpcServer.handleRoute(settings.name)) return;

        // ... do other route generation stuffs here.
        return null;
      },
    );
  }
}
Client - Sending requests and listening for responses
/// 1. Enable deeplinking for your application (https://docs.flutter.dev/development/ui/navigation/deep-linking)
/// It is necessary to receive responses.

/// 2. Declare the deeplink-rpc client
/// When a RPC call <scheme>://a_rpc_command/<payload> is received, the payload is decoded
/// and transmitted to the `handle` method.
final _deeplinkRpcClient = DeeplinkRpcClient();

class MyApp extends StatelessWidget {
  const MyApp({super.key});

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'DeeplinkRPC Demo',
      onGenerateRoute: (settings) {
        /// 3. Listen to incoming deeplink requests
        if (_deeplinkRpcClient.handleRoute(settings.name)) return;

        // ... do other route generation stuffs here.
        return null;
      },
      home: Scaffold(
        floatingActionButton: FloatingActionButton(
          child: const Icon(Icons.send),
          onPressed: () async {
            final response = await _deeplinkRpcClient.send(
              timeout: const Duration(seconds: 5),
              request: DeeplinkRpcRequest(
                requestUrl: 'serverapp://server.app/request_endpoint',
                replyUrl: 'clientapp://client.app/reply_endpoint',
                params: {
                  'param1': 'value1',
                  'param2': 'value2',
                },
              ),
            );

            response.map(
              failure: (failure) {
                log(
                  'RPC request failed',
                  error: failure,
                );
                ScaffoldMessenger.of(context).showSnackBar(
                  SnackBar(
                      content: Text(failure.message ?? "An error occured")),
                );
              },
              success: (result) {
                log(
                  'RPC request succeed : ${json.encode(result)}',
                );
                ScaffoldMessenger.of(context).showSnackBar(
                  SnackBar(content: Text(json.encode(result))),
                );
              },
            );
          },
        ),
        body: const SafeArea(
          child: Padding(
            padding: EdgeInsets.all(8.0),
            child: Center(
              child: Text('Client example'),
            ),
          ),
        ),
      ),
    );
  }
}

カテゴリー

依存関係

依存関係一覧 6 件

ソースリポジトリ

このパッケージを使用しているプロジェクト