公司是做智能家居的,通過網(wǎng)關(guān)來操控各種設(shè)備。因為要保持App狀態(tài)和設(shè)備狀態(tài)一致,也就是說手動操控設(shè)備時,App端要看見設(shè)備的變化,所以選用socket進行長連接。
1.導(dǎo)入SRWebSocket
通過CocoaPods進行導(dǎo)入配置
通過手動導(dǎo)入并配置
github下載地址 SRWebSocket
1> 將下載的文件導(dǎo)入工程中

SRWebSocket
2> 添加相關(guān)的配置文件
libicucore.tbd
CFNetwork.framework
Security.framework
Foundation.framework
2.代碼實現(xiàn)
導(dǎo)入頭文件
#import "SRWebSocket.h"
遵守協(xié)議
<SRWebSocketDelegate>
// 與websocket建立連接
- (void)reconnect{
self.webSocket.delegate = nil;
[self.webSocket close];
self.webSocket = nil;
// url根據(jù)公司的要求,樣式和參數(shù)不同
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秒發(fā)送一次心跳
[NSTimer scheduledTimerWithTimeInterval:90 target:self selector:@selector(sendHeart) userInfo:nil repeats:YES];
// 心跳間隔時間和心跳內(nèi)容詢問后臺
NSLog(@"Websocket Connected");
}
// 連接失敗
- (void)webSocket:(SRWebSocket *)webSocket didFailWithError:(NSError *)error{
// 這里可進行重連
NSLog(@":( Websocket Failed With Error %@", error);
}
// 接收數(shù)據(jù)
- (void)webSocket:(SRWebSocket *)webSocket didReceiveMessage:(id)message{
// 在這里進行數(shù)據(jù)的處理
NSLog(@"%@",message);
}
// 連接關(guān)閉
- (void)webSocket:(SRWebSocket *)webSocket didCloseWithCode:(NSInteger)code reason:(NSString *)reason wasClean:(BOOL)wasClean{
// 判斷是何種情況的關(guān)閉,如果是人為的就不需要重連,如果是其他情況,就重連
NSLog(@"webSocket Closed!");
}
// 接收服務(wù)器發(fā)送的pong消息
- (void)webSocket:(SRWebSocket *)webSocket didReceivePong:(NSData *)pongPayload{
NSLog(@"Websocket received pong");
}
// 發(fā)送心跳
- (void)sendHeart{
NSString *heartBeat = @"心跳";
@try {
[self.webSocket send:heartBeat];
} @catch (NSException *exception) {
// 發(fā)送心跳出錯
[self reconnect];
}
}
// 給服務(wù)器發(fā)送信息
- (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event{
// 信息格式詢問后臺
NSString *message = @"message";
[self.webSocket send:message];
}
在需要的地方調(diào)用reconnect方法,建立連接。
在結(jié)束使用的時候
[self.webSocket close];
self.webSocket = nil;
self.webSocket.delegate = nil;