【发布时间】:2019-03-01 13:52:18
【问题描述】:
我正在开发一个用SWIFT编写的IOS社交应用。
后端是PHP, MySQL(用于事件处理),+一点NodeJS, Socket.io(用于实时聊天和通知)
我已成功聊天:
当用户发送消息时,Socket.io 服务器会通过以下方式处理它:
- 它将数据插入到数据库中
- 如果成功则将消息发送给所有参与用户
/ 所以后端只是 Socket.io 服务器,它也处理数据库
工作正常。
但是有些事件并不意味着是实时的,但我仍然想使用 Socket.io 向给定用户发送通知
例如:如果帖子已被点赞,则向帖子所有者发送通知
我已经编写了PHP文件用于在数据库中保存类似的东西,但是
通知部分应该怎么做,安全吗?
我想出了 3 个想法:
- 应用程序向我的 PHP+MySQL 后端发送一个 Web 请求,它在那里处理数据,然后在返回“成功”后,应用程序 (SWIFT) 向帖子所有者发送通知 (通过 Socket.io XCode 吊舱)
func likePost(postId : Int, completion: @escaping (ActionResult?)->()){
let connectUrl = URL(string: appSettings.url + "/src/main/like.php")
var request = URLRequest(url: connectUrl!)
request.httpMethod = "POST"
let postString = "userId=\(userId)&session=\(session)&pId=\(postId)"
request.httpBody = postString.data(using: String.Encoding.utf8)
let task = URLSession.shared.dataTask(with: request) {
(data: Data?, response: URLResponse?, error: Error?) in
if error != nil {
return completion(ActionResult(type: 0, code: 0, title: "error", message: "something went wrong"))
}
do {
let responseJson = try JSONSerialization.jsonObject(with: data!, options: [])
if let responseArray = responseJson as? [String: Any] {
let responseStatus = responseArray["status"] as? String
let responseTitle = responseArray["title"] as? String
let responseMessage = responseArray["message"] as? String
if responseStatus != "1" {
return completion(ActionResult(type: 0, code: 0, title: "error", message: "something went wrong"))
}
// SUCCESS, SEND NOTI WITH SOCKET.IO
socket.emit("notification_likedPost", ["postId": postId)
return completion(ActionResult(type: 1, title: "success", message: "yay"))
}
} catch {
return completion(ActionResult(type: 0, code: 0, title: "error", message: "something went wrong"))
}
}
task.resume()
}
- 相同,但是在从 PHP 返回“成功”后,它本身(PHP 文件)也会处理 Socket.IO 通知发出 (我认为这是不可能的,我还没有找到任何 PHP->Socket.io 插件..)
-
- 该应用程序不会向我的 Web PHP+MySQL 文件发送任何内容,而是将整个“like”进程发送到我的 NodeJs、Socket.IO 服务器,它在那里处理它,将其保存到数据库中,然后发出通知(就像实时聊天部分一样,但这将是很多工作,因为我已经在 PHP 文件中编写了所有其他代码)
第一种情况对我来说是最理想的,但我害怕它会被破解..
因为如果我是第一种方式,后端NodeJs+Socket.io服务器不会检查点赞过程是否成功(因为它是在客户端检查的)
所以很可能任何人都可以发送虚假的“点赞”通知,比如十亿次。
那么也许第二个选项也不错,这样后端就可以同时处理检查和通知发送,但遗憾的是没有用于 PHP 的 Socket.io 插件
【问题讨论】:
-
将 Socket.io 与 PHP 一起使用并不是处理进程间通信的最有效方式……(如果设置不正确,甚至会很危险)。我建议您将 Redis 视为 PHP 和 NodeJS 之间的消息代理。但是没有 PHP 的 NodeJS 仍然要强大得多,希望你有足够的动力从 PHP 继续前进。
标签: php node.js swift sockets notifications