SocketRocket是Facebook开源的一个用于 iOS, macOS and tvOS客户端的websocket框架。
1. 集成
- 使用cocoapods
只需要在podfile文件中加入pod 'SocketRocket'
,然后执行pod install
就可以了 - 不使用cocoapods
-
添加文件
把下面的三个文件拖入项目中
其中,SocketRocket.h文件是用来引入框架的所有类的文件,就像<UIKit/UIkit.h>。目前,这个文件只引入了一个类,所以只有一行代码<SocketRocket/SRWebSocket.h>
,这样的话,编译会报错,因为并没有一个SocketRocket的framework,需要把这一行代码改为#import "SRWebSocket.h"
。 -
添加依赖库
在Build Phases -> Link Binary With Libraries里加入如下frameworks:- libicucore.dylib
- CFNetwork.framework
- Security.framework
- Foundation.framework
-
2. 使用
- 初始化 初始化方法分为两类:
- 通过传入NSURLRequest的对象进行初始化
-(id)initWithURLRequest:(NSURLRequest *)request protocols:(NSArray *)protocols allowsUntrustedSSLCertificates:(BOOL)allowsUntrustedSSLCertificates;
-(id)initWithURLRequest:(NSURLRequest *)request protocols:(NSArray *)protocols;
-(id)initWithURLRequest:(NSURLRequest *)request;
- 通过传入NSURL的对象进行初始化
-(id)initWithURL:(NSURL *)url protocols:(NSArray *)protocols allowsUntrustedSSLCertificates:(BOOL)allowsUntrustedSSLCertificates;
-(id)initWithURL:(NSURL *)url protocols:(NSArray *)protocols;
-(id)initWithURL:(NSURL *)url;
其中,使用NSURLRequest进行初始化可以自定义请求超时时间
[NSURLRequest requestWithURL:url cachePolicy:NSURLRequestUseProtocolCachePolicy timeoutInterval:timeoutInterval]
- 打开连接
使用第一步创建出来的SRWebSocket对象(以下简称‘对象’)调用- (void)open
来与服务器建立连接。这里需要注意// SRWebSockets are intended for one-time-use only. Open should be called once and only once.
一个对象只能调用一次- (void)open
调用过open后,对象的readyState就为SR_CONNECTING,如果再调用open,就会NSAssert(_readyState == SR_CONNECTING, @"Cannot call -(void)open on SRWebSocket more than once");
- 发送数据
使用对象调用- (void)send:(id)data
这个data可以是一个UTF8的字符串或者NSData对象 - 关闭连接
使用对象调用- (void)close
来关闭一个连接。 - 回调
以delegate的方式进行回调,包括下面几个回调函数
@protocol SRWebSocketDelegate <NSObject>
-(void)webSocket:(SRWebSocket *)webSocket didReceiveMessage:(id)message;
@optional
-(void)webSocketDidOpen:(SRWebSocket *)webSocket;
-(void)webSocket:(SRWebSocket *)webSocket didFailWithError:(NSError *)error;
-(void)webSocket:(SRWebSocket *)webSocket didCloseWithCode:(NSInteger)code reason:(NSString *)reason wasClean:(BOOL)wasClean;
-(void)webSocket:(SRWebSocket *)webSocket didReceivePong:(NSData *)pongPayload;
-(BOOL)webSocketShouldConvertTextFrameToString:(SRWebSocket *)webSocket;
@end
其中,
- webSocketDidOpen
表示与服务器的连接建立成功,这时就可以与服务器进行交互了。
- didFailWithError
表示连接出现错误,包括连接没有成功建立的错误、网络错误等。如果需要进行重连,应该在这里进行,可以采用Demo里面的方式进行重连:把以后的对象置空->重新初始化->调用open。应用切到后台2分钟以后才会出现连接错误的回调。
- SocketRocket已经对消息的收发进行了处理。我们收到和发出的消息都是根据socket头进行分隔的,所以不会出现消息不完整或者多条消息同时收发的问题。
上面是在使用SocketRocket的过程中的总结,通过这些应该可以把这个框架使用起来,以后有时间会继续钻研这个框架的源码。SocketRocket还是挺好用的。
关于WebSocket协议的内容和对SocketRocket源码的分析都在我的博客