Flutter: 发布模式下 FCM iOS 推送通知无法正常工作

7

我已将我的 Flutter-iOS 应用绑定到 Firebase,并且还使用 Firebase-Messaging 和 Cloud Functions 通过订阅主题发送通知。我正在使用苹果开发者帐户的 APNs 推送通知密钥。当我使用选项 runner>flutter run main.dart 在发布模式下构建我的应用程序时,在我的手机上,FCM 通知不再起作用,而在开发模式下它可以正常工作。有人可以帮我修复这个问题吗?

这是我的 index.json 代码:

const functions = require('firebase-functions');
const admin = require('firebase-admin');

admin.initializeApp(functions.config().firebase);
 
var newData;
 
exports.messageTrigger = functions.firestore.document('notifications/{notificationsId}').onCreate(async (snapshot, context) => {
newData = snapshot.data();
const payload = {
    notification: {
        title: newData.title,
        body: newData.body,
        sound: 'default'
    },
    
        data: {
      click_action: 'FLUTTER_NOTIFICATION_CLICK',
      message: newData.title,
    }

};

if (newData.language === 'english'){
    await admin.messaging().sendToTopic('english', payload);
}
else if (newData.language === 'arabic'){
    await admin.messaging().sendToTopic('arabic', payload);
}
else if (newData.language === 'kurdish'){
    await admin.messaging().sendToTopic('kurdish', payload);
}
});

因此,package.json:
{
  "name": "functions",
  "description": "Cloud Functions for Firebase",
  "scripts": {
    "lint": "eslint .",
    "serve": "firebase emulators:start --only functions",
    "shell": "firebase functions:shell",
    "start": "npm run shell",
    "deploy": "firebase deploy --only functions",
    "logs": "firebase functions:log"
  },
  "engines": {
    "node": "10"
  },
  "dependencies": {
    "firebase-admin": "^8.10.0",
    "firebase-functions": "^3.6.1"
  },
  "devDependencies": {
    "eslint": "^5.12.0",
    "eslint-plugin-promise": "^4.0.1",
    "firebase-functions-test": "^0.2.0"
  },
  "private": true
}

你好,谢谢,我还没有在应用商店上发布它,只是在我的手机上构建并发布了,这是否也需要证书? - azheen
我没有使用推送通知证书,而是使用APNS密钥。 - azheen
安卓系统不需要APN密钥。请发送屏幕截图的链接。 - Amon C
你正在使用 Firebase Functions 吗? - Amon C
是的,云函数。 - azheen
显示剩余8条评论
5个回答

8

我的项目遇到了相同的问题。结合我找到的两种解决方案,最终解决了这个问题。(firebase_messaging 7.0.3)

关于调试模式,您不需要这些。

步骤1:编辑AppDelegate.swift文件。

import UIKit
import Flutter

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

    application.registerForRemoteNotifications()

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

步骤2:编辑ios/Runner/Info.plist文件。添加以下内容:

<key>FirebaseAppDelegateProxyEnabled</key>
<string>NO</string>

2
我遇到了类似的问题,只需添加以下代码 application.registerForRemoteNotifications()就解决了我的问题。 - eko
同样的问题,application.registerForRemoteNotifications()解决了我的问题。 - Aiyub Munshi
这对我也起作用了。谢谢。 - undefined

2

在将firebase_messaging更新到7.0.0之后,我遇到了同样的问题。我在我的AppDelegate.swift中添加了application.registerForRemoteNotifications(),然后它就可以工作了!


你能编辑并编写完整的应用委托吗? - azheen
无论我把它放在我的AppDelegate中的哪个位置,它都会给我一个错误。 - azheen
同时,我的代码是用Objective C编写的。 - azheen
1
@azheen https://gist.github.com/kabazyba/cbc381aa504ab63a7de893236f77e9d2 - Maks K. Maks

1
我尝试了很多方法。我进行了深入的研究,当我放弃时,我检查了我的Xcode设置,发现在Signing&Capabilities -> Debug -> Notification下添加了内容,但是在Signing&Capabilities -> Release中我没有添加。所以我添加了功能,然后它就可以工作了。请查看这个链接

目前你的回答不够清晰,请编辑并添加更多细节,以帮助其他人理解它如何回答问题。你可以在帮助中心找到有关如何编写好答案的更多信息。 - Community

0
你需要创建适当的证书来在发布模式下启用iOS的推送通知。
注意:即使你没有临时配置文件证书,在调试模式下一切都会正常运行。但在发布模式下是必需的。
  1. Apple沙盒推送服务证书
  2. 临时配置文件证书
  3. Apple开发、发布、签名证书都是必需的
请按照链接中的步骤进行操作:https://firebase.flutter.dev/docs/messaging/apple-integration/

0

我有同样的问题。看起来iOS发布需要额外的通知参数。

为了检查通知是否有效,您可以尝试直接从Firebase控制台发送消息。

云消息->发送您的第一条消息->输入通知标题和文本->发送测试消息->输入您的设备令牌->测试

要获取设备令牌,您可以使用print(await FirebaseMessaging().getToken());

要检查发布日志,请连接设备并打开Xcode->窗口->设备和模拟器->打开控制台

如果有效,您可以尝试添加这些参数:

const payload = {
 notification: {
    title: newData.title,
    body: newData.body,
    sound: 'default'
 },
 data: {
    click_action: 'FLUTTER_NOTIFICATION_CLICK',
    message: newData.title,
 },
 apns: {
    headers: { "apns-priority": "5" },
    payload: {
            aps: {
                contentAvailable: true,
                category: "NEW_MESSAGE_CATEGORY"
            }
        }
    },
};

但我不确定哪个参数有用:"apns-priority" 还是 contentAvailable


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接