日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

[iPhone高级] 基于XMPP的IOS聊天客户端程序(IOS端二)

發布時間:2024/9/30 编程问答 26 豆豆
生活随笔 收集整理的這篇文章主要介紹了 [iPhone高级] 基于XMPP的IOS聊天客户端程序(IOS端二) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

接上一章的,這一章我們著重介紹XMPP

為了方便程序調用,我們把XMPP的一些主要方法寫在AppDelegate中


在AppDelegate.m下這幾個方法為:

[java]?view plaincopy
  • -(void)setupStream{??
  • ??????
  • ????//初始化XMPPStream??
  • ????xmppStream?=?[[XMPPStream?alloc]?init];??
  • ????[xmppStream?addDelegate:self?delegateQueue:dispatch_get_current_queue()];??
  • ??????
  • }??
  • ??
  • -(void)goOnline{??
  • ??????
  • ????//發送在線狀態??
  • ????XMPPPresence?*presence?=?[XMPPPresence?presence];??
  • ????[[self?xmppStream]?sendElement:presence];??
  • ??????
  • }??
  • ??
  • -(void)goOffline{??
  • ??????
  • ????//發送下線狀態??
  • ????XMPPPresence?*presence?=?[XMPPPresence?presenceWithType:@"unavailable"];??
  • ????[[self?xmppStream]?sendElement:presence];??
  • ??????
  • }??
  • ??
  • -(BOOL)connect{??
  • ??????
  • ????[self?setupStream];??
  • ??????
  • ????//從本地取得用戶名,密碼和服務器地址??
  • ????NSUserDefaults?*defaults?=?[NSUserDefaults?standardUserDefaults];??
  • ??????
  • ????NSString?*userId?=?[defaults?stringForKey:USERID];??
  • ????NSString?*pass?=?[defaults?stringForKey:PASS];??
  • ????NSString?*server?=?[defaults?stringForKey:SERVER];??
  • ??????
  • ????if?(![xmppStream?isDisconnected])?{??
  • ????????return?YES;??
  • ????}??
  • ??????
  • ????if?(userId?==?nil?||?pass?==?nil)?{??
  • ????????return?NO;??
  • ????}??
  • ??????
  • ????//設置用戶??
  • ????[xmppStream?setMyJID:[XMPPJID?jidWithString:userId]];??
  • ????//設置服務器??
  • ????[xmppStream?setHostName:server];??
  • ????//密碼??
  • ????password?=?pass;??
  • ??????
  • ????//連接服務器??
  • ????NSError?*error?=?nil;??
  • ????if?(![xmppStream?connect:&error])?{??
  • ????????NSLog(@"cant?connect?%@",?server);??
  • ????????return?NO;??
  • ????}??
  • ??????
  • ????return?YES;??
  • ??
  • }??
  • ??
  • -(void)disconnect{??
  • ??????
  • ????[self?goOffline];??
  • ????[xmppStream?disconnect];??
  • ??????
  • }??
  • 這幾個是基礎方法,接下來就是XMPPStreamDelegate中的方法,也是接受好友狀態,接受消息的重要方法

    [java]?view plaincopy
  • //連接服務器??
  • -?(void)xmppStreamDidConnect:(XMPPStream?*)sender{??
  • ??????
  • ????isOpen?=?YES;??
  • ????NSError?*error?=?nil;??
  • ????//驗證密碼??
  • ????[[self?xmppStream]?authenticateWithPassword:password?error:&error];??
  • ??????
  • }??
  • ??
  • //驗證通過??
  • -?(void)xmppStreamDidAuthenticate:(XMPPStream?*)sender{??
  • ??????
  • ????[self?goOnline];??
  • }??
  • ??
  • //收到消息??
  • -?(void)xmppStream:(XMPPStream?*)sender?didReceiveMessage:(XMPPMessage?*)message{??
  • ??????
  • //????NSLog(@"message?=?%@",?message);??
  • ??????
  • ????NSString?*msg?=?[[message?elementForName:@"body"]?stringValue];??
  • ????NSString?*from?=?[[message?attributeForName:@"from"]?stringValue];??
  • ??????
  • ????NSMutableDictionary?*dict?=?[NSMutableDictionary?dictionary];??
  • ????[dict?setObject:msg?forKey:@"msg"];??
  • ????[dict?setObject:from?forKey:@"sender"];??
  • ??????
  • ????//消息委托(這個后面講)??
  • ????[messageDelegate?newMessageReceived:dict];??
  • ??????
  • }??
  • ??
  • //收到好友狀態??
  • -?(void)xmppStream:(XMPPStream?*)sender?didReceivePresence:(XMPPPresence?*)presence{??
  • ??????
  • //????NSLog(@"presence?=?%@",?presence);??
  • ??????
  • ????//取得好友狀態??
  • ????NSString?*presenceType?=?[presence?type];?//online/offline??
  • ????//當前用戶??
  • ????NSString?*userId?=?[[sender?myJID]?user];??
  • ????//在線用戶??
  • ????NSString?*presenceFromUser?=?[[presence?from]?user];??
  • ??????
  • ????if?(![presenceFromUser?isEqualToString:userId])?{??
  • ??????????
  • ????????//在線狀態??
  • ????????if?([presenceType?isEqualToString:@"available"])?{??
  • ??????????????
  • ????????????//用戶列表委托(后面講)??
  • ????????????[chatDelegate?newBuddyOnline:[NSString?stringWithFormat:@"%@@%@",?presenceFromUser,?@"nqc1338a"]];??
  • ??????????????
  • ????????}else?if?([presenceType?isEqualToString:@"unavailable"])?{??
  • ????????????//用戶列表委托(后面講)??
  • ????????????[chatDelegate?buddyWentOffline:[NSString?stringWithFormat:@"%@@%@",?presenceFromUser,?@"nqc1338a"]];??
  • ????????}??
  • ??????????
  • ????}??
  • ??
  • }??
  • 這里面有兩個委托方法,一個是用戶列表委托,還有一個就是消息委托,用戶列表委托主要就是取得在線用戶,更新用戶TableView,消息委托就是取得好友發送的消息,并更新消息TableView,當然這兩個TableView是在不同的Controller中的



    定義完兩個委托,我們就要在不同的Controller中實現這兩個委托了

    在好友Controller中實現<KKChatDelegate>并寫入如下方法

    [java]?view plaincopy
  • //取得當前程序的委托??
  • -(KKAppDelegate?*)appDelegate{??
  • ??????
  • ????return?(KKAppDelegate?*)[[UIApplication?sharedApplication]?delegate];??
  • ??????
  • }??
  • ??
  • //取得當前的XMPPStream??
  • -(XMPPStream?*)xmppStream{??
  • ??????
  • ????return?[[self?appDelegate]?xmppStream];??
  • }??
  • ??
  • //在線好友??
  • -(void)newBuddyOnline:(NSString?*)buddyName{??
  • ??????
  • ????if?(![onlineUsers?containsObject:buddyName])?{??
  • ????????[onlineUsers?addObject:buddyName];??
  • ????????[self.tView?reloadData];??
  • ????}??
  • ??????
  • }??
  • ??
  • //好友下線??
  • -(void)buddyWentOffline:(NSString?*)buddyName{??
  • ??????
  • ????[onlineUsers?removeObject:buddyName];??
  • ????[self.tView?reloadData];??
  • ??????
  • }??
  • 在viewDidLoad中加入

    [java]?view plaincopy
  • //設定在線用戶委托??
  • ????KKAppDelegate?*del?=?[self?appDelegate];??
  • ????del.chatDelegate?=?self;??
  • 這兩行代碼,讓好友列表的委托實現方法在本程序中

    viewWillAppear中加入

    [java]?view plaincopy
  • [super?viewWillAppear:animated];??
  • ??
  • NSString?*login?=?[[NSUserDefaults?standardUserDefaults]?objectForKey:@"userId"];??
  • ??
  • if?(login)?{??
  • ??????
  • ????if?([[self?appDelegate]?connect])?{??
  • ????????NSLog(@"show?buddy?list");??
  • ??????????
  • ????}??
  • ??????
  • }else?{??
  • ??????
  • ????//設定用戶??
  • ????[self?Account:self];??
  • ??????
  • }??
  • 判斷本地保存的數據中是否有userId,沒有的話就跳轉到登錄頁面

    這里最重要的就是connect了,這一句話就是登錄了,成功的話,頁面就會顯示好友列表了。

    [java]?view plaincopy
  • #pragma?mark?UITableViewDelegate??
  • -(void)tableView:(UITableView?*)tableView?didSelectRowAtIndexPath:(NSIndexPath?*)indexPath{??
  • ??????
  • ????//start?a?Chat??
  • ????chatUserName?=?(NSString?*)[onlineUsers?objectAtIndex:indexPath.row];??
  • ??????
  • ????[self?performSegueWithIdentifier:@"chat"?sender:self];??
  • ??????
  • }??
  • -(void)prepareForSegue:(UIStoryboardSegue?*)segue?sender:(id)sender{??
  • ??????
  • ????if?([segue.identifier?isEqualToString:@"chat"])?{??
  • ????????KKChatController?*chatController?=?segue.destinationViewController;??
  • ????????chatController.chatWithUser?=?chatUserName;??
  • ????}??
  • }??
  • 當顯示出好友列表,我們選擇一個好友進行聊天

    將當前好友名稱發送給聊天頁面

    下面是聊天Controller了

    在KKChatController.h中加入

    [java]?view plaincopy
  • NSMutableArray?*messages;??
  • 這是我們要顯示的消息,每一條消息為一條字典

    接下來就是每一條消息的顯示了

    [java]?view plaincopy
  • -(UITableViewCell?*)tableView:(UITableView?*)tableView?cellForRowAtIndexPath:(NSIndexPath?*)indexPath{??
  • ??????
  • ????static?NSString?*identifier?=?@"msgCell";??
  • ??????
  • ????UITableViewCell?*cell?=?[tableView?dequeueReusableCellWithIdentifier:identifier];??
  • ??????
  • ????if?(cell?==?nil)?{??
  • ????????cell?=?[[UITableViewCell?alloc]?initWithStyle:UITableViewCellStyleSubtitle?reuseIdentifier:identifier];??
  • ????}??
  • ??????
  • ????NSMutableDictionary?*dict?=?[messages?objectAtIndex:indexPath.row];??
  • ??????
  • ????cell.textLabel.text?=?[dict?objectForKey:@"msg"];??
  • ????cell.detailTextLabel.text?=?[dict?objectForKey:@"sender"];??
  • ????cell.accessoryType?=?UITableViewCellAccessoryNone;??
  • ??????
  • ????return?cell;??
  • ??????
  • }??
  • 跟上面好友Controller一樣,這里我們也需要XMPPStream

    [java]?view plaincopy
  • -(KKAppDelegate?*)appDelegate{??
  • ??????
  • ????return?(KKAppDelegate?*)[[UIApplication?sharedApplication]?delegate];??
  • }??
  • ??
  • -(XMPPStream?*)xmppStream{??
  • ??????
  • ????return?[[self?appDelegate]?xmppStream];??
  • }??
  • 在ViewDidLoad中加入

    [java]?view plaincopy
  • KKAppDelegate?*del?=?[self?appDelegate];??
  • del.messageDelegate?=?self;??
  • 設定消息委托由自己來接收和處理

    [java]?view plaincopy
  • #pragma?mark?KKMessageDelegate??
  • -(void)newMessageReceived:(NSDictionary?*)messageCotent{??
  • ??????
  • ????[messages?addObject:messageCotent];??
  • ??????
  • ????[self.tView?reloadData];??
  • ??????
  • }??
  • 接下來最重要的就是發送消息了

    [java]?view plaincopy
  • -?(IBAction)sendButton:(id)sender?{??
  • ??????
  • ????//本地輸入框中的信息??
  • ????NSString?*message?=?self.messageTextField.text;??
  • ??????
  • ????if?(message.length?>?0)?{??
  • ??????????
  • ????????//XMPPFramework主要是通過KissXML來生成XML文件??
  • ????????//生成<body>文檔??
  • ????????NSXMLElement?*body?=?[NSXMLElement?elementWithName:@"body"];??
  • ????????[body?setStringValue:message];??
  • ??????????
  • ????????//生成XML消息文檔??
  • ????????NSXMLElement?*mes?=?[NSXMLElement?elementWithName:@"message"];??
  • ????????//消息類型??
  • ????????[mes?addAttributeWithName:@"type"?stringValue:@"chat"];??
  • ????????//發送給誰??
  • ????????[mes?addAttributeWithName:@"to"?stringValue:chatWithUser];??
  • ????????//由誰發送??
  • ????????[mes?addAttributeWithName:@"from"?stringValue:[[NSUserDefaults?standardUserDefaults]?stringForKey:USERID]];??
  • ????????//組合??
  • ????????[mes?addChild:body];??
  • ??????????
  • ????????//發送消息??
  • ????????[[self?xmppStream]?sendElement:mes];??
  • ??????????
  • ????????self.messageTextField.text?=?@"";??
  • ????????[self.messageTextField?resignFirstResponder];??
  • ??????????
  • ????????NSMutableDictionary?*dictionary?=?[NSMutableDictionary?dictionary];??
  • ??????????
  • ????????[dictionary?setObject:message?forKey:@"msg"];??
  • ????????[dictionary?setObject:@"you"?forKey:@"sender"];??
  • ??
  • ????????[messages?addObject:dictionary];??
  • ??????????
  • ????????//重新刷新tableView??
  • ????????[self.tView?reloadData];??
  • ??????????
  • ????}??
  • ??????
  • ??????
  • }??
  • 上面都加了注釋,大家應該能明白,接下來還有一個章節,我們會對發送的消息在界面進行美化,跟蘋果自帶的消息一樣。謝謝大家有耐心看完,我這個人比較不喜歡打字,所以有的地方注釋比較少,希望大家別介意,還有希望大家能夠多多支持, 以后會接著介紹XMPP文件傳輸之類的內容。

    總結

    以上是生活随笔為你收集整理的[iPhone高级] 基于XMPP的IOS聊天客户端程序(IOS端二)的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。