如何修复Flutter网站中设置推送通知的“ FirebaseError”类型的期望值,但获得“ DomException”类型的期望值?

时间:2020-05-25 12:17:57

标签: javascript firebase flutter flutter-web

我正在尝试在Flutter网站中设置Firebase通知。我遵循了此medium article,并能够进行基本设置。 但是,当用户单击允许授予权限时,就会出现此错误。

pattern = compile(r'\b(((([a-zA-Z0-9])|([a-zA-Z0-9][a-zA-Z0-9\-]{0,86} [a-zA-Z0-9]))\.(([a-zA-Z0-9])|([a-zA-Z0-9][a-zA-Z0-9\-]{0,73}[a-zA-Z0-9]))\.(([a-zA-Z0-9]{2,12}\.[a-zA-Z0-9]{2,12})|([a-zA-Z0-9]{2,25})))|((([a-zA-Z0-9])|([a-zA-Z0-9][a-zA-Z0-9\-]{0,162}[a-zA-Z0-9]))\.(([a-zA-Z0-9]{2,12}\.[a-zA-Z0-9]{2,12})|([a-zA-Z0-9]{2,25}))))\b', re.IGNORECASE) return pattern.match(text)``` def url_regex(text): pattern = compile(r'(http|https://)?:(?:[a-zA-Z]|[0-9]|[$-_@.&+]|[!*\(\),]|(?:%[0-9a-fA-F][0-9a-fA-F])+)', re.IGNORECASE) return pattern.match(text)

这是我的Expected a value of type 'FirebaseError', but got one of type 'DomException'文件

index.html

这是<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <meta content="IE=Edge" http-equiv="X-UA-Compatible"> <meta name="description" content="Lorem ipsum"> <meta name="robots" content="noindex"> <!-- iOS meta tags & icons --> <meta name="apple-mobile-web-app-capable" content="yes"> <meta name="apple-mobile-web-status-bar-style" content="black"> <meta name="apple-mobile-web-app-title" content="Flutter web notifications"> <meta id="flutterweb-theme" name="theme-color" content="#393557"> <link rel="icon" type="image/png" href="/icons/Icon-192.png"> <link rel="apple-touch-icon" href="/icons/Icon-192.png"> <title>Flutter web notifications</title> <link rel="manifest" href="./manifest.json"> </head> <body id="app-container"> <!-- This script installs service_worker.js to provide PWA functionality to application. For more information, see: https://developers.google.com/web/fundamentals/primers/service-workers --> <script src="https://www.gstatic.com/firebasejs/7.9.1/firebase-app.js"></script> <script src="https://www.gstatic.com/firebasejs/7.9.1/firebase-auth.js"></script> <script src="https://www.gstatic.com/firebasejs/7.9.1/firebase-firestore.js"></script> <script src="https://www.gstatic.com/firebasejs/7.9.1/firebase-messaging.js"></script> <script> if ('serviceWorker' in navigator) { window.addEventListener('load', function () { // navigator.serviceWorker.register('/flutter_service_worker.js'); navigator.serviceWorker.register("./firebase-messaging-sw.js"); }); } </script> <script src="https://www.gstatic.com/firebasejs/7.11.0/firebase-analytics.js"></script> <script> // Your web app's Firebase configuration var firebaseConfig = { apiKey: "API_KEY", authDomain: "AUTH_DOMAIN", databaseURL: "DATABASE_URL", projectId: "PROJECT_ID", storageBucket: "STORAGE_BUCKET", messagingSenderId: "MESSAGING_SENDER_ID", appId: "APP_ID", measurementId: "MEASUREMENT_ID" }; // Initialize Firebase firebase.initializeApp(firebaseConfig); firebase.analytics(); </script> <!-- <script src="/__/firebase/init.js"></script> --> <script src="main.dart.js" type="application/javascript"></script> </body> </html>

firebase-messaging-sw.js

这是 importScripts("https://www.gstatic.com/firebasejs/7.9.1/firebase-app.js"); importScripts("https://www.gstatic.com/firebasejs/7.9.1/firebase-messaging.js"); var firebaseConfig = { apiKey: "API_KEY", authDomain: "AUTH_DOMAIN", databaseURL: "DATABASE_URL", projectId: "PROJECT_ID", storageBucket: "STORAGE_BUCKET", messagingSenderId: "MESSAGING_SENDER_ID", appId: "APP_ID", measurementId: "MEASUREMENT_ID" }; firebase.initializeApp(firebaseConfig); // firebase.analytics(); const messaging = firebase.messaging(); messaging.setBackgroundMessageHandler(function (payload) { const promiseChain = clients .matchAll({ type: "window", includeUncontrolled: true }) .then(windowClients => { for (let i = 0; i < windowClients.length; i++) { const windowClient = windowClients[i]; windowClient.postMessage(payload); } }) .then(() => { return registration.showNotification("New Message"); }); return promiseChain; }); self.addEventListener('notificationclick', function (event) { console.log('notification received: ', event) });

firebase_messaging.dart

这是我向用户请求权限的方式

import 'dart:async';
import 'package:firebase/firebase.dart' as firebase;

class FBMessaging {
  FBMessaging._();
  static FBMessaging _instance = FBMessaging._();
  static FBMessaging get instance => _instance;
  // firebase.Messaging _mc;
  var _mc;
  String _token;

  final _controller = StreamController<Map<String, dynamic>>.broadcast();
  Stream<Map<String, dynamic>> get stream => _controller.stream;

  void close() {
    _controller?.close();
  }

  Future<void> init() async {
    _mc = firebase.messaging();
    _mc.usePublicVapidKey('FCM_SERVER_KEY');
    _mc.onMessage.listen((event) {
      _controller.add(event?.data);
    });
  }

  Future requestPermission() {
    // await init();
    return _mc.requestPermission();
  }

  Future<String> getToken([bool force = false]) async {
    if (force || _token == null) {
      // await requestPermission();
      _token = await _mc.getToken();
    }
    return _token;
  }
}

但这是用户单击允许时出现的错误

final _messaging = FBMessaging.instance;
() async {
  _messaging
   .init()
    .then((_) async {
     await _messaging
     .requestPermission()
     .then((_) async {
   final _token =
     await _messaging
     .getToken();
     print('Token: $_token');
    });
  });
}

1 个答案:

答案 0 :(得分:0)

1.在 Firebase 控制台注册您的应用

2.在 Firebase 控制台生成新的配对密钥

教程:https://firebase.google.com/docs/cloud-messaging/js/client#generate_a_new_key_pair

3.使用您的配对密钥

将您已经生成的配对密钥复制到“FCM_SERVER_KEY”(而不是您的 FCM SERVER KEY)。

   Future<void> init() async {
    _mc = firebase.messaging();
    _mc.usePublicVapidKey('FCM_SERVER_KEY');
    _mc.onMessage.listen((event) {
      _controller.add(event?.data);
    });
  }