Flutter深度链接处理插件deeplynks的使用
Flutter深度链接处理插件deeplynks的使用
DeepLynks 是一个用于实现深度链接的Flutter包。如果应用程序未安装,它会无缝重定向到Play Store或App Store进行下载;否则,直接打开应用并记住整个安装过程中的链接。
特性
- 延迟深度链接:跟踪跨安装的点击链接。
- 简单设置:快速集成,配置最小。
- 平台支持:Android的应用链接和iOS的通用链接(可选但推荐)。
- 免费使用:开源且免费。
安装
-
在
pubspec.yaml
中添加该包:dependencies: deeplynks: <latest_version>
-
运行
flutter pub get
来安装包。
使用
1. 初始化 DeepLynks
在应用启动时初始化服务。这将生成一个唯一的应用ID,除非应用ID或bundle ID更改,否则该ID将保持不变。
final appId = await Deeplynks().init(
context: context,
metaData: MetaInfo(
name: 'Deeplynks Demo',
description: 'This app is a working demo for showcasing Deeplynks features',
),
androidInfo: AndroidInfo(
sha256: [],
playStoreURL: '',
applicationId: 'com.example.deeplynks',
),
iosInfo: IOSInfo(
teamId: '',
appStoreURL: '',
bundleId: 'com.example.deeplynks',
),
);
print(appId);
参数说明
context
:BuildContext
,构建上下文。metaData
:MetaInfo
,应用元数据。用于链接预览。androidInfo
:AndroidInfo
,Android特定配置。iosInfo
:IOSInfo
,iOS特定配置。
2. 监听传入的深度链接数据
Deeplynks().stream.listen((data) {
print(data);
});
3. 创建深度链接
生成带有自定义数据的深度链接,可以包括绝对URL、相对URL、查询参数、JSON对象、纯文本或其他任何你想要稍后检索的格式。
final link = await Deeplynks().createLink(jsonEncode({
'referredBy': '12345',
'referralCode': 'WELCOME50',
}));
print('Generated link: $link');
4. 标记链接数据为已使用
标记链接数据为已完成以防止未来触发。
Deeplynks().markCompleted();
平台设置(可选)
Android
-
打开
android/app/src/main/AndroidManifest.xml
。 -
在
<activity>
标签中添加以下<meta-data>
和<intent-filter>
标签,并替换<app_id>
为第一次调用DeepLynks.init()
生成的唯一应用ID。<meta-data android:name="flutter_deeplinking_enabled" android:value="true" /> <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:scheme="http" android:host="deeplynks.web.app" android:pathPrefix="/<app_id>/" /> <data android:scheme="https" android:host="deeplynks.web.app" android:pathPrefix="/<app_id>/" /> </intent-filter>
-
更新
MainActivity.kt
处理深度链接:import android.net.Uri import android.os.Bundle import android.content.Intent import io.flutter.plugin.common.MethodChannel import io.flutter.embedding.engine.FlutterEngine import io.flutter.embedding.android.FlutterActivity class MainActivity : FlutterActivity() { private val CHANNEL = "app.web.deeplynks" private var initialLink: String? = null override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) intent?.let { if (Intent.ACTION_VIEW == it.action) { initialLink = it.data.toString() } } } override fun configureFlutterEngine(flutterEngine: FlutterEngine) { super.configureFlutterEngine(flutterEngine) MethodChannel(flutterEngine.dartExecutor.binaryMessenger, CHANNEL).setMethodCallHandler { call, result -> if (call.method == "getInitialLink") { result.success(initialLink) initialLink = null } else { result.notImplemented() } } } override fun onNewIntent(intent: Intent) { super.onNewIntent(intent) intent.data?.let { flutterEngine?.dartExecutor?.binaryMessenger?.let { messenger -> MethodChannel(messenger, CHANNEL).invokeMethod("onLink", it.toString()) } } } }
-
测试模拟器:
- 运行应用。
- 关闭应用。
- 终端运行命令:
adb shell am start -a android.intent.action.VIEW -d "<created_deep_link>" <application_id>
iOS
-
在
Info.plist
添加FlutterDeepLinkingEnabled
键:<key>FlutterDeepLinkingEnabled</key> <true/>
-
添加关联域:
- 打开
Runner.xcworkspace
文件。 - 选择顶级
Runner
项目。 - 转到“Signing & Capabilities”选项卡。
- 点击“+ Capability”按钮。
- 选择“Associated Domains”。
- 在“Associated Domains”部分,点击“+”按钮。
- 添加域:
applinks:deeplynks.web.app
。
- 打开
-
更新
AppDelegate.swift
处理传入的深度链接:import UIKit import Flutter @main @objc class AppDelegate: FlutterAppDelegate { override func application( _ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]? ) -> Bool { GeneratedPluginRegistrant.register(with: self) return super.application(application, didFinishLaunchingWithOptions: launchOptions) } // TODO: ADD THIS METHOD override func application( _ application: UIApplication, continue userActivity: NSUserActivity, restorationHandler: @escaping ([UIUserActivityRestoring]?) -> Void ) -> Bool { if userActivity.activityType == NSUserActivityTypeBrowsingWeb, let url = userActivity.webpageURL, let flutterViewController = window?.rootViewController as? FlutterViewController { let channel = FlutterMethodChannel(name: "app.web.deeplynks", binaryMessenger: flutterViewController.binaryMessenger) channel.invokeMethod("onLink", arguments: url.absoluteString) } return true; } }
-
测试模拟器:
- 运行应用。
- 关闭应用。
- 终端运行命令:
xcrun simctl openurl booted <created_deep_link>
示例代码
import 'dart:convert';
import 'dart:developer';
import 'package:flutter/material.dart';
import 'package:deeplynks/deeplynks.dart';
void main() => runApp(const MyApp());
class MyApp extends StatefulWidget {
const MyApp({super.key});
@override
State<MyApp> createState() => _MyAppState();
}
class _MyAppState extends State<MyApp> {
final _deeplynks = Deeplynks();
@override
void initState() {
super.initState();
WidgetsBinding.instance.addPostFrameCallback((_) => _init());
}
@override
Widget build(BuildContext context) {
return MaterialApp(
home: Builder(builder: (context) {
return Scaffold(
appBar: AppBar(title: const Text('Deeplynks Demo')),
body: Center(
child: ElevatedButton(
onPressed: _createLink,
child: const Text('Refer'),
),
),
);
}),
);
}
/// Initialize deeplynks & listen for link data
Future<void> _init() async {
final appId = await _deeplynks.init(
context: context,
metaData: MetaInfo(
name: 'Deeplynks Demo',
description: 'This app is a working demo for showcasing Deeplynks features',
),
androidInfo: AndroidInfo(
sha256: [],
playStoreURL: '',
applicationId: 'com.example.deeplynks',
),
iosInfo: IOSInfo(
teamId: '',
appStoreURL: '',
bundleId: 'com.example.deeplynks',
),
);
// Use this appId for Android platform setup
log('Deeplynks App Id: $appId');
// Listen for link data
_deeplynks.stream.listen((data) {
// Handle link data
log('Deeplynks Data: $data');
// After using the link data, mark it as completed
// to prevent it from being processed again
_deeplynks.markCompleted();
});
}
/// Create a new deep link
Future<void> _createLink() async {
final link = await _deeplynks.createLink(jsonEncode({
'referredBy': '12345',
'referralCode': 'WELCOME50',
}));
log('Deeplynks Link: $link');
}
}
如果有任何问题或建议,请访问 Issues 部分提交反馈。
更多关于Flutter深度链接处理插件deeplynks的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html
更多关于Flutter深度链接处理插件deeplynks的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html
在处理Flutter应用中的深度链接(Deep Linking)时,deeplynks
是一个功能强大的插件,可以帮助你轻松实现这一功能。下面是一个使用 deeplynks
插件的基本示例,包括如何在Flutter项目中集成和使用它。
1. 添加依赖
首先,你需要在你的 pubspec.yaml
文件中添加 deeplynks
插件的依赖:
dependencies:
flutter:
sdk: flutter
deeplynks: ^最新版本号 # 请替换为实际可用的最新版本号
然后运行 flutter pub get
来获取依赖。
2. 配置 Android
在 android/app/src/main/AndroidManifest.xml
中,你需要添加对深度链接的支持,并确保你的应用可以接收特定的URI。例如:
<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="https" android:host="yourapp.com" android:pathPrefix="/path" />
</intent-filter>
3. 配置 iOS
在 ios/Runner/Info.plist
中,添加以下配置以支持深度链接:
<key>CFBundleURLTypes</key>
<array>
<dict>
<key>CFBundleURLSchemes</key>
<array>
<string>yourappscheme</string>
</array>
<key>CFBundleURLName</key>
<string>com.yourcompany.yourapp</string>
</dict>
</array>
4. 初始化 Deeplynks
在你的 Flutter 应用中,初始化 Deeplynks
插件。通常在 MainActivity.kt
(Android) 或 AppDelegate.swift
(iOS) 以及 Flutter 的 main.dart
文件中进行配置。
在 MainActivity.kt
中:
import io.flutter.embedding.android.FlutterActivity
import io.flutter.embedding.engine.FlutterEngine
import io.flutter.plugins.GeneratedPluginRegistrant
import com.deeplynks.deeplynksflutter.DeeplynksFlutterPlugin
class MainActivity: FlutterActivity() {
override fun configureFlutterEngine(flutterEngine: FlutterEngine) {
super.configureFlutterEngine(flutterEngine)
GeneratedPluginRegistrant.registerWith(flutterEngine)
DeeplynksFlutterPlugin.registerWith(flutterEngine.dartExecutor.binaryMessenger)
}
}
在 AppDelegate.swift
中:
import UIKit
import Flutter
import deeplynks_flutter
@UIApplicationMain
@objc class AppDelegate: FlutterAppDelegate {
override func application(
_ application: UIApplication,
didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?
) -> Bool {
GeneratedPluginRegistrant.register(with: self)
return super.application(application, didFinishLaunchingWithOptions: launchOptions)
}
}
5. 在 Flutter 中使用 Deeplynks
在你的 main.dart
文件中,你可以使用 Deeplynks
插件来处理深度链接。以下是一个简单的示例:
import 'package:flutter/material.dart';
import 'package:deeplynks/deeplynks.dart';
void main() {
runApp(MyApp());
}
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
title: 'Flutter Deep Linking Demo',
theme: ThemeData(
primarySwatch: Colors.blue,
),
home: MyHomePage(),
);
}
}
class MyHomePage extends StatefulWidget {
@override
_MyHomePageState createState() => _MyHomePageState();
}
class _MyHomePageState extends State<MyHomePage> {
@override
void initState() {
super.initState();
// 初始化 Deeplynks
Deeplynks.initialize(
apiKey: 'YOUR_API_KEY', // 替换为你的 Deeplynks API Key
listener: (DeepLinkResult result) {
// 处理深度链接结果
print('Received deep link: ${result.path}');
// 根据需要导航到不同的页面
},
);
// 检查是否有待处理的深度链接
Deeplynks.retrieveDeepLink().then((DeepLinkResult result) {
if (result != null) {
// 处理从启动中恢复的深度链接
print('Retrieved deep link on startup: ${result.path}');
}
});
}
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text('Deep Linking Demo'),
),
body: Center(
child: Text('Check your console for deep link output'),
),
);
}
}
这个示例展示了如何初始化 Deeplynks
插件,并设置监听器来处理接收到的深度链接。同时,它也展示了如何在应用启动时检查并处理任何待处理的深度链接。
请确保替换示例代码中的 YOUR_API_KEY
为你实际的 Deeplynks API Key,并根据你的需求调整深度链接的处理逻辑。