Flutter链接管理插件jmlink_flutter_plugin的使用

Flutter链接管理插件jmlink_flutter_plugin的使用

安装

在工程 pubspec.yaml 文件中加入依赖项:

dependencies:
  jmlink_flutter_plugin: 2.1.4

或者,如果你需要从GitHub拉取最新版本:

dependencies:
  jmlink_flutter_plugin:
    git:
      url: git://github.com/jpush/jmlink-flutter-plugin.git
      ref: master

配置

Android
  1. /android/app/build.gradle 中添加以下代码:
android: {
  ....
  defaultConfig {
    applicationId "替换成自己应用 ID"
    ...
    ndk {
      // 选择要添加的对应 CPU 类型的 .so 库。
      abiFilters 'armeabi', 'armeabi-v7a', 'x86', 'x86_64', 'mips', 'mips64', 'arm64-v8a'
    }

    manifestPlaceholders = [
        JPUSH_PKGNAME : applicationId,
        JPUSH_APPKEY : "appkey", // NOTE: JPush 上注册的包名对应的 Appkey.
        JPUSH_CHANNEL : "developer-default", // 暂时填写默认值即可.
        JMLINK_SCHEME: "your_scheme", // 设置跳转的scheme
    ]
  }
}
  1. /android/app/src/main/AndroidManifest.xml 中配置 scheme:
<!-- 将“your_scheme”替换为后台填写的 URI Scheme。-->

<activity android:name=".WelcomeActivity">
     <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='${JMLINK_SCHEME}' />
     </intent-filter>
</activity>
  1. 注意:配置完 scheme 之后,必须在 WelcomeActivityonCreate 方法中执行 JmlinkFlutterPlugin.setData 方法:
public class WelcomeActivity extends Activity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        Log.d("| WelcomeActivity | - ", "onCreate:");
        super.onCreate(savedInstanceState);

        JmlinkFlutterPlugin.setData(getIntent().getData());

        Intent intent = new Intent(this, MainActivity.class);
        startActivity(intent);
        finish();
    }

    protected void onDestroy() {
        Log.d("| WelcomeActivity | - ", "onDestroy:");
        super.onDestroy();
    }

    protected void onNewIntent(Intent intent) {
        Log.d("| WelcomeActivity | - ", "onNewIntent:");
        super.onNewIntent(intent);
        setIntent(intent);
    }
}
iOS

详细配置请参考 iOS指南

  1. 配置App的URL Scheme

    在Xcode中选中Target -> Info -> URL Types,配置URL Scheme(例如:jmlink)。

    在Safari中输入 URL Scheme:// (例如:jmlink://),如果能够唤起App,说明该URL Scheme配置成功。

  2. 配置Universal Link

    Universal Link是iOS9的一个新特性,通过它,App可以从微信等应用中直接跳转到App,实现一键直达。

示例代码

以下是一个完整的示例代码,展示了如何使用 jmlink_flutter_plugin 插件。

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

import 'package:jmlink_flutter_plugin/jmlink_flutter_plugin.dart';

void main() => runApp(MyApp());

class MyApp extends StatefulWidget {
  [@override](/user/override)
  _MyAppState createState() => _MyAppState();
}

class _MyAppState extends State<MyApp> {
  final JmlinkFlutterPlugin jmlink = new JmlinkFlutterPlugin();

  String _paramString = "param";
  String _defaultMlinkMapString = "default handler";
  String _milinkMapString = "key handler";

  [@override](/user/override)
  void initState() {
    super.initState();
    initPlatformState();
  }

  // 平台消息是异步的,所以我们初始化在异步方法中。
  Future<void> initPlatformState() async {
    JMLConfig config = new JMLConfig();
    config.appKey = "e58a32cb3e4469ebf31867e5";
    config.channel = "devloper-default"; // 初始化sdk,  appKey 和 channel 只对ios设置有效
    config.useIDFA = false;
    config.isProduction = true;
    config.debug = true;

    jmlink.setup(config: config);

    registerDefaultJMLinkHandler();

    if (!mounted) return;
  }

  /// 注册默认的 handler
  registerDefaultJMLinkHandler() {
    // 监听默认的 mLink handler 回调
    jmlink.addDefaultHandlerListener((Map jsonMap) {
      print("监听到默认短链的 mLink handler 回调,回调参数为:${jsonMap.toString()}");
      setState(() {
        _defaultMlinkMapString = jsonMap.toString();
      });
      getJMLinkParam();
    });
    // 注册默认的 handler
    jmlink.registerJMLinkDefaultHandler();
  }

  /// 获取无码邀请返回参数
  getJMLinkParam() {
    jmlink.getJMLinkParam().then((param) {
      print("获取到无码邀请参数为: ${param.toString()}");
      setState(() {
        _paramString = param.toString();
      });
    });
  }

  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: const Text('Plugin example app'),
        ),
        body: Column(
          children: <Widget>[
            new Text("默认的 mLink handler 回调:"),
            new Container(
              margin: EdgeInsets.all(5),
              color: Colors.brown,
              child: Text(_defaultMlinkMapString),
              width: double.infinity,
              height: 80,
            ),
            new Text(" mLink handler 回调:"),
            new Container(
              margin: EdgeInsets.all(5),
              color: Colors.brown,
              child: Text(_milinkMapString),
              width: double.infinity,
              height: 80,
            ),
            new Text("无码邀请返回参数:"),
            new Container(
              margin: EdgeInsets.all(5),
              color: Colors.brown,
              child: Text(_paramString),
              width: double.infinity,
              height: 80,
            ),
          ],
        ),
      ),
    );
  }
}

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

1 回复

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


当然,以下是一个关于如何使用 jmlink_flutter_plugin 的代码示例。这个插件通常用于在 Flutter 应用中管理深层链接(deep linking)。下面是一个基本的实现示例,展示了如何集成和使用该插件。

1. 添加依赖

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

dependencies:
  flutter:
    sdk: flutter
  jmlink_flutter_plugin: ^最新版本号  # 请替换为最新版本号

然后运行 flutter pub get 来获取依赖。

2. 配置 Android 和 iOS

确保在 AndroidManifest.xml 和 iOS 的 Info.plist 中配置了必要的 URL schemes 和其他深层链接相关的设置。具体配置步骤依赖于你的应用需求,这里不详细展开。

3. 初始化插件并监听链接

在你的 Flutter 应用中,初始化 jmlink_flutter_plugin 并监听链接事件。以下是一个基本的示例:

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

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

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

class _MyAppState extends State<MyApp> {
  final JmLinkFlutterPlugin _jmLinkPlugin = JmLinkFlutterPlugin();

  @override
  void initState() {
    super.initState();
    
    // 初始化插件
    _jmLinkPlugin.init().then((_) {
      // 监听链接事件
      _jmLinkPlugin.addListener(_handleDeepLink);
    });
  }

  @override
  void dispose() {
    // 移除监听器
    _jmLinkPlugin.removeListener(_handleDeepLink);
    super.dispose();
  }

  void _handleDeepLink(String link) {
    // 处理接收到的深层链接
    print('Received deep link: $link');
    // 根据链接执行相应的操作,例如导航到特定页面
    // Navigator.pushNamed(context, '/someRoute', arguments: {'link': link});
  }

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: Text('Deep Link Handling Example'),
        ),
        body: Center(
          child: Text('Open the app with a deep link to see it in action!'),
        ),
      ),
    );
  }
}

4. 处理启动时的链接

如果你的应用是通过深层链接启动的,你可能还需要在应用启动时获取并处理该链接。可以在 main.dartMyApp 类中添加以下代码:

void main() async {
  WidgetsFlutterBinding.ensureInitialized();
  
  // 尝试获取启动时的链接
  final String initialLink = await _jmLinkPlugin.retrieveLaunchUrl();
  if (initialLink != null) {
    // 处理启动时的链接
    print('Initial deep link: $initialLink');
    // 可以在这里导航到特定页面或执行其他操作
  }

  runApp(MyApp(initialLink: initialLink));
}

class MyApp extends StatefulWidget {
  final String? initialLink;

  MyApp({this.initialLink});

  @override
  _MyAppState createState() => _MyAppState();
}

class _MyAppState extends State<MyApp> {
  // ... (其他代码保持不变)

  @override
  void initState() {
    super.initState();
    
    if (widget.initialLink != null) {
      // 处理启动时的链接
      _handleDeepLink(widget.initialLink!);
    }
    
    // 初始化插件并监听链接事件(代码保持不变)
    _jmLinkPlugin.init().then((_) {
      _jmLinkPlugin.addListener(_handleDeepLink);
    });
  }

  // ... (其他代码保持不变)
}

这个示例展示了如何在 Flutter 应用中集成和使用 jmlink_flutter_plugin 来处理深层链接。请根据你的具体需求调整代码。

回到顶部