【问题标题】:React Native / Firebase Messaging - messages/notifications are never sentReact Native / Firebase Messaging - 永远不会发送消息/通知
【发布时间】:2019-02-22 23:05:30
【问题描述】:

我正在尝试获取推送通知/firebase messaging 以使用 react native - 我已经检查/请求权限,并且我实施了onMessage,但我没有收到任何测试消息(从firebase 在线开发者控制台发送,在cloud messaging 部分)。奇怪的一件事是,当我检查 completed 消息的状态时,它说没有发送任何消息 (0 sent),所以我什至不知道我的应用程序是否有机会收到测试消息。这是我的代码:

HomeScreen.js(根导航器的默认路由)

export default class HomeScreen extends React.Component {

  ....

  componentDidMount() {

    firebase.messaging()
      .hasPermission()
      .then(enabled => {
        if (!enabled) {
          this._getPermission();
        }

        firebase.messaging().getToken()
          .then(fcmToken => {
            if (fcmToken) {
              // user has a device token
            } else {
              alert("User doesn't have a token yet");
            } 
          }).catch((error) => {
            alert(error);
          });

        firebase.messaging().subscribeToTopic('all').catch((error) => {alert(error)});

        this.onTokenRefreshListener = firebase.messaging().onTokenRefresh(fcmToken => {
            // Process your token as required

        });

        this.messageListener = firebase.messaging().onMessage((message: RemoteMessage) => {
            // Process your message as required
            alert(message);
        });

      }).catch((error) => {alert(error)});
  }

  _getPermission = () => {
    firebase.messaging()
      .requestPermission()
      .catch(error => {
        // User has rejected permissions
        this._getPermission();
      });
  };

  ....

  componentWillUnmount() {
    this.onTokenRefreshListener();
    this.messageListener();
    firebase.messaging().unsubscribeFromTopic('all');
  }

  ....

AppDelegate.h

/**
 * Copyright (c) 2015-present, Facebook, Inc.
 *
 * This source code is licensed under the MIT license found in the
 * LICENSE file in the root directory of this source tree.
 */

#import <UIKit/UIKit.h>
@import UserNotifications;

@interface AppDelegate : UIResponder <UIApplicationDelegate, UNUserNotificationCenterDelegate>

@property (nonatomic, strong) UIWindow *window;

@end

AppDelegate.m

/**
 * Copyright (c) 2015-present, Facebook, Inc.
 *
 * This source code is licensed under the MIT license found in the
 * LICENSE file in the root directory of this source tree.
 */

#import "AppDelegate.h"

#import <React/RCTBundleURLProvider.h>
#import <React/RCTRootView.h>
#import "RNFirebaseNotifications.h"
#import "RNFirebaseMessaging.h"
#import <Firebase.h>

@implementation AppDelegate

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
  [FIRApp configure];
  [RNFirebaseNotifications configure];

  NSURL *jsCodeLocation;

  for (NSString* family in [UIFont familyNames])
  {
    NSLog(@"%@", family);
    for (NSString* name in [UIFont fontNamesForFamilyName: family])
    {
      NSLog(@" %@", name);
    }
  }

  jsCodeLocation = [[RCTBundleURLProvider sharedSettings] jsBundleURLForBundleRoot:@"index" fallbackResource:nil];

  RCTRootView *rootView = [[RCTRootView alloc] initWithBundleURL:jsCodeLocation
                                                      moduleName:@"snagit"
                                               initialProperties:nil
                                                   launchOptions:launchOptions];
  rootView.backgroundColor = [[UIColor alloc] initWithRed:1.0f green:1.0f blue:1.0f alpha:1];

  self.window = [[UIWindow alloc] initWithFrame:[UIScreen mainScreen].bounds];
  UIViewController *rootViewController = [UIViewController new];
  rootViewController.view = rootView;
  self.window.rootViewController = rootViewController;
  [self.window makeKeyAndVisible];
  [[UNUserNotificationCenter currentNotificationCenter] setDelegate:self];

  return YES;
}

- (void)application:(UIApplication *)application didReceiveLocalNotification:(UILocalNotification *)notification {
  [[RNFirebaseNotifications instance] didReceiveLocalNotification:notification];
}

- (void)application:(UIApplication *)application didReceiveRemoteNotification:(nonnull NSDictionary *)userInfo
fetchCompletionHandler:(nonnull void (^)(UIBackgroundFetchResult))completionHandler{
  [[RNFirebaseNotifications instance] didReceiveRemoteNotification:userInfo fetchCompletionHandler:completionHandler];
}

- (void)application:(UIApplication *)application didRegisterUserNotificationSettings:(UIUserNotificationSettings *)notificationSettings {
  [[RNFirebaseMessaging instance] didRegisterUserNotificationSettings:notificationSettings];
}

@end

我的BUNDLE_ID 似乎都是正确的。为什么一开始没有发送消息和/或为什么我没有收到消息?

更新

尝试 FCM 会有帮助吗? https://github.com/evollu/react-native-fcm

更新

我的要求很糟糕,我得到了一个curl 尝试使用:

curl -i -H '内容类型:应用程序/json' -H '授权: 密钥=服务器密钥' -XPOST https://fcm.googleapis.com/fcm/send -d '{"to": "/topics/all","data": {"message": "这是 Firebase 云消息传递 主题消息!"}}'

我收到了:

HTTP/2 200 
content-type: application/json; charset=UTF-8
date: Tue, 18 Sep 2018 21:38:21 GMT
expires: Tue, 18 Sep 2018 21:38:21 GMT
cache-control: private, max-age=0
x-content-type-options: nosniff
x-frame-options: SAMEORIGIN
x-xss-protection: 1; mode=block
server: GSE
alt-svc: quic=":443"; ma=2592000; v="44,43,39,35"
accept-ranges: none
vary: Accept-Encoding

{"message_id":5323681878653027379}

那么为什么它不能从firebase Web 控制台运行呢?会不会是需要firebase解决的问题?

更新

为了进一步测试这是否在 firebase 方面,我编写了一个云函数,当某个文档被更新/创建/删除时应该发送通知:

exports.sendMessageNotification = functions.firestore().document('conversations/{conversationID}/messages/{messageID}').onWrite((change, context) => {

        // Get an object representing the document
        // e.g. {'name': 'Marie', 'age': 66}
        const newValue = change.after.data();

        // ...or the previous value before this update
        const previousValue = change.before.data();

        // access a particular field as you would any JS property
        //const name = newValue.name;

        var topic = 'all';
        var payload = {
          notification: {
            title: "You got a new Message",
            body: newValue.notification.body,
          }
        };

        admin.messaging().sendToTopic(topic, payload)
            .then(function(response) {
              console.log("Successfully sent message:", response);
            })
            .catch(function(error) {
              console.log("Error sending message:", error);
            });
      });

这是我成功将对象写入上述firestore 位置的代码:

....

constructor() {
    super();

    this.onTokenRefreshListener = firebase.messaging().onTokenRefresh(fcmToken => {
        // Process your token as required

    });

    this.messageListener = firebase.messaging().onMessage((message: RemoteMessage) => {
        // Process your message as required
        alert(message);
    });
    //this.ref = firebase.firestore().collection('items');
    //this.authSubscription = null;

}

....

componentDidMount() {

    firebase.messaging().getToken()
          .then(fcmToken => {
            if (fcmToken) {
              console.log(fcmToken);
              // Add a new document with a generated id.
              const addMessage = firebase.firestore().collection('conversations').doc('1234567').collection('messages').doc('1234567');

              data = {
                  notification: {
                    title: "You got a new Message",
                    body: "You got a new message",
                  }
              }
              // Set the 'capital' field of the city
              const updateMessage = addMessage.update(data).catch((error) => {
                alert(error);
                addMessage.set(data).catch((error) => {
                  alert(error);
                });
              });
            } else {
              alert("User doesn't have a token yet");
            } 

          }).catch((error) => {
            alert(error);
          });

    ....

}

对于输出,我看到了 console.log(fcmToken) 消息。当我检查firebase functions 日志时,我看到Successfully sent message: { messageId: 6994722519047563000 }。当我检查firestore 时,该文档已正确创建(或更新)并且它位于需要注意的正确位置(根据firebase function logs,它位于firebase 一侧)-但我仍然从未收到我的 iPhone 上的实际通知。

如果正在发送消息,为什么我没有收到?

更新

我现在收到来自我使用 firebase functions 创建的逻辑的通知,firebase Web 控制台似乎无法正常工作 - 通知仍然永远不会发送。

【问题讨论】:

  • 您是否在 Android 和 iOS 设备上测试过您的代码?
  • @JeffGuKang 不只ios

标签: javascript ios firebase react-native push-notification


【解决方案1】:

解决方案

首先,您需要在您的设备(不是模拟器)中获得推送通知。 我建议首先从 firebase web 控制台使用 iOS 和 Android 设备进行测试。除检查权限外,此过程不是处理推送通知的delegate 文件上的必需代码。

不管怎样,假设你没有任何安卓设备并且它不能在你的iOS设备上运行,

  1. 在 firebase 和 XCode 中检查包 ID 和 GoogleService-Info.plist。
  2. 在 XCode 上检查您的目标功能。推送通知和后台模式

  3. 在 iOS 的设置中查看 app 的通知权限

为什么?

我不知道你是如何设置你的firebase和XCode的,但是firebase web控制台推送通知的问题通常与权限、XCode设置和其他设置有关。

在我的例子中,问题在于 firebase 设置中的 bundle id 拼写错误。

如果可以,您也可以在 Android 上进行测试。

【讨论】:

猜你喜欢
  • 1970-01-01
  • 2013-12-01
  • 1970-01-01
  • 1970-01-01
  • 2021-06-28
  • 1970-01-01
  • 1970-01-01
  • 2017-01-05
  • 1970-01-01
相关资源
最近更新 更多