flutter - 收到 fcm onBackgroundMessage 后颤振打开应用程序
问题描述
我已经将 FCM 与颤振集成在一起,当我从服务器发送数据消息时它工作正常。我的问题是如何使用 onBackgroundMessage 打开应用程序或特定屏幕。实际上,我正在使用 agora 构建视频通话应用程序,如果应用程序处于后台或关闭状态,我想使用 fcm 显示来电屏幕,例如 whatsapp。现在我只打印数据。我尝试了各种方法,但没有一种方法有效。我在 android 上完成了这项工作,因为在 android 中我可以在应用程序内的任何地方获取应用程序上下文。问题是我无法在 onBackgroundMessageHandler 函数中获取上下文。
下面是在前台显示来电屏幕的代码。
_firebaseMessaging.configure(
onMessage: (Map<String, dynamic> message) async {
print('on message $message');
if(message['data']['purpose'].toString().contains("video")){
Navigator.popAndPushNamed(context, IncomingCall.routeName, arguments: RouteIncoming(
int.parse(message['data']['clientid']), message['data']['token'], message['data']['username']
));
Provider.of<CallStatus>(context).setStatus(-1);
Provider.of<CallStatus>(context).setIncoming(-1);
}
else if(message['data']['purpose'].toString().contains("reject")) {
Provider.of<CallStatus>(context).setStatus(0);
}
else if(message['data']['purpose'].toString().contains("cancel")){
Provider.of<CallStatus>(context).setIncoming(0);
}
//_showMyDialog(message);
},
onBackgroundMessage: Platform.isIOS ? null : myBackgroundMessageHandler ,
onResume: (Map<String, dynamic> message) async {
print('on resume $message');
print(message['data']['token']);
Navigator.pushNamed(context, IncomingCall.routeName, arguments: RouteIncoming(
int.parse(message['data']['clientid']), message['data']['token'], message['data']['username']
));
},
onLaunch: (Map<String, dynamic> message) async {
print('on launch $message');
Navigator.popAndPushNamed(context, IncomingCall.routeName, arguments: RouteIncoming(
int.parse(message['data']['clientid']), message['data']['token'], message['data']['username']
));
},
);
这是 myBackgroundMessageHandler 的代码
Future<dynamic> myBackgroundMessageHandler(Map<String, dynamic> message) async {
print("onBackgroundMessage: $message");
}
我用于发送 FCM 数据消息的 PHP 代码
$clientid = $this->input->post('clientid');
$userdata = $this->signin_model->send_token_m($clientid);
$url = 'https://fcm.googleapis.com/fcm/send';
$fields = array (
'registration_ids' => array (
"$userdata->firebase_token"
),
'data' => array (
"purpose" => "video",
"clientid" => $clientid,
)
);
$fields = json_encode ( $fields );
$headers = array (
'Authorization: key=' . "......",
'Content-Type: application/json'
);
$ch = curl_init ();
curl_setopt ( $ch, CURLOPT_URL, $url );
curl_setopt ( $ch, CURLOPT_POST, true );
curl_setopt ( $ch, CURLOPT_HTTPHEADER, $headers );
curl_setopt ( $ch, CURLOPT_RETURNTRANSFER, true );
curl_setopt ( $ch, CURLOPT_POSTFIELDS, $fields );
$result = curl_exec ( $ch );
echo $result;
我尝试了每个链接,包括这个https://github.com/FirebaseExtended/flutterfire/issues/2387
解决方案
使用 onBackgroundMessage 中的颤振“methodChannel”函数调用本机代码。
推荐阅读
- azure - 如何从 Azure Key Vault 读取和更新 Azure Logic App 的 parameters.json 文件中的机密信息
- r - 将 ts 对象转换为人类可读的时间格式
- bash - Gatsby develop 命令在 macOS High Sierra 上失败,没有显示错误消息
- node.js - 如何将 Moodle 中的学生数据导入 LTI 工具(Web 应用程序)
- html - 如何在其 flexbox 父容器包装之前使子 div 包装?
- pytorch - PyTorch Jupyter Notebook 图像无法找到火炬
- firebase - 我的 FirebaseStorage 方法没有在 Flutter 中运行。在 `firebase_storage: ^4.0.0` 之后
- javascript - 具有嵌套父项和子项的复选框树视图。?
- react-native - React navigation v5 - 如何从底部标签打开抽屉并显示底部标签的抽屉背面
- selenium - 无法在 xpath 中使用和条件定位元素