是否可以使用 Firebase 云消息传递 (FCM) 直接从设备将 PushNotifications 发送到特殊的 UDID?

Posted

技术标签:

【中文标题】是否可以使用 Firebase 云消息传递 (FCM) 直接从设备将 PushNotifications 发送到特殊的 UDID?【英文标题】:Is it possible to send PushNotifications, using Firebase Cloud Messaging (FCM) to special UDID, directly from device? 【发布时间】:2016-06-04 19:11:16 【问题描述】:

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

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

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

【问题讨论】:

我在这里有相同概念的问题:***.com/questions/62902631/… 【参考方案1】:

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

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

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

【讨论】:

看来我需要一个服务器来发送推送通知。感谢您的回复! androidios都可以 通过您的刷新令牌从设备获取【参考方案2】:

是的,您可以通过 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"

【讨论】:

你说是,其他人说不是……包括为 firebase 工作的人……那么正确答案是什么? 它们在技术上都是正确的。这个答案是可行的,但不应该这样做,因为您将服务器密钥暴露给世界 嘿@Dupinderkaur 你能告诉我如何在swift代码中做到这一点吗?我做了类似的事情,但我得到错误代码 401。意味着请求未授权。【参考方案3】:

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

From the Google Cloud Functions documentation:

开发者可以使用 Cloud Functions 来保持用户的参与度并保持最新状态 日期与有关应用程序的相关信息。例如,考虑一个 允许用户在应用程序中关注彼此的活动的应用程序。 在这样的应用程序中,由实时数据库触发的函数写入 存储新的关注者可以创建 Firebase 云消息传递 (FCM) 通知让适当的用户知道他们已经获得 新的追随者。

例子:

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

    该函数编写一条消息以通过 FCM 发送。

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

Here is a demo project 用于使用 Firebase 和 Google Cloud Functions 发送设备到设备的推送通知。

【讨论】:

【参考方案4】:

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

有关云功能的更多信息,您可以查看official docs。

【讨论】:

【参考方案5】:

我有一个应用程序,其中包含“向开发者发送反馈”部分。我的 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()
  

【讨论】:

【参考方案6】:

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

【讨论】:

以上是关于是否可以使用 Firebase 云消息传递 (FCM) 直接从设备将 PushNotifications 发送到特殊的 UDID?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 Firebase 云消息传递和 Liferay 推送通知

是否可以在 Firebase 云消息传递中删除或更新推送通知?

Firebase 云消息传递都有哪些参数可用?

是否跨 Firebase 项目共享云消息传递主题?

Firebase 云消息传递 - 有多个主题 - 没有消息重复

在 FCM(Firebase 云消息传递)中,在通知中包含令牌是不是安全?