ByteNoteByteNote

字节笔记本

2026年2月19日

appscheme:Flutter 自定义 Scheme URL 深度链接插件

本文介绍 appscheme,一个 Flutter 插件,用于实现 Android 和 iOS 的自定义 Scheme URL 方案,支持深度链接功能。

appscheme 简介

appscheme 是一个 Flutter 插件,用于实现自定义 URL Scheme 方案,允许外部应用或网站通过特定 URL 打开应用并传递数据。该插件支持 Android 和 iOS 双平台。

核心定位:Android、iOS 自定义 Scheme URL 方案

基本信息

  • 插件名称:appscheme
  • 当前版本:1.0.1(最新版 1.2.0)
  • 发布日期:2021年6月5日
  • 发布者:dsfgx.com
  • 平台支持:Android、iOS
  • Pub.devhttps://pub.dev/packages/appscheme

核心功能

appscheme 使 Flutter 应用能够处理自定义 URL Scheme,实现:

  • 深度链接:从外部应用或网页打开应用
  • 数据传递:通过 URL 参数传递数据
  • 应用冷启动处理:获取启动应用的 Scheme
  • 运行时监听:应用运行中接收 Scheme 事件

安装配置

添加依赖

pubspec.yaml 中添加:

yaml
dependencies:
  appscheme: ^1.2.0

然后执行:

bash
flutter pub get

Android 配置

AndroidManifest.xml 中添加 intent-filter:

xml
<activity android:name=".MainActivity">
  <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:host="hong.com"
      android:path="/product"
      android:scheme="app" />
  </intent-filter>
</activity>

iOS 配置

Info.plist 中添加:

xml
<key>CFBundleURLTypes</key>
<array>
  <dict>
    <key>CFBundleURLName</key>
    <string>hong.com/product</string>
    <key>CFBundleURLSchemes</key>
    <array>
      <string>app</string>
    </array>
  </dict>
</array>

使用方法

初始化

dart
import 'package:appscheme/appscheme.dart';

AppScheme appScheme = AppSchemeImpl.getInstance();

获取初始 Scheme(应用冷启动)

dart
appScheme.getInitScheme().then((value) {
  if (value != null) {
    // 处理 Scheme 数据
    String dataString = value.dataString;
    print('初始 Scheme: $dataString');

    // 解析参数
    Uri uri = Uri.parse(dataString);
    String? productId = uri.queryParameters['productId'];
  }
});

获取最新 Scheme

dart
appScheme.getLatestScheme().then((value) {
  if (value != null) {
    print('最新 Scheme: ${value.dataString}');
  }
});

监听 Scheme 事件(应用运行时)

dart
StreamSubscription? _schemeSubscription;

void initSchemeListener() {
  _schemeSubscription = appScheme.registerSchemeListener().listen((event) {
    if (event != null) {
      print('收到 Scheme: ${event.dataString}');
      // 处理跳转逻辑
      handleScheme(event.dataString);
    }
  });
}

void dispose() {
  _schemeSubscription?.cancel();
}

完整示例

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

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

class MyApp extends StatefulWidget {
  @override
  _MyAppState createState() => _MyAppState();
}

class _MyAppState extends State<MyApp> {
  AppScheme? _appScheme;
  String _schemeData = '等待接收 Scheme...';

  @override
  void initState() {
    super.initState();
    _initAppScheme();
  }

  void _initAppScheme() {
    _appScheme = AppSchemeImpl.getInstance();

    // 获取初始 Scheme
    _appScheme?.getInitScheme().then((value) {
      if (value != null) {
        setState(() {
          _schemeData = '初始: ${value.dataString}';
        });
      }
    });

    // 监听 Scheme 事件
    _appScheme?.registerSchemeListener().listen((event) {
      if (event != null) {
        setState(() {
          _schemeData = '收到: ${event.dataString}';
        });
      }
    });
  }

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(title: Text('App Scheme 示例')),
        body: Center(
          child: Text(_schemeData),
        ),
      ),
    );
  }
}

URL 格式

<scheme>://<host>:<port>/<path>?<query>

示例

openapp://hhong:80/product?productId=10000007

解析

  • scheme: openapp
  • host: hhong
  • port: 80
  • path: /product
  • query: productId=10000007

测试方法

可以使用在线测试工具验证 Scheme 配置:

测试 URLhttps://api.dsfgx.com/a.html

或在终端使用 adb 测试:

bash
adb shell am start -W -a android.intent.action.VIEW -d "app://hong.com/product?productId=123"

适用场景

应用间跳转

  • 从浏览器打开应用
  • 从其他应用跳转到本应用
  • 推送通知点击跳转

数据传递

  • 分享内容到应用
  • 通过链接携带参数
  • 推广链接追踪

深度链接

  • 商品详情页直达
  • 特定功能页面跳转
  • 邀请注册流程

注意事项

  • Dart 3 兼容性:1.0.1 版本与 Dart 3 不兼容,建议使用最新版 1.2.0
  • 平台差异:Android 和 iOS 的配置方式不同
  • Scheme 唯一性:确保 Scheme 名称不会与其他应用冲突

总结

appscheme 是一个实用的 Flutter 深度链接插件,其核心优势包括:

  • 双平台支持:同时支持 Android 和 iOS
  • 简单易用:API 简洁,易于集成
  • 功能完整:支持冷启动和运行时两种场景
  • 文档齐全:配置说明详细

对于需要实现应用间跳转、深度链接功能的 Flutter 应用来说,这是一个不错的选择。

分享: