SocketIO
通过Pod安装第三方库Socket.IO-Client-Swift
use_frameworks!
target 'SocketIORTest' do
pod 'Socket.IO-Client-Swift'
end
以连接“https://socket-io-chat.now.sh/”测试服务
定义一些全局参数
import UIKit
import SocketIO
//let serverUrl = "http://chat.socket.io/"
let serverUrl = "https://socket-io-chat.now.sh/"
let manager = SocketManager(socketURL: URL(string: serverUrl)!, config: [.log(true), .compress])
var socket:SocketIOClient? {
let socket = manager.defaultSocket;
return socket
}
登录服务器
import UIKit
class LoginController: UIViewController {
@IBOutlet weak var usernameField: UITextField!
override func viewDidLoad() {
super.viewDidLoad()
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
// Dispose of any resources that can be recreated.
}
@IBAction func login(_ sender: UIButton) {
if (usernameField.text?.isEmpty)! { return }
socket?.on(clientEvent: .connect, callback: { (datas, ack) in
print("socket connected")
socket?.emit("add user", self.usernameField.text!)
socket?.on("login",callback: { (datas, ack) in
print("登录成功")
let chatController = ChatController.chatController()
self.navigationController?.pushViewController(chatController, animated: true)
})
})
socket?.connect()
}
}
import UIKit
import SocketIO
class ChatController: UIViewController {
@IBOutlet weak var enterField: UITextField!
@IBOutlet weak var messageView: UITextView!
class func chatController() -> ChatController {
let storyboard = UIStoryboard.init(name: "Main", bundle: nil)
let chatController = storyboard.instantiateViewController(withIdentifier: "ChatController") as! ChatController
return chatController
}
override func viewDidLoad() {
super.viewDidLoad()
socket?.on("user joined", callback: { (datas, ack) in
print(ack)
print("data0:\(datas[0])")
guard let result = datas[0] as? [String : Any] else { return }
self.messageView.text.append("\n\(String(describing: result["username"]!))加入,聊天室人数:\(String(describing: result["numUsers"]!))")
self.messageView.contentOffset = CGPoint(x: 0, y: self.messageView.contentSize.height - self.messageView.frame.height)
})
socket?.on("user left", callback: { (datas, ack) in
print(ack)
print("data0:\(datas[0])")
guard let result = datas[0] as? [String : Any] else { return }
self.messageView.text.append("\n\(String(describing: result["username"]!))离开,聊天室人数:\(String(describing: result["numUsers"]!))")
self.messageView.contentOffset = CGPoint(x: 0, y: self.messageView.contentSize.height - self.messageView.frame.height)
})
socket?.on("new message", callback: { (datas, ack) in
print(ack)
print("data0:\(datas[0])")
guard let result = datas[0] as? [String : Any] else { return }
self.messageView.text.append("\n\(String(describing: result["username"]!))说:\(String(describing: result["message"]!))")
self.messageView.contentOffset = CGPoint(x: 0, y: self.messageView.contentSize.height - self.messageView.frame.height)
})
enterField.delegate = self
}
override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
enterField.resignFirstResponder()
}
@IBAction func sendMessage(_ sender: Any) {
//42["new message",{"username":"hhh","message":"dada"}]
//socket?.emit("new message", with: [["message":enterField.text]])
socket?.emit("new message", enterField.text!);
enterField.text = "";
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
// Dispose of any resources that can be recreated.
}
}
extension ChatController: UITextFieldDelegate {
func textFieldShouldReturn(_ textField: UITextField) -> Bool {
socket?.emit("new message", enterField.text!);
enterField.text = "";
return true
}
}