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

时间:2017-10-31 17:46:20

标签: ios firebase notifications push onesignal

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

有人有这方面的经验吗?

3 个答案:

答案 0 :(得分:9)

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

假设您使用的是FCM,并且您拥有configured your app

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

let token = Messaging.messaging().fcmToken

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

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

如何构建发送通知的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"

在这里你把所有不是数据,阅读FCM POST request service和你可以发送的变量,你需要做一个先前的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.
      ]
]

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

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() 

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

答案 1 :(得分:4)

在Swift 4中,Karlo上面发布的所有内容都可以正常工作,除了数据(使用:)功能不再可用。

这需要是这样的:

request.httpBody = try? JSONSerialization.data(withJSONObject: notData, options: [])

一旦我做了改变,所有编辑和工作都很精彩。

答案 2 :(得分:0)

您可以轻松地将推送通知定位到特定设备。这里有一个针对特定目的的教程(https://firebase.google.com/docs/cloud-messaging/ios/first-message)。

现在您可以按照以下步骤操作:

  1. 当“用户”向“其他用户”发送消息时,您可以将“其他用户”的信息发送到服务器。
  2. 从服务器,您可以将推送通知发送给“其他用户”