iOS 推送通知在 flutter 中不起作用

Mer*_*rez 5 ios firebase flutter firebase-cloud-messaging

我的应用程序需要推送通知。我只是遵循flutterfire 指南,android 工作正常,但不适用于 iOS 应用程序...我认为错误出在通知配置中,因为代码永远不会print("PUSH RECEIVED");FirebaseMessaging.onMessage.listen()或内部执行FirebaseMessaging.onBackgroundMessage()

\n

我的颤动医生-v:

\n
[\xe2\x88\x9a] Flutter (Channel dev, 1.27.0-4.0.pre, on Microsoft Windows [Version 10.0.19042.985], locale es-ES)\n    \xe2\x80\xa2 Flutter version 1.27.0-4.0.pre at C:\\SDKs\\flutter\n    \xe2\x80\xa2 Framework revision f8cd24de95 (3 months ago), 2021-02-16 11:24:17 -0800\n    \xe2\x80\xa2 Engine revision 1d537824d6\n    \xe2\x80\xa2 Dart version 2.13.0 (build 2.13.0-30.0.dev)\n\n[\xe2\x88\x9a] Android toolchain - develop for Android devices (Android SDK version 30.0.3)\n    \xe2\x80\xa2 Android SDK at C:\\Users\\Windows\\AppData\\Local\\Android\\sdk\n    \xe2\x80\xa2 Platform android-30, build-tools 30.0.3\n    \xe2\x80\xa2 Java binary at: C:\\Program Files\\Android\\Android Studio\\jre\\bin\\java\n    \xe2\x80\xa2 Java version OpenJDK Runtime Environment (build 1.8.0_242-release-1644-b01)\n    \xe2\x80\xa2 All Android licenses accepted.\n\n[\xe2\x88\x9a] Chrome - develop for the web\n    \xe2\x80\xa2 Chrome at C:\\Program Files\\Google\\Chrome\\Application\\chrome.exe\n\n[\xe2\x88\x9a] Android Studio (version 4.1.0)\n    \xe2\x80\xa2 Android Studio at C:\\Program Files\\Android\\Android Studio\n    \xe2\x80\xa2 Flutter plugin can be installed from:\n       https://plugins.jetbrains.com/plugin/9212-flutter\n    \xe2\x80\xa2 Dart plugin can be installed from:\n       https://plugins.jetbrains.com/plugin/6351-dart\n    \xe2\x80\xa2 Java version OpenJDK Runtime Environment (build 1.8.0_242-release-1644-b01)\n\n[\xe2\x88\x9a] Connected device (3 available)\n    \xe2\x80\xa2 SM G986B (mobile) \xe2\x80\xa2 ... \xe2\x80\xa2 android-arm64  \xe2\x80\xa2 Android 11 (API 30)\n    \xe2\x80\xa2 Chrome (web)      \xe2\x80\xa2 chrome      \xe2\x80\xa2 web-javascript \xe2\x80\xa2 Google Chrome 90.0.4430.212\n    \xe2\x80\xa2 Edge (web)        \xe2\x80\xa2 edge        \xe2\x80\xa2 web-javascript \xe2\x80\xa2 Microsoft Edge 90.0.818.62\n\n\xe2\x80\xa2 No issues found!\n
Run Code Online (Sandbox Code Playgroud)\n

pubspec.yaml:

\n
#https://firebase.google.com/docs/flutter/setup?platform=android\nfirebase_core: ^1.2.0\nfirebase_analytics: ^8.1.0\nfirebase_messaging: ^10.0.0\n#https://dev/packages/flutter_local_notifications/install\nflutter_local_notifications: ^5.0.0+4\n
Run Code Online (Sandbox Code Playgroud)\n

主要.dart:

\n
void main() async {\n  ...\n\n  await Firebase.initializeApp();\n  bFirebaseMessaging.init();\n\n  ...\n\n  runApp(MyApp());\n}\n\n...\n\nclass _MyAppState extends State<MyApp> {\n\n  ...\n\n  static Future<void> _throwGetMessage(RemoteMessage message) async {\n    print("PUSH RECEIVED");\n    await Firebase.initializeApp();\n    bFirebaseMessaging.showPushFromBackground(message);\n  }\n\n  @override\n  Widget build(BuildContext context) {\n    ...\n\n    FirebaseMessaging.onMessage.listen((RemoteMessage message) {\n      print("PUSH RECEIVED");\n      bFirebaseMessaging.showPush(message);\n    });\n\n    FirebaseMessaging.onBackgroundMessage(_throwGetMessage);\n\n    ...\n  }\n\n  ...\n}\n
Run Code Online (Sandbox Code Playgroud)\n

Pod文件:

\n
# Uncomment this line to define a global platform for your project\nplatform :ios, \'12.0\'\n$FirebaseSDKVersion = \'8.0.0\'\n\n...\n\ntarget \'Runner\' do\n  use_frameworks!\n  use_modular_headers!\n\n  flutter_install_all_ios_pods File.dirname(File.realpath(__FILE__))\n  pod \'FirebaseFirestore\', :git => \'https://github.com/invertase/firestore-ios-sdk-frameworks.git\', :tag => \'8.0.0\'\nend\n\n...\n
Run Code Online (Sandbox Code Playgroud)\n

bFirebaseMessaging.dart:

\n
class bFirebaseMessaging {\n\n  ...\n\n  static Future init() async {\n\n    // Declaration of variables\n    FirebaseMessaging firebaseMessaging = FirebaseMessaging.instance;\n    NotificationSettings settings = await firebaseMessaging.requestPermission(\n      alert: true,\n      announcement: false,\n      badge: true,\n      carPlay: false,\n      criticalAlert: false,\n      provisional: false,\n      sound: true,\n    );\n\n    print(\'User granted permission: ${settings.authorizationStatus}\');\n\n    if(Platform.isIOS){\n      await firebaseMessaging.setForegroundNotificationPresentationOptions(\n        alert: true, // Required to display a heads up notification\n        badge: true,\n        sound: true,\n      );\n    }\n  }\n\n  ...\n\n}\n
Run Code Online (Sandbox Code Playgroud)\n

另一方面,我配置了整个 Firebase:

\n
    \n
  • 创建了新的 iOS 应用程序
  • \n
  • 添加了团队 ID 和应用商店 ID
  • \n
  • 添加了带有密钥 ID 和团队 ID 的 APNS 身份验证密钥
  • \n
\n

额外文件:GoogleService-Info.plist,签名和能力

\n

iOS 设备收不到推送通知的原因有什么想法吗?我想我会提供所有必要的信息,如果您需要什么,请告诉我!提前致谢!

\n

小智 3

我在 ios 中的 firebase 推送通知也有同样的问题。我的 Android 推送通知工作正常,但在 ios 中却无法正常工作。

我所做的是按照 firebase 提供的说明集成推送通知(不是 flutter 指南,而是 ios 指南)请按照此链接https://firebase.google.com/docs/cloud-messaging/ios/client

在 ios 中,用户必须授予向他们发送推送通知的权限,这与 Android 不同,因此您要做的是将以下代码添加到 AppDelegate.swift

if #available(iOS 10.0, *) {
  // For iOS 10 display notification (sent via APNS)
  UNUserNotificationCenter.current().delegate = self
  let authOptions: UNAuthorizationOptions = [.alert, .badge, .sound]
  UNUserNotificationCenter.current().requestAuthorization(
    options: authOptions,
    completionHandler: { _, _ in }
  )
} else {
  let settings: UIUserNotificationSettings =
    UIUserNotificationSettings(types: [.alert, .badge, .sound], categories: nil)
  application.registerUserNotificationSettings(settings)
}
application.registerForRemoteNotifications()
Run Code Online (Sandbox Code Playgroud)

希望这有效