SocketRocket是Facebook開源的一個用于 iOS, macOS and tvOS客戶端的websocket框架。

facebook
1. 集成
- 使用cocoapods
只需要在podfile文件中加入pod 'SocketRocket',然后執(zhí)行pod install就可以了 - 不使用cocoapods
-
添加文件
把下面的三個文件拖入項目中
Paste_Image.png
其中,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的對象進(jìn)行初始化
-(id)initWithURLRequest:(NSURLRequest *)request protocols:(NSArray *)protocols allowsUntrustedSSLCertificates:(BOOL)allowsUntrustedSSLCertificates;
-(id)initWithURLRequest:(NSURLRequest *)request protocols:(NSArray *)protocols;
-(id)initWithURLRequest:(NSURLRequest *)request;
- 通過傳入NSURL的對象進(jìn)行初始化
-(id)initWithURL:(NSURL *)url protocols:(NSArray *)protocols allowsUntrustedSSLCertificates:(BOOL)allowsUntrustedSSLCertificates;
-(id)initWithURL:(NSURL *)url protocols:(NSArray *)protocols;
-(id)initWithURL:(NSURL *)url;
其中,使用NSURLRequest進(jìn)行初始化可以自定義請求超時時間
[NSURLRequest requestWithURL:url cachePolicy:NSURLRequestUseProtocolCachePolicy timeoutInterval:timeoutInterval]
- 打開連接
使用第一步創(chuàng)建出來的SRWebSocket對象(以下簡稱‘對象’)調(diào)用- (void)open來與服務(wù)器建立連接。這里需要注意// SRWebSockets are intended for one-time-use only. Open should be called once and only once.一個對象只能調(diào)用一次- (void)open調(diào)用過open后,對象的readyState就為SR_CONNECTING,如果再調(diào)用open,就會NSAssert(_readyState == SR_CONNECTING, @"Cannot call -(void)open on SRWebSocket more than once"); - 發(fā)送數(shù)據(jù)
使用對象調(diào)用- (void)send:(id)data這個data可以是一個UTF8的字符串或者NSData對象 - 關(guān)閉連接
使用對象調(diào)用- (void)close來關(guān)閉一個連接。 - 回調(diào)
以delegate的方式進(jìn)行回調(diào),包括下面幾個回調(diào)函數(shù)
@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表示與服務(wù)器的連接建立成功,這時就可以與服務(wù)器進(jìn)行交互了。
- didFailWithError表示連接出現(xiàn)錯誤,包括連接沒有成功建立的錯誤、網(wǎng)絡(luò)錯誤等。如果需要進(jìn)行重連,應(yīng)該在這里進(jìn)行,可以采用Demo里面的方式進(jìn)行重連:把以后的對象置空->重新初始化->調(diào)用open。應(yīng)用切到后臺2分鐘以后才會出現(xiàn)連接錯誤的回調(diào)。
- SocketRocket已經(jīng)對消息的收發(fā)進(jìn)行了處理。我們收到和發(fā)出的消息都是根據(jù)socket頭進(jìn)行分隔的,所以不會出現(xiàn)消息不完整或者多條消息同時收發(fā)的問題。
上面是在使用SocketRocket的過程中的總結(jié),通過這些應(yīng)該可以把這個框架使用起來,以后有時間會繼續(xù)鉆研這個框架的源碼。SocketRocket還是挺好用的。
關(guān)于WebSocket協(xié)議的內(nèi)容和對SocketRocket源碼的分析都在我的博客
