maui通过各平台原生机制实现深链接,android需配置intent-Filter并重写onnewintent,ios推荐universal links并配置aasa文件与associated domains,maui侧统一用shell导航并解析url参数。

MAUI本身不直接提供统一的深链接(Deep Linking)抽象层,但支持通过各平台原生机制实现,并可封装为跨平台调用逻辑。关键在于:注册自定义URI Scheme(Android/iOS通用)或配置通用链接(iOS专属),再在应用启动或前台切换时捕获并解析URL。
Android端:注册自定义Scheme并接收Intent
在Platforms/Android/AndroidManifest.xml中添加<intent-filter></intent-filter>:
- 确保Activity(通常是
MainActivity)包含以下配置:
<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" /> </intent-filter>
- 在Platforms/Android/MainActivity.cs中重写
OnNewIntent,获取传入URI: - 调用
base.OnNewIntent(intent)后,用intent.Data.ToString()提取完整URL(如myapp://notes/123) - 建议将解析逻辑抽离到共享服务,例如
IDeepLinkHandler,便于统一调度导航
iOS端:支持Universal Links(推荐)与Custom URL Scheme
Universal Links更安全、不可被其他App劫持,需两步配合:
- 服务器端:在域名根目录部署
.well-known/apple-app-site-association文件(无扩展名,json格式),声明你的App ID和可处理路径 - 客户端:在Platforms/iOS/Info.plist中启用Associated Domains,添加
applinks:yourdomain.com - 在Platforms/iOS/AppDelegate.cs中实现
ContinueUserActivity方法,从NSUserActivity中提取WebpageURL - 若退而求其次用Custom Scheme(如
myapp://),需在Info.plist中配置CFBundleURLTypes,并在OpenUrl回调中处理
MAUI侧:统一接收与路由分发
不要在各平台代码里直接跳转页面,而是触发一个跨平台事件:
- 定义全局事件或使用
IApplication的OnResume+ 自定义属性暂存URL - 在App.xaml.cs的
OnResume或Shell初始化后检查是否有待处理链接 - 用
Shell.Current.GoToAsync()或Navigation.PushAsync()导航到对应页面,参数从URL query中解析(如?id=456) - 可结合
[QueryProperty]特性自动绑定参数,减少手动解析
调试与验证要点
深链接容易因配置遗漏失败,务必检查:
- Android模拟器或真机上用
adb shell am start -W -a android.intent.action.VIEW -d "myapp://open?tab=settings"测试 - iOS真机上用safari访问
https://yourdomain.com/path,确认是否自动唤起App(Universal Links) - 确保Debug模式下也能捕获链接——某些平台只在冷启动时触发,热启动需额外监听
- 首次安装后,iOS可能缓存旧的AASA文件,修改后需删除App重装或等待24小时
基本上就这些。不复杂但容易忽略配置细节,尤其是iOS的域名验证和Android的intent-filter位置。把Scheme命名保持小写、无特殊字符,能省掉不少坑。