【问题标题】:Firebase Cloud Messaging Programatically with Swift 3.0使用 Swift 3.0 以编程方式进行 Firebase 云消息传递
【发布时间】:2016-12-13 12:27:18
【问题描述】:

我在这里可能有点慢,但是可以通过 firebase 以编程方式发送推送通知吗?

假设我有一个 iOS 应用和一个按钮事件。当我按下该按钮时,我想通过 firebase 向某些用户发送一个推送通知,上面写着“Hello World!”。

我现在看到的唯一方法是使用通知控制台,但我想以编程方式进行。我真的必须有自己的服务器才能做到这一点吗?

除了拥有我自己的服务器之外,您还推荐什么作为现在以编程方式发送远程推送通知的最简单方法?

【问题讨论】:

  • 这是一个非常模糊的问题,因为不知道为什么,我们可能会提供错误的答案。是的,您可以通过编程方式发送通知,但在许多情况下这是错误的解决方案 - 例如,您可能希望使用 Observe 和 Query 来通知客户端事件。
  • 好的,如果是错误的解决方案。什么是正确的解决方案?
  • 同样,如果不了解用例,就无法以一种或另一种方式提出建议。我理解你的 Hello, World 但这不是你最终想要做的。为什么要发送推送通知,它们将包含什么?为什么不使用观察和查询让客户知道数据的变化?您是否阅读过 Firebase Getting Started Guide 指南,该指南涵盖了如何在没有推送通知的情况下通知客户端?

标签: ios swift xcode firebase firebase-cloud-messaging


【解决方案1】:

目前,没有。如果没有您自己的服务器来执行逻辑,则不推荐通过 Firebase Cloud Messaging 执行此操作。 (我不会像 Dupinder 推荐的那样从客户端调用服务,因为它会将您的服务器密钥泄露给世界,这确实是一件坏事)

也就是说,这肯定是团队经常听到的一项功能请求,因此他们肯定知道并正在研究这一点。

【讨论】:

    【解决方案2】:

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

    您必须向 Google-API-Endpoint 发送 HTTP-Post。

    您需要以下标题:

    Content-Type: application/json
    Authorization: key={your_server_key}
    

    您可以在 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"
    }
    

    【讨论】:

      【解决方案3】:

      是的,我们可以通过 firebase 以编程方式发送推送通知。我已经通过获取两个用户的设备令牌并在发送按钮上点击一个 api 来尝试这个。看看..

      let url  = NSURL(string: "https://fcm.googleapis.com/fcm/send")
      
      let request = NSMutableURLRequest(URL: url!)
      
      request.setValue("your server key ", forHTTPHeaderField:"Authorization") // your legacy server key
      
      
        request.setValue("ebl0RxL94Ss:APA91bGXn_i6TLcXC1rZZSO1pKXCnqKjg-SxOHsjdahoJ4qIjVxX6dwal3YNeCvpHltEnwHibEuldWzfTiQewgD_J_4HIg31VE_vyvONdHN9v6VQGRcY6PaXY1xZmJ9t_cKfs7sQ9K1q", forHTTPHeaderField:"Authentification") //  sender refreshedToken 
      
      
       request.setValue("application/json", forHTTPHeaderField:"Content-Type")
      
        request.HTTPMethod = "POST"
      
       let sessionConfig = NSURLSessionConfiguration.defaultSessionConfiguration()
      
       // dictionary containing sender refreshedToken and  other notification detail including text
      
      let json = ["to":"c6HixiMte3A:APA91bFfNvQev2qcZqdsnJ9qoho_GlXRj1PWx6FWleScgExBi95WAkRqmp2jilCbZYoifs9bfHPyGpofjTAM239SYEiAwMRzgAONFv_KH-u49pG9C6f6UEVY4WEctjFzek9WZ7pBv31t",
                     "priority":"high",
                     "content_available":true,
                     "notification":["body":"new messages","title":text,"score":"5x1","time": "15:10"]]
      
      
              do {
      
                  let jsonData = try NSJSONSerialization.dataWithJSONObject(json, options: NSJSONWritingOptions.PrettyPrinted)
      
                 request.HTTPBody = jsonData 
      
                 } catch let error as NSError {
                  print(error)
              }
      
              // insert json data to the request
      
       let urlSession = NSURLSession(configuration: sessionConfig, delegate: self, delegateQueue: NSOperationQueue.mainQueue())
      
      
       let dataTask = urlSession.dataTaskWithRequest(request) { (data: NSData?, response: NSURLResponse?, error: NSError?) -> Void in 
      
                  let strData = NSString(data: data!, encoding: NSUTF8StringEncoding)
                  print("Body: \(strData)")
                  print(response,data)
                  print(error)
              }
      
              dataTask.resume()
      

      【讨论】:

      • 不要这样做!通过这样做,您实际上已经将您的服务器密钥泄露给了客户端,而坏人可能会开始使用它向您的用户发送看起来像是来自您的应用的通知的垃圾邮件。
      • @Dupinder。我很困惑。您是否在此代码中使用客户端的服务器密钥?那很危险。
      猜你喜欢
      • 1970-01-01
      • 2021-01-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-07-12
      • 1970-01-01
      • 1970-01-01
      • 2019-04-28
      相关资源
      最近更新 更多