SocketRocket使用

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

facebook

1. 集成

  • 使用cocoapods
    只需要在podfile文件中加入pod 'SocketRocket',然后執(zhí)行pod install就可以了
  • 不使用cocoapods
    1. 添加文件
      把下面的三個文件拖入項目中

      Paste_Image.png

      其中,SocketRocket.h文件是用來引入框架的所有類的文件,就像<UIKit/UIkit.h>。目前,這個文件只引入了一個類,所以只有一行代碼 <SocketRocket/SRWebSocket.h>,這樣的話,編譯會報錯,因為并沒有一個SocketRocket的framework,需要把這一行代碼改為 #import "SRWebSocket.h"。

    2. 添加依賴庫
      在Build Phases -> Link Binary With Libraries里加入如下frameworks:

      • libicucore.dylib
      • CFNetwork.framework
      • Security.framework
      • Foundation.framework

2. 使用

  1. 初始化 初始化方法分為兩類:
    • 通過傳入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]
  1. 打開連接
    使用第一步創(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");
  2. 發(fā)送數(shù)據(jù)
    使用對象調(diào)用- (void)send:(id)data這個data可以是一個UTF8的字符串或者NSData對象
  3. 關(guān)閉連接
    使用對象調(diào)用- (void)close來關(guān)閉一個連接。
  4. 回調(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)。

  1. 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源碼的分析都在我的博客

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容