SocketRocket是Facebook開源的一個用于 iOS, macOS and tvOS客戶端的websocket框架。
1. 集成
- 使用cocoapods
只需要在podfile文件中加入pod 'SocketRocket'
囤官,然后執(zhí)行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]
- 打開連接
使用第一步創(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的方式進行回調(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ù)器進行交互了。
- didFailWithError
表示連接出現(xiàn)錯誤锈遥,包括連接沒有成功建立的錯誤纫事、網(wǎng)絡(luò)錯誤等勘畔。如果需要進行重連,應該在這里進行丽惶,可以采用Demo里面的方式進行重連:把以后的對象置空->重新初始化->調(diào)用open炫七。應用切到后臺2分鐘以后才會出現(xiàn)連接錯誤的回調(diào)。
- SocketRocket已經(jīng)對消息的收發(fā)進行了處理钾唬。我們收到和發(fā)出的消息都是根據(jù)socket頭進行分隔的万哪,所以不會出現(xiàn)消息不完整或者多條消息同時收發(fā)的問題。
上面是在使用SocketRocket的過程中的總結(jié)抡秆,通過這些應該可以把這個框架使用起來奕巍,以后有時間會繼續(xù)鉆研這個框架的源碼。SocketRocket還是挺好用的儒士。
關(guān)于WebSocket協(xié)議的內(nèi)容和對SocketRocket源碼的分析都在我的博客