能否使用Firebase Cloud Messaging(FCM)直接从设备向特定的UDID发送推送通知?

17

我考虑将所有的注册ID(push token)存储在数据库中,并从iPhone向用户发送通知。我尝试了类似这样的操作,但是没有收到任何通知。

func sendPNMessage() {
    FIRMessaging.messaging().sendMessage(
        ["body": "hey"], 
        to: TOKEN_ID, 
        withMessageID: "1", 
        timeToLive: 108)  
 } 
我做错了什么或者可能完全不可能实现?

我这里有一个与相同概念相关的问题: https://stackoverflow.com/questions/62902631/send-notification-from-device-to-another-with-firebase-in-android - Bhaa Rizik
6个回答

19

目前无法从应用程序本身发送消息。

您可以从Firebase Web控制台发送消息,或使用服务器端API从自定义服务器发送消息。

您可能想要做的是联系一个服务器(例如通过http调用),然后该服务器将向用户发送消息。 这样确保了服务器的API-KEY受到保护。

PS:被称为upstream功能的sendMessage(..) API可用于从您的应用程序发送消息到您的服务器,如果您的服务器与FCM服务器具有XMPP连接。


1
看起来我需要一个服务器来发送推送通知。谢谢您的回复! - Svitlana
在Android和iOS上都是可能的。 - Vishal Patoliya ツ
通过您从设备获取的刷新令牌。 - Vishal Patoliya ツ

7

您可以通过Firebase发送推送通知。请确保不要将服务器密钥包含在客户端中。有些“不那么好的人”的方式可以找到它并进行操作...正确的方法是让客户端指示您的应用程序服务器发送通知。

您需要向Google API端点发送HTTP-Post。

您需要以下标头:

Content-Type: application/json
Authorization: key={your_server_key}
You can obtain your server key within in the Firebase-Project.

HTTP-Post-Content: Sample

{ 
    "notification": {
        "title": "Notification Title",
        "text": "The Text of the notification."
    },
    "project_id": "<your firebase-project-id",
    "to":"the specific client-device-id"
}

你说“是”,其他人说“不是”......包括那些为 Firebase 工作的人......那么正确答案是什么? - Nerdy Bunz
它们在技术上都是正确的。这个答案是可行的,但不应该这样做,因为你会将服务器密钥暴露给全世界。 - Mbrevda
嘿@Dupinderkaur,你能给我展示一下如何用Swift代码实现吗?我已经做了类似的事情,但是我得到了401错误代码。这意味着请求未被授权。 - Salman Ali

4

Google Cloud Functions现在使得从设备到设备发送推送通知而无需应用服务器成为可能。

来自Google Cloud Functions文档:

开发者可以使用Cloud Functions让用户保持参与并及时了解有关应用程序的相关信息。例如,考虑一款允许用户关注其他用户活动的应用程序。在这样的应用程序中,由Realtime Database写入触发的函数可用于存储新关注者,以创建Firebase Cloud Messaging(FCM)通知,让适当的用户知道他们获得了新的关注者。

示例:

  1. 该函数会在存储关注者的Realtime Database路径上进行写操作时被触发。

  2. 该函数会组合一个通过FCM发送的消息。

  3. FCM将通知消息发送到用户的设备上。

这是一个使用Firebase和Google Cloud Functions发送设备间推送通知的演示项目。


1

Diego的回答非常准确,但Firebase也有云函数,非常方便在数据库中每次更改时发送通知。例如,假设您正在构建聊天应用程序并在每个新关注者更改时发送通知。此函数示例是一个非常好的例子。

有关云功能的更多信息,请查看官方文档


0

我有一个应用程序,其中包含“向开发人员发送反馈”的部分。 我的Firestore数据库中还有一个用户集合。 当用户登录应用程序时,我使用以下代码在SceneDelegate.swift中更新其FCM令牌,以使用户的数据得到更新:

import Firebase

func scene(_ scene: UIScene, willConnectTo session: UISceneSession, options connectionOptions: UIScene.ConnectionOptions) {

  authListener = Auth.auth().addStateDidChangeListener({ (auth, user) in
                
    Auth.auth().removeStateDidChangeListener(self.authListener!)
    if user != nil {
       DispatchQueue.main.async {
         let docRef = Firestore.firestore().collection("User").document((user?.email)!)
         docRef.getDocument { (snapshot, error) in
            guard let snapshot = snapshot else {return}
            Messaging.messaging().token { token, error in
              if let error = error {
                 print("Error fetching FCM registration token: \(error)")
              } else if let token = token {
                 docRef.updateData(["FCMtoken":token])
                 print("FCM registration token: \(token)")
              }
            }
          }
        }
      }
    })
  guard let _ = (scene as? UIWindowScene) else { return }
}

然后在我的反馈视图控制器中,我有这段代码来发送我的特定设备(但您可以在存储FCM令牌的数据库中查找/获取您想要的特定设备,在那里我插入了设备令牌)。要发送到的URL是“https://fcm.googleapis.com/fcm/send”,您可以通过转到Firebase中的项目设置,转到云消息选项卡并找到服务器密钥来查找YOUR-APP-FCM-KEY。

func sendMePushNotification() {
  let token = "INSERT-DEVICE-TOKEN-HERE"
  if let url = URL(string: "https://fcm.googleapis.com/fcm/send") {
    var request = URLRequest(url: url)
    request.allHTTPHeaderFields = ["Content-Type":"application/json", "Authorization":"key=YOUR-APP-FCM-KEY"]
    request.httpMethod = "POST"
    request.httpBody = "{\"to\":\"\(token)\",\"notification\":{\"title\":\"Feedback Sent!\",\"body\":\"\(self.feedbackBox.text!)\",\"sound\":\"default\",\"badge\":\"1\"},\"data\": {\"customDataKey\": \"customDataValue\"}}".data(using: .utf8)
    URLSession.shared.dataTask(with: request) { (data, urlresponse, error) in
      if error != nil {
         print("error")
      } else {
         print("Successfully sent!.....")
      }
    }.resume()
  }
}

-1
使用 OneSignal,你可以发送设备通知或设备分组,它可以和 Firebase 配合使用。 使用 OneSignal 函数创建特定的 ID,在 Firebase 数据库中保存它,然后当 ID 可以放入另一个用于发送通知的函数中。 备注:1-我在我的应用程序中使用它与 Firebase 完美配合 2-我可以提交那段代码,只要有人评论,我就能找到这个答案。

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