SocketRocket使用

SocketRocket是Facebook开源的一个用于 iOS, macOS and tvOS客户端的websocket框架。

WebSocket的协议分析和SocketRocket框架源码分析在这里

1. 集成

  • 使用cocoapods
    只需要在podfile文件中加入pod 'SocketRocket',然后执行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的对象进行初始化
      1
      2
      3
      -(id)initWithURLRequest:(NSURLRequest *)request protocols:(NSArray *)protocols allowsUntrustedSSLCertificates:(BOOL)allowsUntrustedSSLCertificates;
      -(id)initWithURLRequest:(NSURLRequest *)request protocols:(NSArray *)protocols;
      -(id)initWithURLRequest:(NSURLRequest *)request;
    • 通过传入NSURL的对象进行初始化
      1
      2
      3
      -(id)initWithURL:(NSURL *)url protocols:(NSArray *)protocols allowsUntrustedSSLCertificates:(BOOL)allowsUntrustedSSLCertificates;
      -(id)initWithURL:(NSURL *)url protocols:(NSArray *)protocols;
      -(id)initWithURL:(NSURL *)url;
      其中,使用NSURLRequest进行初始化可以自定义请求超时时间
      1
      [NSURLRequest requestWithURL:url cachePolicy:NSURLRequestUseProtocolCachePolicy timeoutInterval:timeoutInterval]
  2. 打开连接
    使用第一步创建出来的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");
  3. 发送数据
    使用对象调用- (void)send:(id)data这个data可以是一个UTF8的字符串或者NSData对象
  4. 关闭连接
    使用对象调用- (void)close来关闭一个连接。
  5. 回调
    以delegate的方式进行回调,包括下面几个回调函数
    1
    2
    3
    4
    5
    6
    7
    8
    9
    @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分钟以后才会出现连接错误的回调。
  6. SocketRocket已经对消息的收发进行了处理。我们收到和发出的消息都是根据socket头进行分隔的,所以不会出现消息不完整或者多条消息同时收发的问题。

上面是在使用SocketRocket的过程中的总结,通过这些应该可以把这个框架使用起来,以后有时间会继续钻研这个框架的源码。SocketRocket还是挺好用的。

到公众号【iOS开发栈】学习更多SwiftUI、iOS开发相关内容。回复“博客”免费获取各大互联网公司面试题。