gpt4 book ai didi

javascript - React Native/Firebase Messaging - 永远不会发送消息/通知

转载 作者:行者123 更新时间:2023-11-28 23:47:44 32 4
gpt4 key购买 nike

我正在尝试获取推送通知/firebase messaging 以与 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 'Content-type: application/json' -H 'Authorization: key=server-key' -XPOST https://fcm.googleapis.com/fcm/send -d '{"to": "/topics/all","data": {"message": "This is a Firebase Cloud Messaging Topic Message!"}}'

我收到了:

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 网络控制台的它不起作用?这可能是一个需要由 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 它位于 firebase function logs 一侧) - 但我仍然没有在我的 iPhone 上收到实际通知。

为什么我没有收到正在发送的消息?

更新

我现在收到来 self 使用 firebase functions 创建的逻辑的通知,firebase 网络控制台似乎无法正常工作 - 通知仍然无法发送。

最佳答案

解决方案

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

无论如何,假设您没有任何 Android 设备并且它不能在您的 iOS 设备上运行,

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

  3. 在 iOS 设置中检查应用的通知权限

为什么?

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

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

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

关于javascript - React Native/Firebase Messaging - 永远不会发送消息/通知,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52394573/

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