由于项目要求客户端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) {
}];