iOS之WebSocket(即時通訊、實時接受廣播訊息)
阿新 • • 發佈:2019-02-20
在專案中使用到了廣播訊息,例如廣播通知
首先匯入
pod 'SocketRocket', '~> 0.5.0'
引入4個庫
libicucore.dylib,CFNetwork.framework, Security.framework, Foundation.framework
#import "dynamicMessageTableViewCell.h"
#import "BBCyclingLabel.h"
#import <SocketRocket/SRWebSocket.h>
@interface dynamicMessageTableViewCell ()<SRWebSocketDelegate>
{
BBCyclingLabel * _bbCyclingLable;
NSMutableArray * _titleArr;
// UITextField * _text;
int a;
int _msgCount;
SRWebSocket * _webSocket;
}
@end
@implementation dynamicMessageTableViewCell
-(instancetype)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier
{
if (self = [super initWithStyle:style reuseIdentifier:reuseIdentifier]) {
a = 0;
_titleArr = [[NSMutableArray alloc] init];
UIImageView *imagev = [[UIImageView alloc]initWithFrame:CGRectMake(12, 4, 14, 12)];
[imagev setImage:GetImage(@"ico-notice.png" )];
[self addSubview:imagev];
[self createUI];
}
return self;
}
-(void)createUI
{
//獲取本地儲存的資料
NSUserDefaults *userDefaultes = [NSUserDefaults standardUserDefaults];
//讀取陣列NSArray型別的資料
NSArray *myArray = [[NSArray alloc] initWithArray:[userDefaultes arrayForKey:@"messageArray"]];
_titleArr = [myArray mutableCopy];
_bbCyclingLable = [[BBCyclingLabel alloc]initWithFrame:CGRectMake(40, 0, SCREEN_WIDTH-40, 20) andTransitionType:BBCyclingLabelTransitionEffectScrollUp];
_bbCyclingLable.font = GetFont(BFONT_12);
_bbCyclingLable.clipsToBounds = YES;
[self addSubview:_bbCyclingLable];
NSTimer *time = [NSTimer scheduledTimerWithTimeInterval:2.0 target:self selector:@selector(change) userInfo:nil repeats:YES];
[time fire];
_webSocket.delegate = nil;
[_webSocket close];
_webSocket = [[SRWebSocket alloc] initWithURLRequest:[NSURLRequest requestWithURL:[NSURL URLWithString:@"ws://49.213.11.伺服器埠"]]];
_webSocket.delegate = self;
[_webSocket open];
}
//陣列中的內容僅供測試用,具體內容可以通過後臺伺服器獲取或者寫死(資料條數可以改變,我寫的是3條)
-(void)change
{
if (_titleArr.count >0) {
if (0<=a && a<_titleArr.count) {
_bbCyclingLable.text = [_titleArr objectAtIndex:a];
}else{
a=0;
_bbCyclingLable.text = [_titleArr objectAtIndex:a];
}
a++;
}
}
//這個的目的是往伺服器上傳資料,做即時通訊的時候傳送的訊息用這個方法
#pragma mark - SRWebSocketDelegate
- (void)webSocketDidOpen:(SRWebSocket *)webSocket;{
NSLog(@"Websocket Connected");
NSError *error;
NSData *jsonData = [NSJSONSerialization dataWithJSONObject:@{@"id":@"chat",@"clientid":@"hxz",@"to":@""} options:NSJSONWritingPrettyPrinted error:&error];
NSString *jsonString = [[NSString alloc] initWithData:jsonData encoding:NSUTF8StringEncoding];
[webSocket send:jsonString];
}
//失敗
- (void)webSocket:(SRWebSocket *)webSocket didFailWithError:(NSError *)error;{
NSLog(@":( Websocket Failed With Error %@", error);
webSocket = nil;
}
//收到的訊息
- (void)webSocket:(SRWebSocket *)webSocket didReceiveMessage:(id)message;{
NSLog(@"Received \"%@\"", message);
NSString * mesStr = (NSString *)message;
NSArray * arr = [mesStr componentsSeparatedByString:@","];
for (NSString * str in arr) {
[_titleArr addObject:str];
//最多存5條記錄
if(_titleArr.count > 5)
{
[_titleArr removeObjectAtIndex:0];
}
}
//將上述資料全部儲存到NSUserDefaults中
NSUserDefaults *userDefaults = [NSUserDefaults standardUserDefaults];
[userDefaults setObject:_titleArr forKey:@"messageArray"];
}
//結束關閉
- (void)webSocket:(SRWebSocket *)webSocket didCloseWithCode:(NSInteger)code reason:(NSString *)reason wasClean:(BOOL)wasClean;{
NSLog(@"WebSocket closed");
webSocket = nil;
}