为什么不在 ios 中使用 firebase_messaging 插件在 flutter 中收到通知?
why do not getting notification in ios with firebase_messaging plugin in flutter?
我也在尝试向 android 和 Ios 设备发送通知。
它在 android devcice 上工作,但使用 ios 令牌有些可疑,没有在 ios 设备上收到通知,我已经为 ios 启用了后台通知。事实上,几天前它还在工作,但突然停止在 ios 设备上工作。我更新了 firebase_messaging plugin but still not getting notification, also visited firebase_messaging issue ,this as well .
我认为我的 ios 令牌有问题,因为我已经从 pushtry 网站进行了测试并抛出错误 Please check device token
,但使用 android 令牌进行了测试,没有收到任何错误。所以我可以说 ios 令牌没有正确生成。
我做了我能做的一切,但每次都很失望。
这是我的测试代码:
class PUSHTest extends StatefulWidget {
const PUSHTest({Key key}) : super(key: key);
@override
_PUSHTestState createState() => _PUSHTestState();
}
class _PUSHTestState extends State<PUSHTest> {
String token = '';
var serverKey =
'AAAAL4uGYoY:.............................';
@override
void initState() {
super.initState();
getToken();
showAlertNotification();
}
getToken() async {
String t = await FirebaseMessaging.instance.getToken();
print(
"FCM TOKEN: $t");
setState(() {
token = t;
});
}
showAlertNotification() {
FirebaseMessaging.instance
.getInitialMessage()
.then((RemoteMessage message) {
if (message != null) {
print("NOTIFICATIONNNNNNNNNN RESPONSE11${message.data}");
}
});
FirebaseMessaging.onMessage.listen((RemoteMessage message) {
RemoteNotification notification = message.notification;
AndroidNotification android = message.notification?.android;
AppleNotification ios = message.notification?.apple;
print("ios ios ios:$ios");
if (notification != null && android != null && !kIsWeb) {
if (message != null) {
print("NOTIFICATIONNNNNNNNNN RESPONSE22${message.data}");
}
}
});
FirebaseMessaging.onMessageOpenedApp.listen((RemoteMessage message) {
if (message != null) {
print("NOTIFICATIONNNNNNNNNN RESPONSE33${message.data}");
}
});
}
@override
Widget build(BuildContext context) {
return Scaffold(
body: Center(
child: ElevatedButton(
onPressed: () => sendNotification(),
child: Text("SEND NOTIFICATION"),
),
),
);
}
// My FCM Payload To send notification to the device:
sendNotification() async {
print("send notification button pressed");
try {
http.Response response = await http.post(
Uri.parse('https://fcm.googleapis.com/fcm/send'),
headers: <String, String>{
'Content-Type': 'application/json',
'Authorization': 'key=$serverKey',
},
body: jsonEncode(
<String, dynamic>{
'notification': <String, dynamic>{
'body': 'this is a body',
'title': 'this is a title',
"content_available": true
},
'priority': 'high',
'data': <String, dynamic>{
'click_action': 'FLUTTER_NOTIFICATION_CLICK',
'id': '1',
'status': 'done'
},
'to': token,
},
),
);
if (response.statusCode == 200) {
print("SENT NOTIFICATION TO THE DEVICE :$token");
Fluttertoast.showToast(msg: "SENT NOTIFICATION TO THE DEVICE :$token");
} else {
print("error push notification");
Fluttertoast.showToast(msg: "error push notification");
}
} catch (e) {
print("error push notification");
}
}
}
好吧,终于我发现了我的愚蠢,我到底做了什么。其实是2个大失误。
- 首先,我使用了 permission_hander 并且没有请求通知权限,因为我认为当我将远程通知添加到
plist
文件时它会自动请求。
- 其次,我太愚蠢了,我创建了 2 个 firebase 项目,从另一个添加了 android (
google-service.json
) 和 ios(google-service.plist
) 的配置文件来自其他项目。并从其中之一添加 server-key
到后端。 FCM 代币没问题。
这就是它仅适用于 android 的原因。
现在我意识到自己的愚蠢并删除了重复的 firebase 项目之一,并添加了原始项目的配置文件并将我的 server-key
更新到我的后端。并使用 permission_handler
请求通知许可。就这些了。
我也在尝试向 android 和 Ios 设备发送通知。 它在 android devcice 上工作,但使用 ios 令牌有些可疑,没有在 ios 设备上收到通知,我已经为 ios 启用了后台通知。事实上,几天前它还在工作,但突然停止在 ios 设备上工作。我更新了 firebase_messaging plugin but still not getting notification, also visited firebase_messaging issue ,this as well .
我认为我的 ios 令牌有问题,因为我已经从 pushtry 网站进行了测试并抛出错误 Please check device token
,但使用 android 令牌进行了测试,没有收到任何错误。所以我可以说 ios 令牌没有正确生成。
我做了我能做的一切,但每次都很失望。
这是我的测试代码:
class PUSHTest extends StatefulWidget {
const PUSHTest({Key key}) : super(key: key);
@override
_PUSHTestState createState() => _PUSHTestState();
}
class _PUSHTestState extends State<PUSHTest> {
String token = '';
var serverKey =
'AAAAL4uGYoY:.............................';
@override
void initState() {
super.initState();
getToken();
showAlertNotification();
}
getToken() async {
String t = await FirebaseMessaging.instance.getToken();
print(
"FCM TOKEN: $t");
setState(() {
token = t;
});
}
showAlertNotification() {
FirebaseMessaging.instance
.getInitialMessage()
.then((RemoteMessage message) {
if (message != null) {
print("NOTIFICATIONNNNNNNNNN RESPONSE11${message.data}");
}
});
FirebaseMessaging.onMessage.listen((RemoteMessage message) {
RemoteNotification notification = message.notification;
AndroidNotification android = message.notification?.android;
AppleNotification ios = message.notification?.apple;
print("ios ios ios:$ios");
if (notification != null && android != null && !kIsWeb) {
if (message != null) {
print("NOTIFICATIONNNNNNNNNN RESPONSE22${message.data}");
}
}
});
FirebaseMessaging.onMessageOpenedApp.listen((RemoteMessage message) {
if (message != null) {
print("NOTIFICATIONNNNNNNNNN RESPONSE33${message.data}");
}
});
}
@override
Widget build(BuildContext context) {
return Scaffold(
body: Center(
child: ElevatedButton(
onPressed: () => sendNotification(),
child: Text("SEND NOTIFICATION"),
),
),
);
}
// My FCM Payload To send notification to the device:
sendNotification() async {
print("send notification button pressed");
try {
http.Response response = await http.post(
Uri.parse('https://fcm.googleapis.com/fcm/send'),
headers: <String, String>{
'Content-Type': 'application/json',
'Authorization': 'key=$serverKey',
},
body: jsonEncode(
<String, dynamic>{
'notification': <String, dynamic>{
'body': 'this is a body',
'title': 'this is a title',
"content_available": true
},
'priority': 'high',
'data': <String, dynamic>{
'click_action': 'FLUTTER_NOTIFICATION_CLICK',
'id': '1',
'status': 'done'
},
'to': token,
},
),
);
if (response.statusCode == 200) {
print("SENT NOTIFICATION TO THE DEVICE :$token");
Fluttertoast.showToast(msg: "SENT NOTIFICATION TO THE DEVICE :$token");
} else {
print("error push notification");
Fluttertoast.showToast(msg: "error push notification");
}
} catch (e) {
print("error push notification");
}
}
}
好吧,终于我发现了我的愚蠢,我到底做了什么。其实是2个大失误。
- 首先,我使用了 permission_hander 并且没有请求通知权限,因为我认为当我将远程通知添加到
plist
文件时它会自动请求。 - 其次,我太愚蠢了,我创建了 2 个 firebase 项目,从另一个添加了 android (
google-service.json
) 和 ios(google-service.plist
) 的配置文件来自其他项目。并从其中之一添加server-key
到后端。 FCM 代币没问题。
这就是它仅适用于 android 的原因。
现在我意识到自己的愚蠢并删除了重复的 firebase 项目之一,并添加了原始项目的配置文件并将我的 server-key
更新到我的后端。并使用 permission_handler
请求通知许可。就这些了。