如果您使用 firebase,可能的解决方法应该是这样的:
您需要为特定用户存储每个 Firebase FCM 令牌(此处需要考虑到用户可以从多个设备同时登录其帐户),以便您可以存储 userId em> 和他的 deviceUniqueId on flutter 你可以从 device_info https://pub.dev/packages/device_info 获得它:
String identifier;
final DeviceInfoPlugin deviceInfoPlugin = new DeviceInfoPlugin();
try {
if (Platform.isAndroid) {
var build = await deviceInfoPlugin.androidInfo;
identifier = build.id.toString();
} else if (Platform.isIOS) {
var data = await deviceInfoPlugin.iosInfo;
identifier = data.identifierForVendor;//UUID for iOS
}
} on PlatformException {
print('Failed to get platform version');
}
然后要获取 Firebase 为每个设备提供的唯一 CFM 令牌,您可以使用 Firebase firebase_messaging 插件 (https://pub.dev/packages/firebase_messaging) getToken() 获取它并将令牌插入到 Firestore(或您要存储它的其他数据库)
FirebaseMessaging firebaseMessaging = new FirebaseMessaging();
firebaseMessaging.requestNotificationPermissions(
const IosNotificationSettings(sound: true, badge: true, alert: true));
firebaseMessaging.onIosSettingsRegistered
.listen((IosNotificationSettings settings) {
print("Settings registered: $settings");
});
firebaseMessaging.getToken().then((token){
print('--- Firebase toke here ---');
Firestore.instance.collection(constant.userID).document(identifier).setData({ 'token': token});
print(token);
});
之后,您可以为一个用户插入一个或多个连接到多个设备的 FCM 令牌。 1 个用户……n 个设备,1 个设备……1 个唯一令牌,用于从 Firebase 获取推送通知。
当有新消息发送给该人时自动发送:现在您需要调用 Firestore API(确实非常快,但需要注意您在此处使用的计划限制) 或另一个 API 调用(如果您将令牌存储到另一个数据库),以便为每个用户获取令牌/令牌并发送推送通知。
要从 Flutter 发送推送通知,您可以使用 Future 异步函数。
Ps:我在这里传递一个 List 作为参数,以便使用 "registration_ids" 而不是 "to" 并将推送通知发送到多个令牌,如果用户已经在多个设备上登录。
Future<bool> callOnFcmApiSendPushNotifications(List <String> userToken) async {
final postUrl = 'https://fcm.googleapis.com/fcm/send';
final data = {
"registration_ids" : userToken,
"collapse_key" : "type_a",
"notification" : {
"title": 'NewTextTitle',
"body" : 'NewTextBody',
}
};
final headers = {
'content-type': 'application/json',
'Authorization': constant.firebaseTokenAPIFCM // 'key=YOUR_SERVER_KEY'
};
final response = await http.post(postUrl,
body: json.encode(data),
encoding: Encoding.getByName('utf-8'),
headers: headers);
if (response.statusCode == 200) {
// on success do sth
print('test ok push CFM');
return true;
} else {
print(' CFM error');
// on failure do sth
return false;
}
}
您还可以检查邮递员的邮递电话以进行一些测试。 POST 请求
在标题上添加:
-
key 授权 value key=AAAAO........ // 项目概览 -> 云消息传递 -> 服务器密钥
-
key Content-Type with value application/json
并在正文上添加
{
"registration_ids" :[ "userUniqueToken1", "userUniqueToken2",... ],
"collapse_key" : "type_a",
"notification" : {
"body" : "Test post",
"title": "Push notifications E"
}
}
"registration_ids" 将其发送到多个令牌(同一用户同时登录多个设备)
“to” 以便将其发送到单个令牌(每个用户一个设备/或始终更新与他的设备连接的用户令牌并具有 1 个令牌...1 个用户)
我正在对响应进行编辑,以便在受信任的环境或服务器上添加FCM 服务器密钥非常重要!