You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.24 19:46:16