亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 學院 > 開發設計 > 正文

iOS中XMPP即時通訊實現的主要步驟

2019-11-14 17:53:20
字體:
來源:轉載
供稿:網友

這里只是列出實現的只要步驟,不是全部代碼。

首先導入XMPPFramework,及相關配置,完成后開始。

創建一個XMPPHelper  類來管理要進行的操作。

XMPPHelper.h文件如下

 1 typedef void(^loginSuccessBlock)(void); 2 typedef void(^loginFailBlock)(NSString *info); 3 typedef void(^fenchFridendList)(id result); 4 typedef void(^logoutSuccessBlock)(void); 5 typedef void(^registerSuccessBlock)(void); 6 typedef enum { 7     kTypeLogin, 8     kTypeRegister 9 }ConnectType;10 #import <Foundation/Foundation.h>11 #define kXMPPHosetName @"lala"12 #define kXMPPHostAddress @"192.168.13.17"13 #define kHostPort 522214 15 @interface XMPPHelper : NSObject16 {17 18     ConnectType _connectType;19 20 }21 @PRoperty(nonatomic,strong)XMPPStream *stream;22 @property(nonatomic,strong)XMPPRoster *roster;23 @property(nonatomic,copy)NSString *username;24 @property(nonatomic,copy)NSString *passWord;25 26 @property(nonatomic,copy)loginSuccessBlock loginSuccessBlock;27 @property(nonatomic,copy)loginFailBlock loginFailBlock;28 @property(nonatomic,copy)fenchFridendList fenchFriendList;29 @property(nonatomic,copy)logoutSuccessBlock logoutSuccessBlock;30 @property(nonatomic,copy)registerSuccessBlock registerSuccessblock;31 32 +(instancetype)shareInstance;33 //登陸34 -(void)login:(NSString *)username password:(NSString *)password loginSuccessBlock:(loginSuccessBlock)block loginFailBlock:(loginFailBlock)failBlcok;35 //獲取好友列表36 -(void)loadFriendList:(fenchFridendList)fenchfriendList;37 //發送消息38 -(void)sendMessage:(NSString *)message toUser:(NSString *)jid;39 //注銷40 -(void)logoutAction:(logoutSuccessBlock)block;41 //注冊42 -(void)registerAction:(NSString *)username password:(NSString *)password registerSuccessBlock:(registerSuccessBlock)registerBlock;43 44 @end

XMPPHelper.m文件如下

#define kHostAddress @"192.168.13.12"#define kHostName @"zy"#define KHostPort 5222#import "XMPPHelper.h"#import "User.h"static XMPPHelper *helper = nil;@interface XMPPHelper() <XMPPStreamDelegate>{    ConnectTyep _connectType;}@end@implementation XMPPHelper//單例+ (instancetype) shareInstance {    static dispatch_once_t onceToken;    dispatch_once(&onceToken, ^{        helper = [[XMPPHelper alloc] init];        [helper _stepXMPPHelper];    });    return helper;}//初始化的操作- (void) _stepXMPPHelper {    //初始化流對象.    self.stream = [[XMPPStream alloc] init];    //創建自動連接的對象,當意外斷開的時候,可以進行自動連接.    XMPPReconnect *reConnect = [[XMPPReconnect alloc] init];        //初始化花名冊對象(好友列表)    //存儲方式.    XMPPRosterCoreDataStorage *storage = [[XMPPRosterCoreDataStorage alloc] init];    self.roster = [[XMPPRoster alloc] initWithRosterStorage:storage];        //建立對象之間的聯系    //激活.    [reConnect activate:self.stream];    //激活,使用花名冊對象.    [self.roster activate:self.stream];        //設置代理;    [self.stream addDelegate:self delegateQueue:dispatch_get_main_queue()];    [self.roster addDelegate:self delegateQueue:dispatch_get_main_queue()];        //設置服務器的基本信息.    //服務器的地址    [self.stream setHostName:kHostAddress];    [self.stream setHostPort:KHostPort];    //端口號}#pragma mark XMPP 對外公開方法- (void) login:(NSString *)userName password:(NSString *)password loginSuccessBlock:(LoginSuccessBlock)block loginFailBlock:(LoginFailBlock)failBlock {        _connectType = kTypeLogin;        self.userName = userName;    self.password = password;    self.loginFailBlock = failBlock;    self.loginSuccessBlock = block;    //登錄的流程.    if (![self connect]) {        //連接失敗的時候 調用失敗的block        if (self.loginFailBlock) {            self.loginFailBlock(@"網絡錯誤");        }    }}//發起連接- (BOOL) connect {    //設置用戶的jid    NSString *jidString = [NSString stringWithFormat:@"%@@%@",self.userName,kHostName];    //創建了一個jid對象    XMPPJID *jid = [XMPPJID jidWithString:jidString];    [self.stream setMyJID:jid];    NSError *ERROR = nil;  return [self.stream connectWithTimeout:10 error:&ERROR];}//上線的方法- (void) online {    //默認情況下 上線的狀態    XMPPPresence *presence = [XMPPPresence presence];    [self.stream sendElement:presence];}//下線的方法- (void) outLine {        XMPPPresence *presence = [XMPPPresence presenceWithType:@"unavailable"];//unavailable 離線的意思    //發送離線狀態    [self.stream sendElement:presence];    }//查詢好友列表/** <iq from='guojing@wxhl' type='get' id='roster_1' to='域名'>    <query xmlns='jabber:iq:roster'/> <!-- iq 信息有多種,根據命名空間來區分--> </iq> */- (void) loadFriendList :(FentchFriendList) fentchFriendList {        self.fentchFriendList  = fentchFriendList;    //創建xml片段    //創建<iq></iq>    NSXMLElement *iqElement = [NSXMLElement elementWithName:@"iq"];    XMPPJID *jid = self.stream.myJID;    [iqElement addAttributeWithName:@"from" stringValue:[jid description]];    //jid.domain  ---> 服務器的域名    [iqElement addAttributeWithName:@"to" stringValue:jid.domain];    [iqElement addAttributeWithName:@"type" stringValue:@"get"];    [iqElement addAttributeWithName:@"id" stringValue:@"123456"];        //創建子節點    NSXMLElement *queryElement = [NSXMLElement elementWithName:@"query" xmlns:@"jabber:iq:roster"];    //給iq節點增加子節點.    [iqElement addChild:queryElement];    //發送請求(好友列表)    [self.stream sendElement:iqElement];}//發送消息//發送消息的格式/** <message    to='huangrong@wxhl'    from='guojing@wxhl'    type='chat'        xml:lang='en'>    <body>有個bug幫我看下</body> </message> */- (void) sendMessage:(NSString *)message toUser:(NSString *) jid {        //NIL    if (!message || [message isEqualToString:@""]) {        return;    }        NSXMLElement *messageElement = [NSXMLElement elementWithName:@"message"];        [messageElement addAttributeWithName:@"to" stringValue:jid];    XMPPJID *myJid = self.stream.myJID;    [messageElement addAttributeWithName:@"from" stringValue:myJid.description];        [messageElement addAttributeWithName:@"type" stringValue:@"chat"];        [messageElement addAttributeWithName:@"xml:lang" stringValue:@"en"];    //<message></message>創建完畢    //創建子節點<body></body>    NSXMLElement *bodyElement = [NSXMLElement elementWithName:@"body" stringValue:message];    [messageElement addChild:bodyElement];        //發送消息    [self.stream sendElement:messageElement];}//注銷方法- (void) logOutAction : (LogoutSuccessBlock) block {    //發送離線的消息    [self outLine];        //斷開連接,主動斷開鏈接    [self.stream disconnect];        if (block) {        block();    }}//注冊的方法- (void) registerUser:(NSString *)userName password:(NSString *)password registerSuccessBlock:(RegisterSuccessBlock) block {    _connectType = kTypeRegister;    //連接    self.userName = userName;    self.password = password;    self.registerBlock = block;        [self connect];}#pragma mark - XMPP DELEGAET- (void)xmppStreamDidConnect:(XMPPStream *)sender {    NSLog(@"連接成功");    //注冊流程和登錄流程都要使用該方法.在這里就要進行邏輯上判斷    if (_connectType == kTypeRegister) {        [self.stream registerWithPassword:self.password error:nil];    }else if(_connectType == kTypeLogin){        //如果連接成功,則繼續驗證密碼.        [self.stream authenticateWithPassword:self.password error:nil];    }}//驗證成功的方法- (void)xmppStreamDidAuthenticate:(XMPPStream *)sender {    NSLog(@"驗證成功");    //要調用成功的block    //發送上線的狀態.    [self online];    if (self.loginSuccessBlock) {        self.loginSuccessBlock();    }}//驗證失敗的方法- (void)xmppStream:(XMPPStream *)sender didNotAuthenticate:(NSXMLElement *)error {    NSLog(@"驗證失敗");    //如果認證失敗的話,要主動斷開連接    [self.stream disconnect];    if (self.loginFailBlock) {        self.loginFailBlock(@"密碼錯誤");    }}//獲取查詢信息- (BOOL)xmppStream:(XMPPStream *)sender didReceiveIQ:(XMPPIQ *)iq {    /**     //根節點     <iq xmlns="jabber:client" type="result" id="123456" to="1234@zy/f54fcd02">        <query xmlns="jabber:iq:roster">            <item jid="gxb@localhost" name="" ask="subscribe" subscription="none">                <group>聯系人列表</group>            </item>            <item jid="laoyan@zy" name="laoyan" subscription="both">                <group>12</group>            </item>            <item jid="deskmate@zy" name="deskmate" subscription="both">                <group>12</group>                <group>12</group>            </item>            <item jid="test123@zy" name="test123" subscription="both">                <group>聯系人列表</group>            </item>            <item jid="zhengqingqing@192.168.13.12" name="" ask="subscribe" subscription="none">                <group>聯系人列表</group>            </item>            <item jid="liuweiwei@zy" name="" subscription="both">                <group>讓你變綠</group>                <group>讓你變綠</group>            </item>            <item jid="zhengqingqing@zy" name="zhengqingqing" subscription="both">                <group>讓你變綠</group>            </item>            <item jid="gxb1@zy" name="" subscription="both">                <group>聯系人列表</group>                <group>聯系人列表</group>                <group>變綠了</group>            </item>            <item jid="123456@localhost" name="" ask="subscribe" subscription="none">                <group>聯系人列表</group>            </item>        </query>     </iq>     */    //需要要類型是 字典    /**     dic = {        "聯系人列表":[user1,user3],        "12":[user2]     }     */    NSMutableDictionary *results = [NSMutableDictionary dictionary];    NSXMLElement *queryElement = iq.childElement;    //遍歷Query節點    User *user = nil;    for (NSXMLElement *itemElement in queryElement.children) {                user = [[User alloc] init];                NSString *jidString = [itemElement attributeStringValueForName:@"jid"];                user.jid = jidString;                NSString *userName = [itemElement attributeStringValueForName:@"name"];                user.username = userName;                for (NSXMLElement *groupElement in itemElement.children) {            //組名 12            NSString *groupString = groupElement.stringValue;                        NSMutableArray *users = results[groupString];                        if (users == nil) {                users = [NSMutableArray array];                results[groupString] = users;            }            [users addObject:user];        }    }        if (self.fentchFriendList) {        self.fentchFriendList(results);    }            NSLog(@"獲取好友列表 %@",results);    return YES;}//監聽外部傳過來的數據,就是如果有好友發來信息,則,回調此方法./** //傳過來很多message標簽,我們只需要帶body的message標簽 <message xmlns="jabber:client" type="chat" id="purplea775e98a" to="1234@zy" from="gxb1@zy/MacdeMacBook-Pro-3"><composing xmlns="http://jabber.org/protocol/chatstates"/></message> 2015-11-18 09:35:20.264 WeChat[3162:161262] message is <message xmlns="jabber:client" type="chat" id="purplea775e98b" to="1234@zy" from="gxb1@zy/MacdeMacBook-Pro-3"><active xmlns="http://jabber.org/protocol/chatstates"/><body>sad</body></message> 2015-11-18 09:35:30.491 WeChat[3162:161262] message is <message xmlns="jabber:client" type="chat" id="purplea775e98c" to="1234@zy" from="gxb1@zy/MacdeMacBook-Pro-3"><active xmlns="http://jabber.org/protocol/chatstates"/></message> */- (void)xmppStream:(XMPPStream *)sender didReceiveMessage:(XMPPMessage *)message {    //判斷當前的message標簽是否帶body子標簽    if ([message isChatMessageWithBody]) {        NSString *body = message.body;        //獲取發信息的人的jid        XMPPJID *jidFrom = message.from;                        NSDictionary *messageDic = @{                                     @"fromUser":jidFrom.description,                                     @"text":body                                     };                //通知,發出接收消息的通知        [[NSNotificationCenter defaultCenter] postNotificationName:kRecevieMessageNotification object:nil userInfo:messageDic];            }        }//注冊成功調用的方法- (void)xmppStreamDidRegister:(XMPPStream *)sender {    _connectType = kTypeLogin;    self.loginSuccessBlock = self.registerBlock;    self.registerBlock = nil;    [self xmppStreamDidConnect:sender];}@end

把宏定義改成自己的參數,在相關的UI操作代碼中創建  單例XMPPHelper  然后調用相關方法,并在相關的代理方法中實現必要的操作就可以了。

 


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
欧美激情区在线播放| 欧日韩在线观看| 91精品久久久久久久久中文字幕| 国产亚洲综合久久| 欧美成人四级hd版| 色综合伊人色综合网| 黄色91在线观看| 91九色蝌蚪国产| 尤物九九久久国产精品的分类| 国产精品999| 91成人性视频| 亚洲黄色www网站| 国产亚洲精品久久久优势| 黑人狂躁日本妞一区二区三区| 少妇av一区二区三区| 久久精品夜夜夜夜夜久久| 亚洲精品电影网| 正在播放国产一区| 久热精品在线视频| 一区二区三区亚洲| 性色av一区二区三区免费| 日韩毛片在线观看| 日韩av在线电影网| 国产午夜精品全部视频播放| 亚洲精品v欧美精品v日韩精品| 色综合久久精品亚洲国产| 欧美亚洲另类激情另类| 黄色成人在线播放| 中文字幕亚洲在线| 国语自产精品视频在线看一大j8| 久久97久久97精品免视看| 91免费综合在线| 不卡av电影在线观看| 欧美日韩国产在线| 日本精品性网站在线观看| 18一19gay欧美视频网站| 欧美黑人xxx| 久久福利视频网| 国产精品成人久久久久| 国产成人啪精品视频免费网| 欧美另类高清videos| 亚洲精品xxxx| 黑人狂躁日本妞一区二区三区| 日韩在线视频线视频免费网站| 色哟哟亚洲精品一区二区| 欧美性精品220| 亚洲男女性事视频| 亚洲成人精品在线| 成人欧美一区二区三区黑人| 永久免费精品影视网站| 亚洲国产精品国自产拍av秋霞| 亚洲性夜色噜噜噜7777| 热99精品里视频精品| 国产成人高潮免费观看精品| 爽爽爽爽爽爽爽成人免费观看| 在线精品视频视频中文字幕| 欧美日韩视频在线| 久久精品国产成人| 91色在线视频| 欧美性xxxx极品hd欧美风情| 久久视频免费在线播放| 成人啪啪免费看| 日日噜噜噜夜夜爽亚洲精品| 久久精品一本久久99精品| 国产亚洲欧洲高清一区| 亚洲高清免费观看高清完整版| 日本成人激情视频| 最新亚洲国产精品| 欧美天天综合色影久久精品| 日韩高清免费观看| 久久成人精品电影| 日韩精品免费视频| 欧美做爰性生交视频| 欧美高清视频在线| 亚洲国产精品大全| 97国产真实伦对白精彩视频8| 在线电影欧美日韩一区二区私密| 日韩中文字幕不卡视频| 亚洲成av人乱码色午夜| 精品久久久久久久久久久| 不卡av电影在线观看| 久久久成人的性感天堂| 欧美性色视频在线| 欧美视频在线视频| 日本亚洲欧美三级| 欧美性xxxxxxxxx| 国产精品高清在线观看| 国产精品久久久久久亚洲调教| 国产午夜精品美女视频明星a级| 亚洲男人的天堂在线播放| 91成人国产在线观看| 中文字幕亚洲第一| 欧美大奶子在线| 亚洲欧美日韩天堂一区二区| 久久亚洲精品毛片| 亚洲人成网站在线播| 亚洲va久久久噜噜噜| 亚洲国产精品一区二区久| 国产精品自产拍在线观看中文| 欧美激情中文字幕在线| 韩曰欧美视频免费观看| 国产成人福利网站| 日韩高清电影免费观看完整版| 国产福利精品在线| 欧美在线观看www| 精品久久久久久久久久久| 亚洲精品自拍第一页| 亚洲欧洲成视频免费观看| 555www成人网| 久久激情五月丁香伊人| 日韩精品福利网站| 国产精品啪视频| 美女黄色丝袜一区| 亚洲精品成人久久| 黑人精品xxx一区| 久久香蕉精品香蕉| 国产精品小说在线| 国产不卡av在线| 国产精品成人一区二区三区吃奶| 欧美在线视频免费播放| 国产色婷婷国产综合在线理论片a| 国产视频精品自拍| 在线观看久久av| 自拍偷拍免费精品| 国产精品久久久久一区二区| 日韩免费av在线| 性欧美xxxx| 日韩中文字幕在线视频播放| 中文字幕最新精品| 主播福利视频一区| 亚洲精品第一国产综合精品| 91精品综合久久久久久五月天| 亚洲国产精品va在线看黑人| 日韩欧美中文第一页| 97视频在线观看网址| 日韩精品在线观看一区| 国产精品福利在线| 中文字幕精品在线| 欧美午夜性色大片在线观看| 在线观看91久久久久久| 亚洲国产成人久久| 午夜免费日韩视频| 中文字幕亚洲综合久久| 欧美性猛交99久久久久99按摩| 久久综合免费视频影院| 九九热r在线视频精品| 日日噜噜噜夜夜爽亚洲精品| 欧美制服第一页| 国产视频久久久久| 在线免费观看羞羞视频一区二区| 久久在精品线影院精品国产| 国模吧一区二区三区| 国产女人精品视频| 日韩精品中文字幕在线| 在线日韩第一页| 亚洲精品白浆高清久久久久久| 国产日本欧美一区二区三区在线| 久久久精品久久| 最近中文字幕mv在线一区二区三区四区| 欧美在线视频播放| 亚洲va码欧洲m码| 成人精品网站在线观看| 国外成人在线视频| 国产精品久久久精品|