引言
最近项目都要改用socketio,之前改过一次,由于没做笔记,花费大量时间查找的资料与问题解决方式都要重新走一遍,必须记录!!!使用过程中踩坑填坑的记录,方便以后查找。
正文
鉴于现在socketio没有iOS版本,只有swift版本。
问题有几个:
1.导入OC项目引用的框架Socket.io-client-Swift(镜像地址)、(GitHub地址)
2.OC语言与Swift语言桥接问题
3.某些必须注意事项
1.导入socket.io-client-swift
建议使用cocopods导入!!!
本人使用纯代码导入出了错都不知道怎么解决,偷懒浪费时间。
cocopods如何使用教程很多,不过多赘述。
下面直接从项目已经配置好cocopods开始说起:
扫描二维码关注公众号,回复:
16034745 查看本文章
ps:嫌弃在终端编译Profile文件太麻烦,本人偷懒操作步骤。
- 首先打开项目里的podfile文件,直接添加这一行
pod 'Socket.IO-Client-Swift'
- 打开终端-->cd到项目文件夹下
cd /Users/q/Desktop/项目
- 更新profile导入
pod install
更新完成之后,socketio相关SDK都导入到项目中
2.OC与Swift桥接
由于SocketIO使用的是Swift框架,所以必须建立桥接
- 首先创建一个Swift文件,在第一次创建的时候都会提示是否创建桥接文件。
- 创建好之后项目会多两个文件,如图
3.使用
- 在桥接文件中导入SocketIO框架
@import SocketIO;
- 在需要使用的文件中导入桥接文件头文件
#import "项目-Bridging-Header.h"
#import "项目-Swift.h" //编译文件
- 项目中使用,这个参数对照表很重要,对使用有很大帮助。附对照表来源
/**
log 是否打印日志
forceNew 这个参数设为NO从后台恢复到前台时总是重连,暂不清楚原因
forcePolling 是否强制使用轮询
reconnectAttempts 重连次数,-1表示一直重连
reconnectWait 重连间隔时间
connectParams 参数
forceWebsockets 是否强制使用websocket, 解释The reason it uses polling first is because some firewalls/proxies block websockets. So polling lets socket.io work behind those.
**/
NSURL* url = [[NSURL alloc] initWithString:IP_URL];
SSLSecurity *SSLSecu = [[SSLSecurity alloc]initWithUsePublicKeys:YES];
self.manager = [[SocketManager alloc]initWithSocketURL:url config:@{@"log": @YES, @"selfSigned":@YES,@"securty":SSLSecu,@"forceNew" : @YES, @"forcePolling": @NO, @"reconnectAttempts":@(-1), @"reconnectWait" : @1, @"connectParams": @{@"userId" : token}, @"forceWebsockets" : @NO}];
SocketIOClient *socket = self.manager.defaultSocket;
- 一些方法与事件处理的“标识”
// socket 连接服务器
[socket on:@"connect" callback:^(NSArray* data, SocketAckEmitter* ack) {
NSLog(@"socket connected ");
[weakSelf.socket handleEvent:@"authenticated" data:data isInternalMessage:NO withAck:1]; // 添加接收鉴权的方法
}];
[socket connect];
// socket 鉴权 看情况使用
[socket on:@"authenticated" callback:^(NSArray * data, SocketAckEmitter * ack) {
if (data.count > 0) {
NSLog(@"socket 鉴权结果 - %@",data);
}
}];
// 心跳包 具体情况看服务端发送和接收方式
[socket on:@"ping" callback:^(NSArray * _Nonnull data, SocketAckEmitter * _Nonnull ack) {
NSLog(@"socket - 心跳包");
// 查看socket 连接状态
NSLog(@"connect manager status : %ld",(long)weakSelf.manager.status);
}];
// socket 断开连接
[socket on:@"disconnect" callback:^(NSArray* data, SocketAckEmitter* ack) {
// 断开连接
NSLog(@"socket.io disconnect 断开连接");
// 添加条件判断 超过5次断开连接
if (weakSelf.connectCount > 5) {
[weakSelf closeSocket];
}
}];
[socket on:@"reconnect" callback:^(NSArray *data, SocketAckEmitter *ack) {
NSLog(@"重连中...");
if (data.count > 0) {
// 连接成功
weakSelf.connectCount = 0;
}else
{
// 连接失败
weakSelf.connectCount++;
}
if (weakSelf.connectCount > 5) {
[weakSelf closeSocket];
}
}];
//连接出错了
[_socket on:@"error" callback:^(NSArray * data, SocketAckEmitter * ack) {
NSLog(@"socket.io error %@",data);
}];
// 关闭socket
-(void)closeSocket{
if (_socket) { // 如果socket 存在 再关闭
self.connectCount = 0;
// 发送关闭socket 请求
[_socket emit:@"disconnect_request" with:@[]];
[_socket disconnect];
_socket = nil;
}
}