公司是做智能家居的,通过网关来操控各种设备。因为要保持App状态和设备状态一致,也就是说手动操控设备时,App端要看见设备的变化,所以选用socket进行长连接。
1.导入SRWebSocket
通过CocoaPods进行导入配置
通过手动导入并配置
github下载地址 SRWebSocket
1> 将下载的文件导入工程中
2> 添加相关的配置文件
libicucore.tbd
CFNetwork.framework
Security.framework
Foundation.framework
2.代码实现
导入头文件
#import "SRWebSocket.h"
遵守协议
<SRWebSocketDelegate>
// 与websocket建立连接
- (void)reconnect{
self.webSocket.delegate = nil;
[self.webSocket close];
self.webSocket = nil;
// url根据公司的要求,样式和参数不同
self.webSocket = [[SRWebSocket alloc] initWithURLRequest:[NSURLRequest requestWithURL:url]];
self.webSocket.delegate = self;
[self.webSocket open];
webSocket的地址是以ws://开头
#pragma mark - SRWebSocketDelegate // 代理方法
// 连接成功
- (void)webSocketDidOpen:(SRWebSocket *)webSocket{
[self sendHeart];
//每90秒发送一次心跳
[NSTimer scheduledTimerWithTimeInterval:90 target:self selector:@selector(sendHeart) userInfo:nil repeats:YES];
// 心跳间隔时间和心跳内容询问后台
NSLog(@"Websocket Connected");
}
// 连接失败
- (void)webSocket:(SRWebSocket *)webSocket didFailWithError:(NSError *)error{
// 这里可进行重连
NSLog(@":( Websocket Failed With Error %@", error);
}
// 接收数据
- (void)webSocket:(SRWebSocket *)webSocket didReceiveMessage:(id)message{
// 在这里进行数据的处理
NSLog(@"%@",message);
}
// 连接关闭
- (void)webSocket:(SRWebSocket *)webSocket didCloseWithCode:(NSInteger)code reason:(NSString *)reason wasClean:(BOOL)wasClean{
// 判断是何种情况的关闭,如果是人为的就不需要重连,如果是其他情况,就重连
NSLog(@"webSocket Closed!");
}
// 接收服务器发送的pong消息
- (void)webSocket:(SRWebSocket *)webSocket didReceivePong:(NSData *)pongPayload{
NSLog(@"Websocket received pong");
}
// 发送心跳
- (void)sendHeart{
NSString *heartBeat = @"心跳";
@try {
[self.webSocket send:heartBeat];
} @catch (NSException *exception) {
// 发送心跳出错
[self reconnect];
}
}
// 给服务器发送信息
- (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event{
// 信息格式询问后台
NSString *message = @"message";
[self.webSocket send:message];
}
在需要的地方调用reconnect方法,建立连接。
在结束使用的时候
[self.webSocket close];
self.webSocket = nil;
self.webSocket.delegate = nil;