如何在iOS中发送消息通知?

时间:2017-01-05 02:00:53

标签: ios swift firebase apple-push-notifications

我正在寻找一个小时的方法来做到这一点(没有Parse,因为它本月会下降)。

我试图在应用程序中执行一个用户可以向另一个特定用户发送推送通知消息。

实施该选项有哪些选择?(请具体说明)

感谢。

2 个答案:

答案 0 :(得分:2)

通常不推荐您正在寻找的内容,因为它很容易成为问题。从技术上讲,用户不应该向其他用户发送直接推送通知。所有通知都应通过您的个人用户无法访问的中央系统进行处理。但是,如果你觉得自己仍然喜欢这项工作,请继续阅读。

我的一个应用程序中使用FCM,我有这样的机制。这是我用来将消息从一个用户发送到另一个用户的功能(通过一些修改来取出我的具体信息):

_.join(some string)

我将此方法保存在appDelegate中,并在必要时调用它。基本上,我的应用中的每个用户都分配了一个Firebase消息令牌,而且它只是每个用户的另一个属性。您可以通过以下呼叫获取用户的FCM令牌:

func push(message: String, toUser: String) {
    var token: String?
    for person in self.users {
        if toUser == person.username && person.firebaseToken != nil {
            token = person.firebaseToken
        }
    }
    if token != nil {
        var request = URLRequest(url: URL(string: "https://fcm.googleapis.com/fcm/send")!)
        request.httpMethod = "POST"
        request.setValue("application/json", forHTTPHeaderField: "Content-Type")
        request.setValue("key=[your FCM Server Key]", forHTTPHeaderField: "Authorization")
        let json = [
            "to" : token!,
            "priority" : "high",
            "notification" : [
                "body" : message
            ]
        ] as [String : Any]
        do {
            let jsonData = try JSONSerialization.data(withJSONObject: json, options: .prettyPrinted)
            request.httpBody = jsonData
            let task = URLSession.shared.dataTask(with: request) { data, response, error in
                guard let data = data, error == nil else {
                    print("Error=\(error)")
                    return
                }

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

                let responseString = String(data: data, encoding: .utf8)
                print("responseString = \(responseString)")
            }
            task.resume()
        }
        catch {
            print(error)
        }
    }
}

通常,当用户首次创建帐户时,可以检索并保存令牌。只要用户使用同一设备,令牌就会保持不变。

同样,如果在没有适当的安全措施的情况下实施,以防止用户完全控制发送推送通知,这可能会非常危险。

答案 1 :(得分:0)

我不确定这一点。 虽然状态代码为200,但我无法看到任何通知。

这是返回值。

{
    \"multicast_id\":6666941437973455953,
    \"success\":1,
    \"failure\":0,
    \"canonical_ids\":0,
    \"results\":[{\"message_id\":\"0:1490256129594240%03b6b50f03b6b50f\"}]
}