FCM 通知在应用处于后台或前台时对我有用,但在应用被终止时无效。
这是我的 FCM 配置代码:
Future<void> _firebaseMessagingBackgroundHandler(RemoteMessage message) async {
await Firebase.initializeApp();
print("Handling a background message: ${message.messageId}");
}
class CategoriesScreen extends StatefulWidget {
static const routeName = '/view-cateogries';
_CategoriesScreenState createState() => _CategoriesScreenState();
}
class _CategoriesScreenState extends State<CategoriesScreen> {
Future _screenFuture;
void initState() {
_saveDeviceToken(FirebaseMessaging.instance);
FirebaseMessaging.onBackgroundMessage(_firebaseMessagingBackgroundHandler);
super.initState();
}
我已经在 stackoverflow 和这里在线阅读了大量文章。例如,其中一项建议是禁用省电模式。我试过了,但没有运气。任何想法我缺少什么?
我使用的是 firebase-messaging 版本 ^10.0.2
答案 0 :(得分:1)
看起来您正在调用有状态小部件的 FirebaseMessaging.onBackgroundMessage()
内的 initState()
方法,这是不允许的,如文档中所述:
由于处理程序在您的应用程序之外以自己的隔离方式运行 上下文,不可能更新应用程序状态或执行任何 UI 影响逻辑。但是,您可以执行诸如 HTTP 之类的逻辑 请求、IO 操作(更新本地存储)、与 其他插件等
您应该在 runApp()
之前设置后台消息处理程序:
/// Define a top-level named handler which background/terminated messages will
/// call.
Future<void> _firebaseMessagingBackgroundHandler(RemoteMessage message) async {
// If you're going to use other Firebase services in the background, such as Firestore,
// make sure you call `initializeApp` before using other Firebase services.
await Firebase.initializeApp();
print("Handling a background message: ${message.messageId}");
}
Future<void> main() async {
WidgetsFlutterBinding.ensureInitialized();
// Initialize Firebase App
await Firebase.initializeApp();
// Set the background messaging handler early on, as a named top-level function
FirebaseMessaging.onBackgroundMessage(_firebaseMessagingBackgroundHandler);
// Run your app
runApp(HomeScreen());
}
查看this了解详情。
答案 1 :(得分:0)
当应用程序被终止时,当 FCM 想要触发某些行为时,“做某事”的唯一方法是使用 BroadcastReceiver:https://chloe-thhsu.medium.com/a-simple-way-to-combine-fcm-notification-with-tts-b48a777ec84f(您只需要在此链接上提供一段示例代码)
FCM 应该触发一些 Intent,只有注册的 App 才会接收它并做一些事情。
即使应用程序关闭/终止,BroadcastReceivers 也能工作,但它们在触发时只允许基本的“操作”。对您来说,它可能是可用的:“通过传递 XYZ 参数使用 Intent 启动和活动”,您的应用程序/活动将在其中启动,您可以从那里执行“所有您想做的事情”。
答案 2 :(得分:0)
您可以通过简单地获取数据键中的所有数据而不是通知键来触发通知 onMessage 函数。正在发送的数据,请更新通知密钥为数据。
答案 3 :(得分:0)
即使在应用程序终止时也在后台处理 FCM 通知已经有一段时间了。步骤
"${#names[@]}"
唯一要记住的是,传递给后台触发的函数必须是匿名函数,即它应该在任何类之外。该函数将在单独的隔离中执行,因此您可以执行任何类型的非任务,例如网络调用、显示通知、更新数据库等(任何不涉及 UI 的任务)。 您可以找到更多文档 here
编辑-我可能有点误解了这个问题。上面的答案适用于您希望在收到通知时处理某些事情的情况。至于通知,除非是数据通知,否则应该会自行弹出通知。您也可以在回调本身中使用 flutter_local_notifications 之类的内容生成自己的通知!
答案 4 :(得分:0)
我建议您使用 OneSignal 进行推送通知。它更稳定,始终接收通知。 (即使应用程序被杀死)。