Flutter应用(Android/iOS)通过FCM通知打开外部URL的实现与可行性
Flutter通过FCM通知打开外部URL实现方案
应用处于关闭状态时,点击FCM通知打开外部链接完全可行,只要完成以下配置:
一、Flutter端核心实现
1. 依赖包配置
在pubspec.yaml中添加依赖:
dependencies: firebase_messaging: ^14.6.0 url_launcher: ^6.1.12
2. FCM消息监听与URL跳转逻辑
初始化FCM并处理三种状态的通知点击:
import 'package:firebase_messaging/firebase_messaging.dart'; import 'package:url_launcher/url_launcher.dart'; void initFCMHandlers() async { // 请求iOS推送权限(Android无需额外请求) await FirebaseMessaging.instance.requestPermission( alert: true, badge: true, sound: true, ); // 前台收到通知时直接跳转 FirebaseMessaging.onMessage.listen((RemoteMessage message) { _openExternalUrl(message.data['external_url']); }); // 后台点击通知时跳转 FirebaseMessaging.onMessageOpenedApp.listen((RemoteMessage message) { _openExternalUrl(message.data['external_url']); }); // 应用关闭时,启动后检查初始通知并跳转 RemoteMessage? initialMsg = await FirebaseMessaging.instance.getInitialMessage(); if (initialMsg != null) { _openExternalUrl(initialMsg.data['external_url']); } } Future<void> _openExternalUrl(String? url) async { if (url == null) return; final Uri uri = Uri.parse(url); if (await canLaunchUrl(uri)) { // 打开系统默认浏览器 await launchUrl(uri, mode: LaunchMode.externalApplication); } }
在main.dart的main函数中调用initFCMHandlers()完成初始化。
二、Android原生配置
1. 确保通知点击传递数据
在android/app/src/main/AndroidManifest.xml的主Activity标签内,添加以下intent-filter(确保FCM能唤起应用并传递消息数据):
<intent-filter> <action android:name="FLUTTER_NOTIFICATION_CLICK" /> <category android:name="android.intent.category.DEFAULT" /> </intent-filter>
2. 权限说明
无需额外权限,url_launcher会自动处理外部链接跳转的权限逻辑。
三、iOS原生配置
1. 启用后台推送
在ios/Runner/Info.plist中添加后台推送支持:
<key>UIBackgroundModes</key> <array> <string>remote-notification</string> </array>
2. APNs证书配置
确保已在Apple Developer后台生成并上传APNs证书到Firebase控制台,否则iOS无法接收FCM通知。
四、Legacy HTTP请求格式
使用FCM Legacy API发送通知时,需在请求中携带data字段传递URL,示例请求如下:
请求头
POST https://fcm.googleapis.com/fcm/send Authorization: key=YOUR_FCM_SERVER_KEY Content-Type: application/json
请求体(通知+数据)
适用于所有状态,点击通知后可获取URL:
{ "to": "目标设备的FCM Token", "notification": { "title": "新通知", "body": "点击打开外部链接" }, "data": { "external_url": "https://example.com" } }
请求体(仅数据消息)
适用于需要静默处理或前台/后台实时触发的场景,iOS需添加content_available:
{ "to": "目标设备的FCM Token", "data": { "external_url": "https://example.com" }, "content_available": true, "priority": "high" }
关键注意事项
- 关闭状态下,应用会先启动,通过
getInitialMessage()获取通知数据后完成跳转,无需额外处理。 - 务必使用
LaunchMode.externalApplication模式,确保链接在系统浏览器中打开而非App内WebView。 - Android若使用自定义通知(如
flutter_local_notifications),需自行处理点击事件的URL跳转逻辑;使用FCM默认通知则无需额外操作。
内容的提问来源于stack exchange,提问作者Ammar Mohamed
相关产品推荐
相关产品推荐

