Flutter协议处理插件protocol_handler的使用

发布于 1周前 作者 h691938207 来自 Flutter

Flutter协议处理插件protocol_handler的使用

简介

protocol_handler 是一个Flutter插件,允许Flutter应用程序注册和处理自定义协议(即深度链接)。通过该插件,开发者可以轻松地让应用响应特定的URL Scheme,从而实现诸如从浏览器打开应用、应用间跳转等功能。

平台支持

平台 支持情况
Android ✔️
iOS ✔️
Linux
macOS ✔️
Windows ✔️

快速开始

安装

在项目的 pubspec.yaml 文件中添加依赖:

dependencies:
  protocol_handler: ^0.2.0

或者直接从GitHub仓库获取最新版本:

dependencies:
  protocol_handler:
    git:
      url: https://github.com/leanflutter/protocol_handler.git
      ref: main

使用方法

Android配置

编辑 android/app/src/main/AndroidManifest.xml 文件,在 <activity> 标签内添加如下代码:

<intent-filter>
    <action android:name="android.intent.action.VIEW" />
    <category android:name="android.intent.category.DEFAULT" />
    <category android:name="android.intent.category.BROWSABLE" />
    <!-- 接受以 myprotocol:// 开头的 URI -->
    <data android:scheme="myprotocol" />
</intent-filter>

iOS配置

编辑 ios/Runner/Info.plist 文件,添加如下内容:

<key>CFBundleURLTypes</key>
<array>
  <dict>
    <key>CFBundleTypeRole</key>
    <string>Editor</string>
    <key>CFBundleURLSchemes</key>
    <array>
      <string>myprotocol</string>
    </array>
  </dict>
</array>

macOS配置

编辑 macos/Runner/Info.plist 文件,同样添加上述iOS部分的配置。

Windows配置

对于Windows平台,需要修改 windows/runner/main.cpp 文件。在文件开头添加以下代码:

#include <protocol_handler_windows/protocol_handler_windows_plugin_c_api.h>

并在 wWinMain 函数中加入以下逻辑:

HWND hwnd = ::FindWindow(L"FLUTTER_RUNNER_WIN32_WINDOW", L"protocol_handler_example");
if (hwnd != NULL) {
  DispatchToProtocolHandler(hwnd);
  ::ShowWindow(hwnd, SW_NORMAL);
  ::SetForegroundWindow(hwnd);
  return EXIT_FAILURE;
}

此外,如果你使用MSIX打包工具,则还需要在 msix_config 中添加 protocol_activation 配置:

msix_config:
  protocol_activation: myprotocol

注册并监听协议事件

接下来,在Dart代码中完成协议注册及事件监听:

import 'package:protocol_handler/protocol_handler.dart';

void main() async {
  WidgetsFlutterBinding.ensureInitialized();
  await protocolHandler.register('myprotocol');
  runApp(MyApp());
}

class HomePage extends StatefulWidget {
  const HomePage({Key? key}) : super(key: key);

  @override
  State<HomePage> createState() => _HomePageState();
}

class _HomePageState extends State<HomePage> with ProtocolListener {
  @override
  void initState() {
    protocolHandler.addListener(this);
    super.initState();
  }

  @override
  void dispose() {
    protocolHandler.removeListener(this);
    super.dispose();
  }

  @override
  Widget build(BuildContext context) {
    // 构建页面UI...
  }

  @override
  void onProtocolUrlReceived(String url) {
    print('接收到的URL为:$url');
  }
}

以上就是关于 protocol_handler 插件的基本用法介绍。更多高级功能和细节,请参考官方文档或示例项目。


更多关于Flutter协议处理插件protocol_handler的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter协议处理插件protocol_handler的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


当然,以下是一个关于如何在Flutter应用中使用protocol_handler插件来处理特定协议的代码示例。这个插件允许你的应用声明它能够处理特定的自定义URL协议,并在点击这些URL时启动你的应用。

首先,确保你已经在pubspec.yaml文件中添加了protocol_handler依赖:

dependencies:
  flutter:
    sdk: flutter
  protocol_handler: ^x.y.z  # 请替换为最新版本号

然后,运行flutter pub get来安装依赖。

接下来,是具体的代码实现。

1. 在AndroidManifest.xml中声明自定义协议

对于Android平台,你需要在AndroidManifest.xml中声明你的自定义协议。假设你的自定义协议是myapp://

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.myapp">

    <application
        ...>
        <!-- 其他配置 -->

        <!-- 声明自定义协议 -->
        <intent-filter>
            <action android:name="android.intent.action.VIEW" />
            <category android:name="android.intent.category.DEFAULT" />
            <category android:name="android.intent.category.BROWSABLE" />
            <data android:scheme="myapp" android:host="*" />
        </intent-filter>
    </application>
</manifest>

2. 在Info.plist中声明自定义协议(iOS)

对于iOS平台,你需要在Info.plist中添加一个CFBundleURLTypes键来声明你的自定义协议。

打开ios/Runner/Info.plist文件,并添加以下配置:

<key>CFBundleURLTypes</key>
<array>
    <dict>
        <key>CFBundleURLSchemes</key>
        <array>
            <string>myapp</string>
        </array>
    </dict>
</array>

3. 在Flutter中使用protocol_handler插件

在你的Flutter应用中,你可以使用protocol_handler插件来监听和处理这些自定义URL。

首先,在Dart代码中导入插件:

import 'package:flutter/material.dart';
import 'package:protocol_handler/protocol_handler.dart';

然后,在你的应用启动时,注册一个URL处理器:

void main() {
  runApp(MyApp());

  // 注册自定义协议处理器
  ProtocolHandler().registerUrlScheme("myapp").listen((Uri uri) {
    // 处理接收到的URI
    print("Received URI: $uri");
    // 你可以在这里添加逻辑来处理URI,比如导航到特定页面
    // Navigator.pushNamed(context, '/handleUri', arguments: uri);
  });
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Protocol Handler Demo',
      home: Scaffold(
        appBar: AppBar(
          title: Text('Flutter Protocol Handler Demo'),
        ),
        body: Center(
          child: Text('Open a myapp:// URL to trigger the protocol handler!'),
        ),
      ),
    );
  }
}

注意事项

  1. 权限:确保你的应用有处理这些URL的权限。
  2. 测试:在实际设备或模拟器上测试你的应用,确保自定义协议能够正确触发应用并打开指定的页面或执行相应的操作。
  3. 平台差异:Android和iOS在URL处理方面有一些差异,确保你已经为每个平台正确配置了必要的权限和设置。

这个示例展示了如何在Flutter中使用protocol_handler插件来处理自定义协议。你可以根据实际需求扩展和修改这个示例。

回到顶部