美文网首页
iOS中SocketIO 的使用总结

iOS中SocketIO 的使用总结

作者: peterking | 来源:发表于2019-08-23 15:08 被阅读0次

    由于项目要求客户端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中SocketIO 的使用总结

          本文链接:https://www.haomeiwen.com/subject/tbhtectx.html