Firebase:提供给sendToDevice()的注册令牌必须是非空字符串或非空数组



使用FCM向我的iOS设备发送推送通知。只是没能让它发挥作用。设法获取令牌,但由于某种原因,sendToDevice((不接受该令牌从Firebase控制台接收消息时,swift代码似乎工作正常。请帮忙!我只想要一个非常简单的推送通知!顾客的新订单和厨师会收到推送通知,最好带有声音和徽章。谢谢大家!

const functions = require('firebase-functions');
const admin = require('firebase-admin');
admin.initializeApp(functions.config().firebase);
//register to onWrite event of my node news
exports.sendPushNotification = functions.database.ref('/Customer/Orders/{id}').onCreate((snap, context) => {
//get the snapshot of the written data
const snapShot = snap.val();
console.log(snapShot);
//create a notification
const payload = {
notification: {
title: "New Order",
body: "Please Check",
badge: '1',
sound: 'default',
}
};
//send a notification to all fcmToken that are registered
//In my case the users device token are stored in a node called 'fcmTokens'
//and all user of my app will receive the notification
return admin.database().ref('/Customer/fcmTokens').once('value').then(allToken => {
const token = Object.keys(allToken.val());
console.log(token);
return admin.messaging().sendToDevice(token, payload)
});
});

Console.log(令牌(如下{fcmToken:'eRAAQEJAowI:APA91bHhZAa-kBhynq5b8_LkOhzYcp3v06H4IB5NgRp6k-2tZl67nF_eWuVHxL07KlzDVRfaINyoXBWDAJDFIFN23415NCHU-gZvK1LKw6Rwx8zz9S-'}

给出的错误是"错误:提供给sendToDevice((的注册令牌必须是非空字符串或非空数组。">

我的Appledelegate.swift代码-直接来自谷歌的firebase github

import UIKit
import Firebase
import FirebaseMessaging
import FirebaseInstanceID
import UserNotifications
@UIApplicationMain
class AppDelegate: UIResponder, UIApplicationDelegate {
var window: UIWindow?
let gcmMessageIDKey = "gcm.message_id"
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {
FirebaseApp.configure()
Messaging.messaging().delegate = self
Database.database().isPersistenceEnabled = true
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()
// [END register_for_notifications]
return true
}
// [START receive_message]
func application(_ application: UIApplication, didReceiveRemoteNotification userInfo: [AnyHashable: Any]) {
// If you are receiving a notification message while your app is in the background,
// this callback will not be fired till the user taps on the notification launching the application.
// TODO: Handle data of notification
// With swizzling disabled you must let Messaging know about the message, for Analytics
// Messaging.messaging().appDidReceiveMessage(userInfo)
// Print message ID.
if let messageID = userInfo[gcmMessageIDKey] {
print("Message ID: (messageID)")
}
// Print full message.
print(userInfo)
}
func application(_ application: UIApplication, didReceiveRemoteNotification userInfo: [AnyHashable: Any],
fetchCompletionHandler completionHandler: @escaping (UIBackgroundFetchResult) -> Void) {
// If you are receiving a notification message while your app is in the background,
// this callback will not be fired till the user taps on the notification launching the application.
// TODO: Handle data of notification
// With swizzling disabled you must let Messaging know about the message, for Analytics
// Messaging.messaging().appDidReceiveMessage(userInfo)
// Print message ID.
if let messageID = userInfo[gcmMessageIDKey] {
print("Message ID: (messageID)")
}
// Print full message.
print(userInfo)
completionHandler(UIBackgroundFetchResult.newData)
}
// [END receive_message]
func application(_ application: UIApplication, didFailToRegisterForRemoteNotificationsWithError error: Error) {
print("Unable to register for remote notifications: (error.localizedDescription)")
}
// This function is added here only for debugging purposes, and can be removed if swizzling is enabled.
// If swizzling is disabled then this function must be implemented so that the APNs token can be paired to
// the FCM registration token.
func application(_ application: UIApplication, didRegisterForRemoteNotificationsWithDeviceToken deviceToken: Data) {
print("APNs token retrieved: (deviceToken)")
// With swizzling disabled you must set the APNs token here.
// Messaging.messaging().apnsToken = deviceToken
}
}
// [START ios_10_message_handling]
@available(iOS 10, *)
extension AppDelegate : UNUserNotificationCenterDelegate {
// Receive displayed notifications for iOS 10 devices.
func userNotificationCenter(_ center: UNUserNotificationCenter,
willPresent notification: UNNotification,
withCompletionHandler completionHandler: @escaping (UNNotificationPresentationOptions) -> Void) {
let userInfo = notification.request.content.userInfo
// With swizzling disabled you must let Messaging know about the message, for Analytics
// Messaging.messaging().appDidReceiveMessage(userInfo)
// Print message ID.
if let messageID = userInfo[gcmMessageIDKey] {
print("Message ID: (messageID)")
}
// Print full message.
print(userInfo)
// Change this to your preferred presentation option
completionHandler([])
}
func userNotificationCenter(_ center: UNUserNotificationCenter,
didReceive response: UNNotificationResponse,
withCompletionHandler completionHandler: @escaping () -> Void) {
let userInfo = response.notification.request.content.userInfo
// Print message ID.
if let messageID = userInfo[gcmMessageIDKey] {
print("Message ID: (messageID)")
}
// Print full message.
print(userInfo)
completionHandler()
}
}
// [END ios_10_message_handling]
extension AppDelegate : MessagingDelegate {
// [START refresh_token]
func messaging(_ messaging: Messaging, didReceiveRegistrationToken fcmToken: String) {
print("Firebase registration token: (fcmToken)")
let ref = Database.database().reference().child("Customer").child("fcmTokens")
ref.setValue(["fcmToken" : "(fcmToken)"])
let dataDict:[String: String] = ["token": fcmToken]
NotificationCenter.default.post(name: Notification.Name("FCMToken"), object: nil, userInfo: dataDict)
// TODO: If necessary send token to application server.
// Note: This callback is fired at each app startup and whenever a new token is generated.
}
// [END refresh_token]
// [START ios_10_data_message]
// Receive data messages on iOS 10+ directly from FCM (bypassing APNs) when the app is in the foreground.
// To enable direct data messages, you can set Messaging.messaging().shouldEstablishDirectChannel to true.
func messaging(_ messaging: Messaging, didReceive remoteMessage: MessagingRemoteMessage) {
print("Received data message: (remoteMessage.appData)")
}
// [END ios_10_data_message]
}

如果代码是这个

Console.log(token) 

你在控制台上看到的是这个

{ fcmToken: 'eRAAQEJAowI:APA91bHhZAa-kBhynq5b8_LkOhzYcp3v06H4IB5NgRp6k-2tZl67nF_eWuVHxL07KlzDVRfaINyoXBWDAJDFIFN23415NCHU-gZvK1LKw6Rwx8zz9S-' }

则令牌是由字段组成的某种对象

fcmToken

和一个值

'eRAAQEJAowI:APA91bHhZAa-kBhynq5b8_LkOhzYcp3v06H4IB5NgRp6k-2tZl67nF_eWuVHxL07KlzDVRfaINyoXBWDAJDFIFN23415NCHU-gZvK1LKw6Rwx8zz9S-'

你需要从代币中提取价值,这样你最终只能获得

'eRAAQEJAowI:APA91bHhZAa-kBhynq5b8_LkOhzYcp3v06H4IB5NgRp6k-2tZl67nF_eWuVHxL07KlzDVRfaINyoXBWDAJDFIFN23415NCHU-gZvK1LKw6Rwx8zz9S-'

我猜

token.fcmToken

你可以在这里测试https://www.w3schools.com/code/tryit.asp?filename=G2Y6TKTR4ZD7

相关内容