Flutter链接管理插件link_kit的使用

Flutter链接管理插件link_kit的使用

link_kit 是一个用于处理深度链接、应用链接和通用链接的 Flutter 插件。

注意事项

  • link_kit 1.0.0 版本的配置不与 0.0.x 版本兼容,请手动删除 0.0.x 版本的配置。
  • 因为 Android 的 manifestPlaceholders 功能有限,且未编写兼容各版本的 Gradle 插件,所以默认只支持配置一个深度链接、应用链接或通用链接。

Android 配置

文档

配置

# 不需要做任何额外接入工作
# 配置已集成到脚本里

App Links

assetlinks.json 文件可以通过 https://${your applinks domain}/.well-known/assetlinks.json 访问。

示例:

https://${your applinks domain}/universal_link/${example_app}/link_kit/
[
  {
    "relation": [
      "delegate_permission/common.handle_all_urls"
    ],
    "target": {
      "namespace": "android_app",
      "package_name": "your_app_package_name",
      "sha256_cert_fingerprints": [
        "your_app_package_fingerprint_sha256"
      ]
    }
  }
]

获取 Android 签名信息,请参考 这里

测试

# 深度链接
adb shell am start -a android.intent.action.VIEW -c android.intent.category.BROWSABLE -d "flk:///power"

# 应用链接
adb shell am start -a android.intent.action.VIEW -c android.intent.category.BROWSABLE -d "https://www.yourdomain.com/universal_link/example_app/link_kit/power"

iOS 配置

文档

配置

# 不需要做任何额外接入工作
# 配置已集成到脚本里

Universal Links

apple-app-site-association 文件可以通过 https://${your applinks domain}/.well-known/apple-app-site-association 访问。

示例:

https://${your applinks domain}/universal_link/${example_app}/link_kit/
{
  "applinks": {
    "apps": [],
    "details": [
      {
        "appID": "${your team id}.${your app bundle id}",
        "paths": [
          "/universal_link/${example_app}/link_kit/*"
        ]
      }
    ]
  }
}

注意:许多 SDK 都会使用通用链接,可以为不同的 SDK 分配不同的路径以便区分。

测试

# 深度链接
xcrun simctl openurl booted flk:///power

# 通用链接
xcrun simctl openurl booted https://www.yourdomain.com/universal_link/example_app/link_kit/power

Flutter 配置

依赖

pubspec.yaml 文件中添加依赖:

dependencies:
  link_kit: ^${latestTag}
#  link_kit:
#    git:
#      url: https://github.com/RxReader/link_kit.git

link_kit:
  deep_link: ${your deep link scheme}:///
  android:
    app_link: https://${your applinks domain}/universal_link/${example_app}/link_kit/ # 可选配置
  ios:
    universal_link: https://${your applinks domain}/universal_link/${example_app}/link_kit/ # 可选配置

安装

Android

修改配置后,必须执行 flutter clean 清理中间编译产物 BuildConfig.java

# step.1 切换工作目录
cd example/
# step.2
flutter clean && flutter pub get

iOS

首次或修改配置后,必须执行 pod install 让配置生效。

# step.0 安装必要依赖
sudo gem install plist
# step.1 切换工作目录
cd example/
# step.2
flutter clean && flutter pub get
# step.3 执行脚本
cd ios/
pod install

编码

_linkClickSubs = LinkKitPlatform.instance.linkClickStream().listen((String event) {
  if (kDebugMode) {
    print('linkClick: $event');
  }
  setState(() {
    _link = event;
  });
});
LinkKitPlatform.instance.getInitialLink().then((String? value) {
  if (kDebugMode) {
    print('initialLink: $value');
  }
  setState(() {
    _link = value;
  });
});

示例代码

以下是完整的示例代码:

import 'dart:async';

import 'package:flutter/foundation.dart';
import 'package:flutter/material.dart';
import 'package:link_kit/link_kit.dart';

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

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

  [@override](/user/override)
  State<MyApp> createState() => _MyAppState();
}

class _MyAppState extends State<MyApp> {
  String? _link;
  StreamSubscription<String>? _linkClickSubs;

  [@override](/user/override)
  void initState() {
    super.initState();
    _linkClickSubs = LinkKitPlatform.instance.linkClickStream().listen((String event) {
      if (kDebugMode) {
        print('linkClick: $event');
      }
      setState(() {
        _link = event;
      });
    });
    // 因为 Android 层实现调用了 queryIntentActivities,会被(小米)误判【获取安装列表】
    // 所以 getInitialLink 必须在同意「隐私协议」后才能调用
    LinkKitPlatform.instance.getInitialLink().then((String? value) {
      if (kDebugMode) {
        print('initialLink: $value');
      }
      setState(() {
        _link = value;
      });
    });
  }

  [@override](/user/override)
  void dispose() {
    _linkClickSubs?.cancel();
    super.dispose();
  }

  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: Text('Link Kit'),
        ),
        body: Center(
          child: Text(_link ?? ''),
        ),
      ),
    );
  }
}

更多关于Flutter链接管理插件link_kit的使用的实战教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

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


link_kit 是阿里云为 Flutter 提供的一个链接管理插件,主要用于处理 App 内外部链接的解析和跳转。它可以帮助开发者轻松实现 App 的深度链接(Deep Link)、延迟深度链接(Deferred Deep Link)以及通用链接(Universal Link)等功能。下面是 link_kit 的基本使用指南。

1. 添加依赖

首先,你需要在 pubspec.yaml 文件中添加 link_kit 插件的依赖:

dependencies:
  flutter:
    sdk: flutter
  link_kit: ^latest_version # 使用最新版本

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

2. 初始化插件

main.dart 文件中初始化 link_kit 插件:

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

void main() async {
  WidgetsFlutterBinding.ensureInitialized();
  
  // 初始化 LinkKit
  await LinkKit().init();

  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'LinkKit Demo',
      home: HomePage(),
    );
  }
}

3. 处理链接

link_kit 提供了多种方式来处理链接事件。你可以通过监听链接事件来处理 App 启动时接收到的链接,或者在 App 运行过程中接收到的链接。

3.1 监听链接事件

HomePage 中添加一个监听器来处理链接事件:

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

class HomePage extends StatefulWidget {
  @override
  _HomePageState createState() => _HomePageState();
}

class _HomePageState extends State<HomePage> {
  String _link = 'No link received';

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

  void _setupLinkListener() {
    // 监听链接事件
    LinkKit().onLink.listen((String link) {
      setState(() {
        _link = link;
      });
    });
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('LinkKit Demo'),
      ),
      body: Center(
        child: Text('Received link: $_link'),
      ),
    );
  }
}

3.2 处理 App 启动时的链接

如果你需要在 App 启动时处理接收到的链接,可以在 initState 中直接调用 LinkKit().getInitialLink()

@override
void initState() {
  super.initState();
  _setupLinkListener();
  _handleInitialLink();
}

void _handleInitialLink() async {
  String initialLink = await LinkKit().getInitialLink();
  if (initialLink != null) {
    setState(() {
      _link = initialLink;
    });
  }
}

4. 配置 Android 和 iOS 的深度链接

为了确保深度链接在 Android 和 iOS 上正常工作,你需要分别进行配置。

4.1 Android 配置

AndroidManifest.xml 中添加 <intent-filter> 来捕获深度链接:

<activity
    android:name=".MainActivity"
    android:launchMode="singleTask">
    <intent-filter android:autoVerify="true">
        <action android:name="android.intent.action.VIEW" />
        <category android:name="android.intent.category.DEFAULT" />
        <category android:name="android.intent.category.BROWSABLE" />
        <data android:host="yourdomain.com" android:scheme="https" />
    </intent-filter>
</activity>

4.2 iOS 配置

Info.plist 中添加 CFBundleURLTypes 来捕获通用链接:

<key>CFBundleURLTypes</key>
<array>
    <dict>
        <key>CFBundleTypeRole</key>
        <string>Editor</string>
        <key>CFBundleURLName</key>
        <string>yourdomain.com</string>
        <key>CFBundleURLSchemes</key>
        <array>
            <string>https</string>
        </array>
    </dict>
</array>

5. 测试链接

你可以通过以下方式测试链接:

  • 在 Android 设备上,使用 adb 发送一个深度链接:
    adb shell am start -a android.intent.action.VIEW -d "https://yourdomain.com/path"
回到顶部