17

我正在考虑将所有注册 ID(推送令牌)保留在数据库中并从 iPhone 向用户发送通知。我尝试了这样的事情,但没有收到任何通知。

func sendPNMessage() {
    FIRMessaging.messaging().sendMessage(
        ["body": "hey"], 
        to: TOKEN_ID, 
        withMessageID: "1", 
        timeToLive: 108)  
 } 

我做错了什么,或者根本不可能?

4

6 回答 6

19

目前无法从应用程序本身发送消息。您可以从 Firebase Web 控制台发送消息,也可以使用服务器端 API 从自定义服务器发送消息。

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

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

于 2016-06-04T20:52:56.087 回答
7

是的,您可以通过 Firebase 发送推送通知。请确保不要将服务器密钥包含在您的客户端中。有一些“不那么伟大的人”可以找到它并做一些事情......实现这一目标的正确方法是让您的客户指示您的应用服务器发送通知。

您必须向 Google-API-Endpoint 发送 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"
}
于 2016-12-14T12:12:46.727 回答
4

Google Cloud Functions 现在可以在没有应用服务器的情况下从设备到设备发送推送通知。

来自 Google Cloud Functions 文档:

开发人员可以使用 Cloud Functions 来保持用户的参与度并及时了解有关应用程序的相关信息。例如,考虑一个允许用户在应用程序中关注彼此活动的应用程序。在这样的应用程序中,由实时数据库写入触发以存储新关注者的功能可以创建 Firebase 云消息 (FCM) 通知,让相应的用户知道他们获得了新关注者。

例子:

  1. 该函数在写入存储关注者的实时数据库路径时触发。

  2. 该函数编写要通过 FCM 发送的消息。

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

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

于 2017-11-04T01:28:10.230 回答
1

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

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

于 2018-10-26T12:28:52.047 回答
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 }
}

然后在我的反馈视图控制器中,我有这个代码来发送我的特定设备(但您可以在数据库中查找/获取您想要的特定设备,其中 FCMtoken 存储在我有 INSERT-DEVICE-TOKEN-HERE 的位置)。要发送到的网址是“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()
  }
}
于 2021-03-31T04:31:31.883 回答
-1

使用onesignal,您可以将设备发送到通知或设备发送到段,它可以通过这种方式与firebase一起使用使用onesignal函数创建特定的id,将其保存在firebase数据库中,然后可以将id放入另一个函数中用于发送通知注意事项:1-我在我的应用程序中使用它与 firebase 完美运行 2-我可以提交该代码,只是有人评论所以我可以找到这个答案

于 2018-06-15T09:19:06.383 回答