gpt4 book ai didi

ios - Flutter 推送通知 : Unable to receive notifications in background or when app is closed

转载 作者:行者123 更新时间:2023-12-02 11:08:55 27 4
gpt4 key购买 nike

我正在为 Android 和 iOS 开发一个 flutter 应用程序。它有通知,所以我确实实现了 firebase_messaging API。我正在通过设备 ID 向某些设备发送通知,并向 topics 发送通知。
我正在测试 topics 通知发送,它在 Android 中可以 100% 正常工作。我按照上面提供的链接中的指南,也实现了 iOS 设置。但是在 iOS 中,当通知被发送时,只有当它在前台时才会被应用程序接收。这意味着,只能通过 onMessage 。如果应用程序处于后台或关闭状态,我看不到任何通知(我在控制台中打印它)。但是当我重新打开应用程序时,会打印通知。
以下是我的通知注册码

    FirebaseMessagesImpl msg = FirebaseMessagesImpl();
msg.requestPermissions();

//Get configured with firebase messaging to recieve messages
msg.getMessage().then((_) {
msg.register().then((String token) {
print(token);

//Register to the `topic` so we get messages sent to the topic
msg.topicRegister();
.........
}
FirebaseMessagesImpl
  import 'package:firebase_messaging/firebase_messaging.dart';

import 'package:http/http.dart' as http;
import 'dart:convert' as convert;

class FirebaseMessagesImpl {
final FirebaseMessaging _firebaseMessaging = FirebaseMessaging();

String serverToken =
"AAAAAAA:XXXXXXXXX-YYYYYYYY-ZZZZ-BBBBBBBB";

Future<String> register() async {
String token = "";
_firebaseMessaging.getToken().then((t) {
token = t;
print("ha: " + t);
});

return token;
}

Future<void> getMessage() async {
_firebaseMessaging.configure(
onMessage: (Map<String, dynamic> message) async {
print('on message $message');
//setState(() => _message = message["notification"]["title"]);
}, onResume: (Map<String, dynamic> message) async {
print('on resume $message');
// setState(() => _message = message["notification"]["title"]);
}, onLaunch: (Map<String, dynamic> message) async {
print('on launch $message');
//setState(() => _message = message["notification"]["title"]);
});
}

void topicRegister() {
// _firebaseMessaging.subscribeToTopic("mobile_admin");
_firebaseMessaging.subscribeToTopic("puppies");
}



void requestPermissions() async
{
await _firebaseMessaging.requestNotificationPermissions(
const IosNotificationSettings(sound:true, badge:true, alert:true, provisional:false)
);
}
}
下面是我的 Info.plist
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>FirebaseAppDelegateProxyEnabled</key>
<false/>
<key>CFBundleDevelopmentRegion</key>
<string>$(DEVELOPMENT_LANGUAGE)</string>
<key>CFBundleExecutable</key>
<string>$(EXECUTABLE_NAME)</string>
<key>CFBundleIdentifier</key>
<string>$(PRODUCT_BUNDLE_IDENTIFIER)</string>
<key>CFBundleInfoDictionaryVersion</key>
<string>6.0</string>
<key>CFBundleName</key>
<string>MY APP NAME</string>
<key>CFBundlePackageType</key>
<string>APPL</string>
<key>CFBundleShortVersionString</key>
<string>$(FLUTTER_BUILD_NAME)</string>
<key>CFBundleSignature</key>
<string>????</string>
<key>CFBundleVersion</key>
<string>$(FLUTTER_BUILD_NUMBER)</string>
<key>LSRequiresIPhoneOS</key>
<true/>
<key>UIBackgroundModes</key>
<array>
<string>fetch</string>
<string>remote-notification</string>
</array>
<key>UILaunchStoryboardName</key>
<string>LaunchScreen</string>
<key>UIMainStoryboardFile</key>
<string>Main</string>
<key>UISupportedInterfaceOrientations</key>
<array>
<string>UIInterfaceOrientationPortrait</string>
<string>UIInterfaceOrientationLandscapeLeft</string>
<string>UIInterfaceOrientationLandscapeRight</string>
</array>
<key>UISupportedInterfaceOrientations~ipad</key>
<array>
<string>UIInterfaceOrientationPortrait</string>
<string>UIInterfaceOrientationPortraitUpsideDown</string>
<string>UIInterfaceOrientationLandscapeLeft</string>
<string>UIInterfaceOrientationLandscapeRight</string>
</array>
<key>UIViewControllerBasedStatusBarAppearance</key>
<false/>
</dict>
</plist>
下面是 AppDelegate.swift
import UIKit
import Flutter
import Firebase

@UIApplicationMain
@objc class AppDelegate: FlutterAppDelegate {
override func application(
_ application: UIApplication,
didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?
) -> Bool {
FirebaseApp.configure()
GeneratedPluginRegistrant.register(with: self)
if #available(iOS 10.0, *) {
UNUserNotificationCenter.current().delegate = self as? UNUserNotificationCenterDelegate
}
return super.application(application, didFinishLaunchingWithOptions: launchOptions)
}

override func application(_ application: UIApplication, didRegisterForRemoteNotificationsWithDeviceToken deviceToken: Data) {

Messaging.messaging().apnsToken = deviceToken
super.application(application, didRegisterForRemoteNotificationsWithDeviceToken: deviceToken)
}
}
正如其他人在其他答案中所推荐的那样,我从 AppDelegate.swift 代码中删除了以下部分并进行了尝试,但同样的问题仍然存在。
if #available(iOS 10.0, *) {
UNUserNotificationCenter.current().delegate = self as? UNUserNotificationCenterDelegate
}
我已经将苹果 key 文件上传到 Firebase 项目 cloud messaging 部分,如指南中所述。
下面是我发送通知的 JSON 代码
{
"notification": {
"body": "body",
"title": "title"
},
"priority": "high",
"data": {
"body": "body",
"title": "title",
"click_action": "FLUTTER_NOTIFICATION_CLICK",
"id": "1",
"status": "done",
"image": "https://ibin.co/2t1lLdpfS06F.png"
},
"to": "/topics/puppies"
}
我的登录功能如下
enter image description here
我是 iOS 新手,不知道发生了什么。我想就像在 Android 中一样,当应用程序处于后台或关闭时,通知会自动出现在通知栏中。
更新
根据@nandish 的建议,我将 AppDelegate.swift 文件更改如下
import UIKit
import Flutter
import Firebase

@UIApplicationMain
@objc class AppDelegate: FlutterAppDelegate, UNUserNotificationCenterDelegate {
override func application(
_ application: UIApplication,
didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?
) -> Bool {
FirebaseApp.configure()
GeneratedPluginRegistrant.register(with: self)
UNUserNotificationCenter.current().delegate = self

return super.application(application, didFinishLaunchingWithOptions: launchOptions)
}

override func application(_ application: UIApplication, didRegisterForRemoteNotificationsWithDeviceToken deviceToken: Data) {

Messaging.messaging().apnsToken = deviceToken
super.application(application, didRegisterForRemoteNotificationsWithDeviceToken: deviceToken)
}

// MARK: - UNUserNotificationCenterDelegate Method
func userNotificationCenter(_ center: UNUserNotificationCenter, willPresent notification: UNNotification, withCompletionHandler completionHandler: @escaping (UNNotificationPresentationOptions) -> Void) {
completionHandler([.alert])
}

func userNotificationCenter(_ center: UNUserNotificationCenter, didReceive response: UNNotificationResponse, withCompletionHandler completionHandler: @escaping () -> Void) {

}
}
然后我结束了以下错误
UNUserNotificationCenter' is only available in iOS 10.0 or newer
func userNotificationCenter(_ center: UNUserNotificationCenter, willPresent notification: UNNotification, withCompletionHandler completionHandler: @escaping (UNNotificationPresentationOptions) -> Void) {
更新
在前台,发出通知时,我从应用程序收到以下响应。那也只是在 iPhone 模拟器中,而不是在真实设备中。
{from: /topics/puppies, status: done, id: 1, notification: {body: body, title: title, e: 1, tag: topic_key_9204266xxxxxxx535}, title: title, image: https://ibin.co/2t1lLdpfS06F.png, collapse_key: com.aaa.xxx, body: body, click_action: FLUTTER_NOTIFICATION_CLICK}

最佳答案

当他们在 firebase_messaging 6.0.16 中发现问题时,我遇到了一个非常相似的问题,现在它已更新到 7.0.0
我调整了我的 info.plist 并改变了

<key>FirebaseAppDelegateProxyEnabled</key><false/>
<key>FirebaseAppDelegateProxyEnabled</key>
<string>false</string>
奇怪的是,我的通知在 firebase_6.0.9 中工作,因为我没有升级到较新的通知。
我的 appdelegate 是:
@UIApplicationMain
@objc class AppDelegate: FlutterAppDelegate {
override func application(
_ application: UIApplication,
didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?
) -> Bool {
GeneratedPluginRegistrant.register(with: self)
//FirebaseApp.configure()
if #available(iOS 10.0, *) {
UNUserNotificationCenter.current().delegate = self as? UNUserNotificationCenterDelegate
}
return super.application(application, didFinishLaunchingWithOptions: launchOptions)
}
}
它与你的有些不同。

关于ios - Flutter 推送通知 : Unable to receive notifications in background or when app is closed,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63227853/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com