Flutter使用unilinks插件实现Android DeepLink失效问题解决
解决DeepLink无法触发的问题
1. 修正AndroidManifest的链接匹配规则
你当前配置的android:host="myhost.com",但测试链接是unilink://myhost,host部分不匹配,这是导致无法触发Intent Filter的核心问题。
- 若要匹配
unilink://myhost,将host改为myhost:
<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="unilink" android:host="myhost"/> </intent-filter>
- 确保该intent-filter放在**启动Activity(通常是MainActivity)**的标签内部,并且Android 12+需为Activity添加
android:exported="true"属性:
<activity android:name=".MainActivity" android:exported="true" ...> <!-- 上述intent-filter需放置在此处 --> </activity>
2. 验证unilinks插件依赖
确认pubspec.yaml中已添加正确的插件依赖:
dependencies: unilinks: ^0.5.1 # 使用最新稳定版本
执行flutter pub get完成依赖安装。
3. 完善代码错误捕获逻辑
当前初始化代码未处理异常,可能导致插件初始化失败无法察觉,建议添加异常捕获:
Future<void> initDeepLinks() async { try { // 检查应用启动时的DeepLink final initialLink = await uni_links.getInitialLink(); handleDeepLink(initialLink); // 监听应用运行中的DeepLink uni_links.linkStream.listen( handleDeepLink, onError: (err) { print('DeepLink监听错误: $err'); }, ); } catch (e) { print('DeepLink初始化失败: $e'); } }
4. 采用可靠的测试方式
部分浏览器对自定义Scheme支持有限,推荐以下测试方法:
- adb命令测试(最稳定):
adb shell am start -W -a android.intent.action.VIEW -d "unilink://myhost" com.your.package.name
将com.your.package.name替换为你的Flutter应用包名(可在AndroidManifest.xml的package属性中查看)。
- 网页触发测试:创建简单HTML文件,通过a标签触发链接:
<a href="unilink://myhost">打开我的应用</a>
在设备浏览器中打开该HTML文件并点击链接测试。
内容的提问来源于stack exchange,提问作者CoolNa
相关产品推荐
相关产品推荐

