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
更多关于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"