1. 程式人生 > >iOS之WebSocket(即時通訊、實時接受廣播訊息)

iOS之WebSocket(即時通訊、實時接受廣播訊息)

在專案中使用到了廣播訊息,例如廣播通知
首先匯入

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; }