Я разрабатываю социальное приложение для IOS, написанное на SWIFT
.
. Бэкэнд - PHP, MySQL
(для обработки событий), + немного NodeJS, Socket.io
(для чата в реальном времени и уведомлений).
Я успешно создал чат:
Когда пользователь отправляет сообщение, сервер Socket.io обрабатывает его следующим образом:
- вставляетданные в базу данных
- в случае успеха отправляют сообщение всем участникам-участникам
/, поэтому для этого бэкэнд является только сервером Socket.io, который обрабатываетбаза данных также
Работает нормально.
Но есть события, которые не предназначены для работы в реальном времени, но все же я хочу отправить уведомление данному пользователюнапример, с помощью Socket.io
: если публикация понравилась, отправьте уведомление владельцу сообщения
Я уже написал PHP-файлы для сохранениякак в базе данных, но
Как мне сделать notiЧасть, безопасная?
У меня есть 3 идеи:
- Приложение отправляет веб-запросмой бэкэнд PHP + MySQL, он обрабатывает данные там, а затем, вернув «успех», приложение (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 ..)
-
Приложение ничего не отправляет в мой веб-файл PHP + MySQL, вместо этого оно отправляет весь процесс «как» на мой сервер NodeJs, Socket.IO, обрабатывает его там, сохраняет в базе данных, затем отправляет уведомления (точно так же, как часть чата в реальном времени, но это было бы много работы, потому что я уже написал весь другой код в файлах PHP)
Первый случай - самый идеальный для меня , но я боюсь, что он будет взломан ..
Потому что, если я сделаю это первым способом, бэкэндСервер NodeJs + Socket.io не будет проверять, был ли процесс привязанности успешным (потому что он был проверен на стороне клиента)
, так что вполне вероятно, что любой мог отправить ложные уведомления типа "пост", как миллиард раз.
Тогда, возможно, второй вариант тоже подойдет, так что бэкэнд обрабатывает и проверку, и отправку уведомлений, , но, к сожалению, нет плагина Socket.io для PHP