fixes. add better objective-c support
This commit is contained in:
parent
8365ded215
commit
711ce8d8c4
15
README.md
15
README.md
@ -146,6 +146,21 @@ socket.emit("testData", [
|
|||||||
"test": true])
|
"test": true])
|
||||||
```
|
```
|
||||||
|
|
||||||
|
Objective-C Example
|
||||||
|
===================
|
||||||
|
```objective-c
|
||||||
|
SocketIOClient* socket = [[SocketIOClient alloc] initWithSocketURL:@"localhost:8080" opts:nil];
|
||||||
|
|
||||||
|
[socket on: @"connect" callback: ^(NSArray* data, void (^ack)(NSArray*)) {
|
||||||
|
NSLog(@"connected");
|
||||||
|
[socket emitObjc:@"echo" :@[@"echo test"]];
|
||||||
|
[[socket emitWithAckObjc:@"ackack" :@[@"test"]] onAck:^(NSArray* data) {
|
||||||
|
NSLog(@"Got data");
|
||||||
|
}];
|
||||||
|
}];
|
||||||
|
|
||||||
|
```
|
||||||
|
|
||||||
Detailed Example
|
Detailed Example
|
||||||
================
|
================
|
||||||
A more detailed example can be found [here](https://github.com/nuclearace/socket.io-client-swift-example)
|
A more detailed example can be found [here](https://github.com/nuclearace/socket.io-client-swift-example)
|
||||||
|
|||||||
@ -24,9 +24,9 @@
|
|||||||
|
|
||||||
import Foundation
|
import Foundation
|
||||||
|
|
||||||
typealias AckCallback = (NSArray?) -> Void
|
public typealias AckCallback = (NSArray?) -> Void
|
||||||
|
|
||||||
class SocketAckHandler {
|
@objc public class SocketAckHandler {
|
||||||
let ackNum:Int!
|
let ackNum:Int!
|
||||||
let event:String!
|
let event:String!
|
||||||
var callback:AckCallback?
|
var callback:AckCallback?
|
||||||
|
|||||||
@ -147,7 +147,8 @@ class SocketEngine: NSObject, WebSocketDelegate {
|
|||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
let req = NSURLRequest(URL: NSURL(string: self.urlPolling! + "&sid=\(self.sid)")!)
|
let req = NSMutableURLRequest(URL: NSURL(string: self.urlPolling! + "&sid=\(self.sid)")!)
|
||||||
|
req.timeoutInterval = 0.0
|
||||||
self.waitingForPoll = true
|
self.waitingForPoll = true
|
||||||
|
|
||||||
self.session.dataTaskWithRequest(req) {[weak self] data, res, err in
|
self.session.dataTaskWithRequest(req) {[weak self] data, res, err in
|
||||||
@ -481,7 +482,6 @@ class SocketEngine: NSObject, WebSocketDelegate {
|
|||||||
|
|
||||||
func sendPing() {
|
func sendPing() {
|
||||||
if self.websocket {
|
if self.websocket {
|
||||||
self.ws?.writePing(NSData())
|
|
||||||
self.sendWebSocketMessage("", withType: PacketType.PING)
|
self.sendWebSocketMessage("", withType: PacketType.PING)
|
||||||
} else {
|
} else {
|
||||||
self.sendPollMessage("", withType: PacketType.PING)
|
self.sendPollMessage("", withType: PacketType.PING)
|
||||||
|
|||||||
@ -24,9 +24,9 @@
|
|||||||
|
|
||||||
import Foundation
|
import Foundation
|
||||||
|
|
||||||
typealias NormalCallback = (NSArray?, AckEmitter?) -> Void
|
public typealias NormalCallback = (NSArray?, AckEmitter?) -> Void
|
||||||
typealias AnyHandler = (event:String, items:AnyObject?)
|
public typealias AnyHandler = (event:String, items:AnyObject?)
|
||||||
typealias AckEmitter = (AnyObject...) -> Void
|
public typealias AckEmitter = (AnyObject...) -> Void
|
||||||
|
|
||||||
private func emitAckCallback(socket:SocketIOClient, num:Int, type:Int) -> AckEmitter {
|
private func emitAckCallback(socket:SocketIOClient, num:Int, type:Int) -> AckEmitter {
|
||||||
func emitter(items:AnyObject...) {
|
func emitter(items:AnyObject...) {
|
||||||
|
|||||||
@ -24,7 +24,7 @@
|
|||||||
|
|
||||||
import Foundation
|
import Foundation
|
||||||
|
|
||||||
class SocketIOClient {
|
public class SocketIOClient: NSObject {
|
||||||
let socketURL:NSMutableString!
|
let socketURL:NSMutableString!
|
||||||
let ackQueue = dispatch_queue_create("ackQueue".cStringUsingEncoding(NSUTF8StringEncoding),
|
let ackQueue = dispatch_queue_create("ackQueue".cStringUsingEncoding(NSUTF8StringEncoding),
|
||||||
DISPATCH_QUEUE_SERIAL)
|
DISPATCH_QUEUE_SERIAL)
|
||||||
@ -57,7 +57,7 @@ class SocketIOClient {
|
|||||||
}
|
}
|
||||||
var sid:String?
|
var sid:String?
|
||||||
|
|
||||||
init(socketURL:String, opts:[String: AnyObject]? = nil) {
|
public init(socketURL:String, opts:[String: AnyObject]? = nil) {
|
||||||
var mutURL = RegexMutable(socketURL)
|
var mutURL = RegexMutable(socketURL)
|
||||||
|
|
||||||
if mutURL["https://"].matches().count != 0 {
|
if mutURL["https://"].matches().count != 0 {
|
||||||
@ -96,11 +96,13 @@ class SocketIOClient {
|
|||||||
self.reconnectAttempts = -1
|
self.reconnectAttempts = -1
|
||||||
}
|
}
|
||||||
|
|
||||||
|
super.init()
|
||||||
|
|
||||||
self.engine = SocketEngine(client: self, forcePolling: self.forcePolling)
|
self.engine = SocketEngine(client: self, forcePolling: self.forcePolling)
|
||||||
}
|
}
|
||||||
|
|
||||||
// Closes the socket
|
// Closes the socket
|
||||||
func close() {
|
public func close() {
|
||||||
self.closed = true
|
self.closed = true
|
||||||
self.connecting = false
|
self.connecting = false
|
||||||
self.connected = false
|
self.connected = false
|
||||||
@ -109,7 +111,7 @@ class SocketIOClient {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Connects to the server
|
// Connects to the server
|
||||||
func connect() {
|
public func connect() {
|
||||||
if self.closed {
|
if self.closed {
|
||||||
println("Warning! This socket was previously closed. This might be dangerous!")
|
println("Warning! This socket was previously closed. This might be dangerous!")
|
||||||
self.closed = false
|
self.closed = false
|
||||||
@ -119,7 +121,7 @@ class SocketIOClient {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Connect to the server using params
|
// Connect to the server using params
|
||||||
func connectWithParams(params:[String: AnyObject]) {
|
public func connectWithParams(params:[String: AnyObject]) {
|
||||||
if self.closed {
|
if self.closed {
|
||||||
println("Warning! This socket was previously closed. This might be dangerous!")
|
println("Warning! This socket was previously closed. This might be dangerous!")
|
||||||
self.closed = false
|
self.closed = false
|
||||||
@ -139,6 +141,7 @@ class SocketIOClient {
|
|||||||
self.currentReconnectAttempt = 0
|
self.currentReconnectAttempt = 0
|
||||||
self.reconnectTimer?.invalidate()
|
self.reconnectTimer?.invalidate()
|
||||||
self.reconnectTimer = nil
|
self.reconnectTimer = nil
|
||||||
|
|
||||||
self.handleEvent("connect", data: nil, isInternalMessage: false)
|
self.handleEvent("connect", data: nil, isInternalMessage: false)
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -155,7 +158,7 @@ class SocketIOClient {
|
|||||||
// Sends a message with multiple args
|
// Sends a message with multiple args
|
||||||
// If a message contains binary we have to send those
|
// If a message contains binary we have to send those
|
||||||
// seperately.
|
// seperately.
|
||||||
func emit(event:String, _ args:AnyObject...) {
|
public func emit(event:String, _ args:AnyObject...) {
|
||||||
if !self.connected {
|
if !self.connected {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
@ -166,7 +169,12 @@ class SocketIOClient {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func emitWithAck(event:String, _ args:AnyObject...) -> SocketAckHandler {
|
// Objc doesn't have variadics
|
||||||
|
public func emitObjc(event:String, _ args:[AnyObject]) {
|
||||||
|
self.emit(event, args)
|
||||||
|
}
|
||||||
|
|
||||||
|
public func emitWithAck(event:String, _ args:AnyObject...) -> SocketAckHandler {
|
||||||
if !self.connected {
|
if !self.connected {
|
||||||
return SocketAckHandler(event: "fail")
|
return SocketAckHandler(event: "fail")
|
||||||
}
|
}
|
||||||
@ -183,6 +191,10 @@ class SocketIOClient {
|
|||||||
return ackHandler
|
return ackHandler
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public func emitWithAckObjc(event:String, _ args:[AnyObject]) -> SocketAckHandler {
|
||||||
|
return self.emitWithAck(event, args)
|
||||||
|
}
|
||||||
|
|
||||||
private func _emit(event:String, _ args:[AnyObject], ack:Bool = false) {
|
private func _emit(event:String, _ args:[AnyObject], ack:Bool = false) {
|
||||||
var frame:SocketEvent
|
var frame:SocketEvent
|
||||||
var str:String
|
var str:String
|
||||||
@ -217,7 +229,7 @@ class SocketIOClient {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// If the server wants to know that the client received data
|
// If the server wants to know that the client received data
|
||||||
func emitAck(ack:Int, withData data:[AnyObject]?, withAckType ackType:Int) {
|
internal func emitAck(ack:Int, withData data:[AnyObject]?, withAckType ackType:Int) {
|
||||||
dispatch_async(self.ackQueue) {[weak self] in
|
dispatch_async(self.ackQueue) {[weak self] in
|
||||||
if self == nil || !self!.connected || data == nil {
|
if self == nil || !self!.connected || data == nil {
|
||||||
return
|
return
|
||||||
@ -270,7 +282,7 @@ class SocketIOClient {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Handles events
|
// Handles events
|
||||||
func handleEvent(event:String, data:AnyObject?, isInternalMessage:Bool = false,
|
public func handleEvent(event:String, data:AnyObject?, isInternalMessage:Bool = false,
|
||||||
wantsAck ack:Int? = nil, withAckType ackType:Int = 3) {
|
wantsAck ack:Int? = nil, withAckType ackType:Int = 3) {
|
||||||
// println("Should do event: \(event) with data: \(data)")
|
// println("Should do event: \(event) with data: \(data)")
|
||||||
if !self.connected && !isInternalMessage {
|
if !self.connected && !isInternalMessage {
|
||||||
@ -319,18 +331,18 @@ class SocketIOClient {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Adds handler for an event
|
// Adds handler for an event
|
||||||
func on(name:String, callback:NormalCallback) {
|
public func on(name:String, callback:NormalCallback) {
|
||||||
let handler = SocketEventHandler(event: name, callback: callback)
|
let handler = SocketEventHandler(event: name, callback: callback)
|
||||||
self.handlers.append(handler)
|
self.handlers.append(handler)
|
||||||
}
|
}
|
||||||
|
|
||||||
// Adds a handler for any event
|
// Adds a handler for any event
|
||||||
func onAny(handler:(AnyHandler) -> Void) {
|
public func onAny(handler:(AnyHandler) -> Void) {
|
||||||
self.anyHandler = handler
|
self.anyHandler = handler
|
||||||
}
|
}
|
||||||
|
|
||||||
// Opens the connection to the socket
|
// Opens the connection to the socket
|
||||||
func open() {
|
public func open() {
|
||||||
self.connect()
|
self.connect()
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -497,7 +509,7 @@ class SocketIOClient {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Parses messages recieved
|
// Parses messages recieved
|
||||||
func parseSocketMessage(stringMessage:String) {
|
internal func parseSocketMessage(stringMessage:String) {
|
||||||
// println(message!)
|
// println(message!)
|
||||||
|
|
||||||
// Check for successful namepsace connect
|
// Check for successful namepsace connect
|
||||||
@ -718,7 +730,7 @@ class SocketIOClient {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Handles binary data
|
// Handles binary data
|
||||||
func parseBinaryData(data:NSData) {
|
internal func parseBinaryData(data:NSData) {
|
||||||
let shouldExecute = self.waitingData[0].addData(data)
|
let shouldExecute = self.waitingData[0].addData(data)
|
||||||
|
|
||||||
if shouldExecute {
|
if shouldExecute {
|
||||||
@ -763,7 +775,7 @@ class SocketIOClient {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Something happened while polling
|
// Something happened while polling
|
||||||
func pollingDidFail(err:NSError?) {
|
internal func pollingDidFail(err:NSError?) {
|
||||||
if !self.reconnecting {
|
if !self.reconnecting {
|
||||||
self.connected = false
|
self.connected = false
|
||||||
self.handleEvent("reconnect", data: err?.localizedDescription, isInternalMessage: true)
|
self.handleEvent("reconnect", data: err?.localizedDescription, isInternalMessage: true)
|
||||||
@ -772,7 +784,7 @@ class SocketIOClient {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// We lost connection and should attempt to reestablish
|
// We lost connection and should attempt to reestablish
|
||||||
@objc func tryReconnect() {
|
internal func tryReconnect() {
|
||||||
if self.reconnectAttempts != -1 && self.currentReconnectAttempt + 1 > self.reconnectAttempts {
|
if self.reconnectAttempts != -1 && self.currentReconnectAttempt + 1 > self.reconnectAttempts {
|
||||||
self.didForceClose()
|
self.didForceClose()
|
||||||
return
|
return
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user