diff --git a/SocketIO.h b/SocketIO.h index 8751388..63025bf 100755 --- a/SocketIO.h +++ b/SocketIO.h @@ -47,6 +47,7 @@ typedef enum { @optional - (void) socketIODidConnect:(SocketIO *)socket; - (void) socketIODidDisconnect:(SocketIO *)socket disconnectedWithError:(NSError *)error; +- (void)socketIORequireReconnect:(SocketIO *)socket; - (void) socketIO:(SocketIO *)socket didReceiveMessage:(SocketIOPacket *)packet; - (void) socketIO:(SocketIO *)socket didReceiveJSON:(SocketIOPacket *)packet; - (void) socketIO:(SocketIO *)socket didReceiveEvent:(SocketIOPacket *)packet; @@ -80,6 +81,7 @@ typedef enum { // heartbeat NSTimeInterval _heartbeatTimeout; dispatch_source_t _timeout; + dispatch_source_t _reconnectTimeout; NSMutableArray *_queue; @@ -100,6 +102,7 @@ typedef enum { @property (nonatomic, readonly) NSTimeInterval heartbeatTimeout; @property (nonatomic) BOOL useSecure; @property (nonatomic, readonly) BOOL isConnected, isConnecting; +@property (nonatomic, assign) BOOL allowsReconnect; @property (nonatomic, weak) id delegate; @property (nonatomic) BOOL returnAllDataFromAck; diff --git a/SocketIO.m b/SocketIO.m index 218fe41..e2013b9 100755 --- a/SocketIO.m +++ b/SocketIO.m @@ -42,6 +42,7 @@ static NSString* kForceDisconnectURL = @"%@://%@%@/%@/1/xhr-polling/%@?disconnect"; float const defaultConnectionTimeout = 10.0f; +float const defaultReconnectTimeout = 10.0f; NSString* const SocketIOError = @"SocketIOError"; NSString* const SocketIOException = @"SocketIOException"; @@ -57,6 +58,7 @@ - (void) setTimeout; - (void) onTimeout; - (void) onConnect:(SocketIOPacket *)packet; +- (void) onReconnect; - (void) onDisconnect:(NSError *)error; - (void) sendDisconnect; @@ -90,6 +92,7 @@ - (id) initWithDelegate:(id)delegate _ackCount = 0; _acks = [[NSMutableDictionary alloc] init]; _returnAllDataFromAck = NO; + _allowsReconnect = NO; } return self; } @@ -372,6 +375,18 @@ - (void) onConnect:(SocketIOPacket *)packet [self setTimeout]; } +- (void) onReconnect +{ + DEBUGLOG(@"onReconnect()"); + if (_reconnectTimeout) { + dispatch_source_cancel(_reconnectTimeout); + _reconnectTimeout = NULL; + } + if ([_delegate respondsToSelector:@selector(socketIORequireReconnect:)]) { + [_delegate socketIORequireReconnect:self]; + } +} + # pragma mark - # pragma mark Acknowledge methods @@ -435,6 +450,33 @@ - (void) setTimeout } +- (void) setReconnectTimeout +{ + DEBUGLOG(@"start reconnect timeout"); + if (_reconnectTimeout) { + dispatch_source_cancel(_reconnectTimeout); + _timeout = NULL; + } + + _reconnectTimeout = dispatch_source_create(DISPATCH_SOURCE_TYPE_TIMER, + 0, + 0, + dispatch_get_main_queue()); + + dispatch_source_set_timer(_reconnectTimeout, + dispatch_time(DISPATCH_TIME_NOW, defaultReconnectTimeout * NSEC_PER_SEC), + 0, + 0); + + __weak SocketIO *weakSelf = self; + + dispatch_source_set_event_handler(_reconnectTimeout, ^{ + [weakSelf onReconnect]; + }); + + dispatch_resume(_reconnectTimeout); +} + # pragma mark - # pragma mark Regex helper method @@ -623,6 +665,10 @@ - (void) onDisconnect:(NSError *)error [_transport close]; } + if (_allowsReconnect) { + [self setReconnectTimeout]; + } + if ((wasConnected || wasConnecting)) { if ([_delegate respondsToSelector:@selector(socketIODidDisconnect:disconnectedWithError:)]) { [_delegate socketIODidDisconnect:self disconnectedWithError:error]; @@ -676,6 +722,10 @@ - (void) connection:(NSURLConnection *)connection didFailWithError:(NSError *)er _isConnected = NO; _isConnecting = NO; + if (_allowsReconnect) { + [self setReconnectTimeout]; + } + if ([_delegate respondsToSelector:@selector(socketIO:onError:)]) { NSMutableDictionary *errorInfo = [[NSDictionary dictionaryWithObject:error forKey:NSUnderlyingErrorKey] mutableCopy]; diff --git a/SocketTesterARC.xcodeproj/project.xcworkspace/xcshareddata/SocketTesterARC.xccheckout b/SocketTesterARC.xcodeproj/project.xcworkspace/xcshareddata/SocketTesterARC.xccheckout new file mode 100644 index 0000000..c4dde43 --- /dev/null +++ b/SocketTesterARC.xcodeproj/project.xcworkspace/xcshareddata/SocketTesterARC.xccheckout @@ -0,0 +1,65 @@ + + + + + IDESourceControlProjectFavoriteDictionaryKey + + IDESourceControlProjectIdentifier + 3A14AC01-ADB6-460B-A39B-ACD3676D269B + IDESourceControlProjectName + SocketTesterARC + IDESourceControlProjectOriginsDictionary + + 1A20010B-ECBA-42CD-B4FC-3913BC1074BD + https://github.com/leoru/socket.IO-objc.git + 651D8C48-124E-477C-948C-FED7E4F34E8B + https://github.com/stig/json-framework.git + 96C278C3-8B4E-4D22-A1C7-497D0D2E9A29 + https://github.com/square/SocketRocket.git + + IDESourceControlProjectPath + SocketTesterARC.xcodeproj/project.xcworkspace + IDESourceControlProjectRelativeInstallPathDictionary + + 1A20010B-ECBA-42CD-B4FC-3913BC1074BD + ../.. + 651D8C48-124E-477C-948C-FED7E4F34E8B + ../../submodules/json-framework + 96C278C3-8B4E-4D22-A1C7-497D0D2E9A29 + ../../submodules/socket-rocket + + IDESourceControlProjectURL + https://github.com/leoru/socket.IO-objc.git + IDESourceControlProjectVersion + 110 + IDESourceControlProjectWCCIdentifier + 1A20010B-ECBA-42CD-B4FC-3913BC1074BD + IDESourceControlProjectWCConfigurations + + + IDESourceControlRepositoryExtensionIdentifierKey + public.vcs.git + IDESourceControlWCCIdentifierKey + 651D8C48-124E-477C-948C-FED7E4F34E8B + IDESourceControlWCCName + json-framework + + + IDESourceControlRepositoryExtensionIdentifierKey + public.vcs.git + IDESourceControlWCCIdentifierKey + 1A20010B-ECBA-42CD-B4FC-3913BC1074BD + IDESourceControlWCCName + socket + + + IDESourceControlRepositoryExtensionIdentifierKey + public.vcs.git + IDESourceControlWCCIdentifierKey + 96C278C3-8B4E-4D22-A1C7-497D0D2E9A29 + IDESourceControlWCCName + socket-rocket + + + +