使用Firebase iOS Swift将特定设备的通知推送到特定设备

Nil*_*rni 5 notifications push ios firebase onesignal

我非常感谢Push Notifications的帮助.我的应用聊天,用户可以直接向对方发送短信.但是如果没有Push Notifications,它就没有多大意义.它全部设置在Firebase上.如何将推送通知从特定设备发送到特定设备?由于Stackoverflow的推荐,我确实尝试过Firebase Notifications和OneSignal.但我只能直接从Firebase或OneSignal触发通知,而不能从特定设备触发到特定设备.

有人有经验吗?

Kar*_*pez 8

如果您的数据存储在Firebease中,我也会使用云消息传递进行推送通知.有多种方法可以实现这种消息通知功能,我将恢复我认为最简单的方法.

假设您正在使用FCM并且已为其配置了应用程序.

首先,您需要存储用户设备的令牌,这将存储为每个用户信息的字符串:

let token = Messaging.messaging().fcmToken
Run Code Online (Sandbox Code Playgroud)

因此,在您的Firebase数据库中,在您的每个用户对象数据中,您将拥有一个存储带有令牌的字符串的密钥,如果您希望用户在多个设备中接收通知,则必须使用数组来存储用户的多个令牌.字符串,甚至是一组对象,并存储设备类型等.这是您的选择和需求.

理想的推送通知环境通常由接收请求并管理并向相应用户发送通知的中间服务器组成,在这种情况下,您可以跳过此操作并使用FCM POST请求服务直接从您的应用发送:

如何构建发送通知的FCM POST请求的示例:

let url = URL(string: "https://fcm.googleapis.com/fcm/send")!
var request = URLRequest(url: url)
request.setValue("application/json", forHTTPHeaderField: "Content-Type")
request.setValue("key=--HERE-GOES-YOUR-API-KEY--", forHTTPHeaderField: "Authorization")
request.httpMethod = "POST"
Run Code Online (Sandbox Code Playgroud)

在这里你把所有不是数据,阅读文档来理解你可以发送的所有键和变量,你需要做一个先前的firebase请求,你获得设备令牌.

var notData: [String: Any] = [
    "to" : "HERE YOU PUT THE DEVICE TOKEN(s)",
        "notification": [
          title : "not title",
          body  : "not body",
          icon  : "not icon"
        ],
        "data": [
          //More notification data.
      ]
]
Run Code Online (Sandbox Code Playgroud)

然后你发送帖子请求,如果通知成功并且有更多数据,它将返回一个对象.

request.httpBody = notData.data(using: .utf8)
let task = URLSession.shared.dataTask(with: request) { data, response, error in
    guard let data = data, error == nil else {                                                 // check for fundamental networking error
        print("error=\(error)")
        return
    }

    if let httpStatus = response as? HTTPURLResponse, httpStatus.statusCode != 200 {           // check for http errors
        print("statusCode should be 200, but is \(httpStatus.statusCode)")
        print("response = \(response)")
    }

    let responseString = String(data: data, encoding: .utf8)
    print("responseString = \(responseString)")
}
task.resume() 
Run Code Online (Sandbox Code Playgroud)

我一直在为移动原生应用和反应网络应用程序使用相同的解决方案,它就像一个魅力.

  • *firebaser here* 您概述的方法在技术上可能有效,但会带来很大的安全风险。此代码要求您将 FCM 服务器密钥放入应用程序 (`--HERE-GOES-YOUR-API-KEY--`)。顾名思义,此密钥只能在服务器或其他受信任的环境中使用。通过在应用程序中嵌入此密钥,恶意用户可能会获得它,然后可以代表您向所有用户发送通知。 (2认同)