Flutter深度链接在浏览器中无效,如何配置并处理链接参数?
Flutter 唤起应用及参数处理实现方案
一、修正Scheme配置(解决未生效问题)
唤起失败大概率是配置有误,直接按以下方式调整:
iOS端
打开ios/Runner/Info.plist,插入以下配置:
<key>CFBundleURLTypes</key> <array> <dict> <key>CFBundleURLSchemes</key> <array> <string>myapp</string> <!-- 填入你的自定义scheme --> </array> <key>CFBundleURLName</key> <string>myhost</string> <!-- 对应链接中的host字段 --> </dict> </array>
iOS 9及以上系统,可额外添加以下配置避免唤起异常:
<key>LSApplicationQueriesSchemes</key> <array> <string>myapp</string> </array>
Android端
打开android/app/src/main/AndroidManifest.xml,在主Activity标签内添加intent-filter:
<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="myapp" android:host="myhost" /> </intent-filter>
注意:确保该配置和android:name=".MainActivity"的标签对应,不要加错位置。
二、处理唤起链接的code参数
使用uni_links包监听并解析链接参数,步骤如下:
1. 添加依赖
在pubspec.yaml的dependencies节点中添加:
uni_links: ^0.5.1 # 可前往pub.dev获取最新版本号
执行flutter pub get拉取依赖。
2. 实现参数监听逻辑
在主页面的初始化代码中添加监听,示例代码:
import 'package:uni_links/uni_links.dart'; import 'package:flutter/services.dart'; class _HomePageState extends State<HomePage> { String? _receivedCode; @override void initState() { super.initState(); _setupLinkListener(); } Future<void> _setupLinkListener() async { // 处理应用冷启动(未打开状态被唤起)的情况 try { final initialLink = await getInitialLink(); if (initialLink != null) { _parseCodeFromLink(initialLink); } } on PlatformException { // 异常处理,可添加日志或提示 } // 处理应用热启动(已打开状态被唤起)的情况 linkStream.listen((link) { if (link != null) { _parseCodeFromLink(link); } }, onError: (err) { // 错误处理逻辑 }); } void _parseCodeFromLink(String link) { final uri = Uri.parse(link); final code = uri.queryParameters['code']; if (code != null) { setState(() { _receivedCode = code; }); // 此处添加业务逻辑,如跳转页面、调用接口等 print('获取到的code参数:$code'); } } @override Widget build(BuildContext context) { return Scaffold( appBar: AppBar(title: const Text('唤起测试')), body: Center(child: Text('当前获取的code:$_receivedCode')), ); } }
三、调试小技巧
- iOS模拟器:执行命令
xcrun simctl openurl booted myapp://myhost/?code=12213,直接唤起应用并传参;真机可在Safari中输入链接测试。 - Android:执行adb命令
adb shell am start -W -a android.intent.action.VIEW -d "myapp://myhost/?code=12213" com.your.package.name,替换com.your.package.name为你的应用包名;真机在浏览器输入链接时,需允许浏览器唤起应用的权限。
内容的提问来源于stack exchange,提问作者Andrii Havrylyak
相关产品推荐
相关产品推荐

