Flutter深度链接处理插件deeplynks的使用

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

Flutter深度链接处理插件deeplynks的使用

DeepLynks 是一个用于实现深度链接的Flutter包。如果应用程序未安装,它会无缝重定向到Play Store或App Store进行下载;否则,直接打开应用并记住整个安装过程中的链接。

特性

  • 延迟深度链接:跟踪跨安装的点击链接。
  • 简单设置:快速集成,配置最小。
  • 平台支持:Android的应用链接和iOS的通用链接(可选但推荐)。
  • 免费使用:开源且免费。

安装

  1. pubspec.yaml 中添加该包:

    dependencies:
      deeplynks: <latest_version>
    
  2. 运行 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

  1. 打开 android/app/src/main/AndroidManifest.xml

  2. <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>
    
  3. 更新 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())
                }
            }
        }
    }
    
  4. 测试模拟器:

    • 运行应用。
    • 关闭应用。
    • 终端运行命令:
    adb shell am start -a android.intent.action.VIEW -d "<created_deep_link>" <application_id>
    

iOS

  1. Info.plist 添加 FlutterDeepLinkingEnabled 键:

    <key>FlutterDeepLinkingEnabled</key>
    <true/>
    
  2. 添加关联域:

    • 打开 Runner.xcworkspace 文件。
    • 选择顶级 Runner 项目。
    • 转到“Signing & Capabilities”选项卡。
    • 点击“+ Capability”按钮。
    • 选择“Associated Domains”。
    • 在“Associated Domains”部分,点击“+”按钮。
    • 添加域:applinks:deeplynks.web.app
  3. 更新 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;
        }
    }
    
  4. 测试模拟器:

    • 运行应用。
    • 关闭应用。
    • 终端运行命令:
    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

1 回复

更多关于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,并根据你的需求调整深度链接的处理逻辑。

回到顶部