如何在Flutter应用内实现向其他应用发送FCM通知?
Flutter 跨应用发送通知实现方案
核心前提
- 受移动端系统权限限制,你无法直接在自己的应用中为其他应用触发系统通知,只能通过跨进程通信给目标应用传递消息,由目标应用自身调用通知API完成通知弹出
- 如果目标应用不属于你且未对外公开通信协议,该功能无法实现
- 该功能依赖原生层能力,无全平台通用的Flutter纯Dart实现方案
Android 端实现方案
- 方案1:显式广播通信
双方提前约定好广播Action、参数规则,目标应用注册对应的广播接收器,你的应用通过显式Intent发送广播,目标应用收到广播后自行弹出通知。原生层发送广播的示例代码:
你可以通过Flutter MethodChannel调用上述原生逻辑完成广播发送。Android 8.0及以上版本仅支持显式广播,必须指定目标应用的包名和接收器完整类名。// Android 原生层Kotlin代码 val intent = Intent().apply { action = "com.target.app.NOTIFY_ACTION" setPackage("com.target.app.package.name") putExtra("notify_content", "要发送的通知内容") } sendBroadcast(intent) - 方案2:DeepLink 唤起
目标应用配置好自定义Scheme,你的应用直接通过url_launcher包调用约定好的链接带参数,目标应用被唤起后接收参数弹出通知,该方案无需额外写原生代码。
iOS 端实现方案
- 方案1:自定义Scheme/通用链接唤起
和Android DeepLink逻辑一致,目标应用配置好自定义Scheme或者通用链接,你的应用通过url_launcher调用约定链接传递参数,目标应用被唤起后自行弹出通知。需要注意在你的应用info.plist中添加LSApplicationQueriesSchemes字段,配置目标应用的Scheme,否则无法检测目标应用是否安装。 - 方案2:App Group 共享通信
如果两款应用都归你所有,且在同一个苹果开发者账号下,可以开启同一份App Group权限,通过共享的NSUserDefaults或者共享目录传递消息,配合后台刷新能力,目标应用检测到新消息后弹出通知,可实现无需唤起目标应用就能发通知的效果。
Flutter 层通用实现示例
直接使用url_launcher包实现跨端DeepLink调用,是成本最低的实现方案:
- 先在
pubspec.yaml中添加依赖:url_launcher: ^6.2.0 - 调用示例代码:
import 'package:url_launcher/url_launcher.dart'; Future<void> sendNotifyToTargetApp(String content) async { // 双方提前约定的通信协议格式 final Uri notifyUri = Uri.parse( 'targetapp://custom_notify?content=${Uri.encodeComponent(content)}×tamp=${DateTime.now().millisecondsSinceEpoch}' ); if (await canLaunchUrl(notifyUri)) { // 外部唤起目标应用 await launchUrl(notifyUri, mode: LaunchMode.externalApplication); } }
内容的提问来源于stack exchange,提问作者Sunny Rahi
相关产品推荐
相关产品推荐

