iOS中SocketIO 的使用总结

由于项目要求客户端app和服务器端建立socket长连接,用于接收服务器端推送的消息。由于服务器端已经使用了Socket.iO库,所以我在iOS就选择了Socket.IO-Client-Swift的框架。其他框架已经很久没有维护所以放弃。在导入和使用过程中遇到了一些问题。1、oc项目引用Swift的框架Socket.IO-Client-Swift ; 2、连接过程的设置和参数传递。

第一步导入Socket.iO的sdk : Socket.IO-Client-Swift

Socket.IO-Client-Swift的Github地址: https://github.com/socketio/socket.io-client-swift

使用cocapods 导入 最新版的sdk

```
platform :ios, '8.5'
use_frameworks!
target '项目名称' do  
pod 'Socket.IO-Client-Swift', '~> 15.1.0'
end
```

问题1:由于Socket.IO-Client-Swift 是swift框架所以在oc项目中需要创建桥接文件 

解决方案:
1、创建一个swift文件,并选择创建桥接文件;
2、在桥接文件中 导入框架 “@import SocketIO;”
3、在oc 文件中引用桥接文件;


```
/*导入桥接文件*/
#import "yiren-Bridging-Header.h"

@interface NewSocket : NSObject

@property (strong, nonatomic)  SocketIOClient* socket;

@property (strong, nonatomic) SocketManager* manager;

-(void)contect;

@end
```

#### 第二步 Socket.iO 的使用

##### 1、连接

```
    NSString*usetoken = [userDefaults objectForKey:@"userToken"];
    
    /*连接地址*/
    NSString*urlStr = [NSString stringWithFormat:@"http://xxx.xxx.com:83"];
    NSURL* url = [[NSURL alloc] initWithString:urlStr];
    
    /*传递的参数*/
    NSDictionary*dic = [NSDictionary dictionaryWithObject:usetoken forKey:@"token"];
    
    _manager = [[SocketManager alloc] initWithSocketURL:url config:@{@"log": @NO, @"forcePolling": @NO,@"secure":@NO,@"connectParams":dic}];
    
    _socket = _manager.defaultSocket;
    
    /*连接服务器成功*/
    [_socket on:@"connect" callback:^(NSArray* data, SocketAckEmitter* ack) {
        NSLog(@"连接成功");
    }];
    
    [_socket connect];
    
```


注意连接服务器时 config 中的dic 并不是随意传的需要使用指定的key值 如果需要连接时传递参数则需要使用 ConnectParams作物key值。下面是一些key值和作用。

```
case ConnectParams([String: AnyObject]) // 通过字典内容连接
case Cookies([NSHTTPCookie]) // An array of NSHTTPCookies. Passed during the handshake. Default is nil.
case DoubleEncodeUTF8(Bool) // Whether or not to double encode utf8. If using the node based server this should be true. Default is true.
case ExtraHeaders([String: String]) // 添加自定义请求头初始化来请求, 默认为nil
case ForcePolling(Bool) // 是否使用 xhr-polling. Default is `false`
case ForceNew(Bool) // 将为每个连接创建一个新的connect, 如果你在重新连接时有bug时使用.
case ForceWebsockets(Bool) // 是否使用 WebSockets. Default is `false`
case HandleQueue(dispatch_queue_t) // 调度handle的运行队列. Default is the main queue.
case Log(Bool) // 是否打印调试信息. Default is false.
case Logger(SocketLogger) // 可自定义SocketLogger调试日志.默认是系统的.
case Nsp(String) // 如果使用命名空间连接. Must begin with /. Default is `/`
case Path(String) // 如果服务器使用一个自定义路径. 例如: `"/swift/"`. Default is `""`
case Reconnects(Bool) // 是否重新连接服务器失败. Default is `true`
case ReconnectAttempts(Int) // 重新连接多少次. Default is `-1` (无限次)
case ReconnectWait(Int) // 等待重连时间. Default is `10`
case SessionDelegate(NSURLSessionDelegate) // NSURLSessionDelegate 底层引擎设置. 如果你需要处理自签名证书. Default is nil.
```

##### 2、接收消息

接收消息是on 后的参数并不是一定是“notification”,要根据服务器端的设置去使用对应的字符串。

```
[_socket on:@"notification" callback:^(NSArray * _Nonnull data, SocketAckEmitter * _Nonnull ack) {
        
    }];
```

你可能感兴趣的:(iOS学习笔记)