sun*_*wat 6 android push-notification firebase flutter firebase-cloud-messaging
当应用程序终止/从后台删除最近的应用程序时,我面临收到通知的问题。
我已经在应用程序或项目级别的 build.gradle 文件中完成了 Android 应用程序所需的所有设置。当应用程序打开或应用程序位于最近的应用程序中时,我能够收到推送通知。
库版本
firebase_messaging: ^11.2.0
firebase_core: ^1.10.0
flutter_local_notifications: ^9.1.4
Run Code Online (Sandbox Code Playgroud)
这是我的代码。
await Firebase.initializeApp();
Run Code Online (Sandbox Code Playgroud)
FirebaseMessaging messaging = FirebaseMessaging.instance;
messaging.getToken().then((value) {
print('firebase token =$value');
});
FirebaseMessaging.onMessage.listen((RemoteMessage message) async {
//print(event.notification!.body);
RemoteNotification? notification = message.notification;
if (notification != null) {
print("Notification received when app in foreground");
}
});
FirebaseMessaging.onMessageOpenedApp.listen((message) {
print('Message clicked!');
});
await FirebaseMessaging.instance.setForegroundNotificationPresentationOptions(
alert: true,
badge: true,
sound: true,
);
Run Code Online (Sandbox Code Playgroud)
背景消息处理程序代码如下
Future<void> _messageHandler(RemoteMessage message) async {
await Firebase.initializeApp();
RemoteNotification? notification = message.notification;
if (notification != null) {
print("Notification received when app in background");
}
}
Run Code Online (Sandbox Code Playgroud)
下面是我的 main.dart 文件的完整代码
Future<void> _messageHandler(RemoteMessage message) async {
await Firebase.initializeApp();
RemoteNotification? notification = message.notification;
if (notification != null) {
print("Notification received when app in background");
}
}
void main() async {
WidgetsFlutterBinding.ensureInitialized();
await Firebase.initializeApp();
FirebaseMessaging.onBackgroundMessage(_messageHandler);
runApp(MyApp());
}
class MyApp extends StatefulWidget {
createState() => _MyAppState();
}
class _MyAppState extends State<MyApp> {
bool isUserLoggedIn = true;
bool isLogoutAlertShown = false;
final materialAppKey = GlobalKey();
late FirebaseMessaging messaging;
@override
void initState() {
super.initState();
setUpNotification();
}
setUpNotification() async {
messaging = FirebaseMessaging.instance;
messaging.getToken().then((value) {
print('firebase token =$value');
//sendTokenToServer(value);
Pref.setFcmToken(token: '$value');
});
FirebaseMessaging.onMessage.listen((RemoteMessage message) async {
//print(event.notification!.body);
RemoteNotification? notification = message.notification;
if (notification != null) {
print("Notification received when app in foreground");
}
});
FirebaseMessaging.onMessageOpenedApp.listen((message) {
print('Message clicked!');
});
await FirebaseMessaging.instance.setForegroundNotificationPresentationOptions(
alert: true,
badge: true,
sound: true,
);
}
@override
Widget build(BuildContext context) {
return _materialApp();
}
Widget _materialApp() {
return FutureBuilder(
future: _loginState(),
builder: (context, snapshot) {
if (snapshot.connectionState == ConnectionState.done) {
return MaterialApp(
debugShowCheckedModeBanner: false,
key: materialAppKey,
darkTheme: AppTheme.lightTheme,
theme: AppTheme.lightTheme,
home: isUserLoggedIn == true ?
BottomNavigationContainer() : LoginOptions(),
);
} else {
return Container(color: Colors.white);
}
});
}
Future<void> _loginState() async {
final token = await Pref.getToken();
isUserLoggedIn = token.length > 0 ? true : false;
}
}
Run Code Online (Sandbox Code Playgroud)
建议我遗漏或做错了什么。
sun*_*wat 18
感谢大家的回复。
我找到了为什么我的后台处理程序无法工作的解决方案,因为我正在调试模式下运行我的应用程序。根据FlutterFire Cloud 消息传递文档, 如果您终止应用程序,后台方法将无法在调试模式下工作。
您可以通过在调试中运行应用程序来测试后台处理程序方法,然后通过切换应用程序将其置于后台,使其不再位于前台。
如果您想检查“应用程序从最近的任务中终止/终止后”,则“在发布模式下运行应用程序” 。效果很好
再次感谢大家。
| 归档时间: |
|
| 查看次数: |
7728 次 |
| 最近记录: |