xmpp实现个人聊天

最近一直相研究下如何用xmpp第三方库写一个实现群组聊天的Demo但苦于没人给指路,所以就从个人聊天开始下手。这里就讲一下个人聊天用xmpp如何实现
第一步、首先导入xmpp第三方库,当然为了能够顺利运行,你需要做的还有为这个库搭建环境,首先在build setting里面搜application   然后添加路径/usr/include/libxml2   然后导入五个系统库 libxml2.dylib   CFnetwork.framework   SystemConfiguration.framework Security.framework 以及 libresolv.dylib   然后就可以运行了 。
关于xmpp最近也搜寻了一些资料   大体上就是说了一些xmpp的一些格式以及一些由来等等   例如其前身是jabber所以会看到jabber ID,JID的地址格式:[node]@[domain]/[resource],其中node是节点,也就是在网路中的实体,即你的用户名,domain是指服务器域名,而resource指的是用户的设备,一个用户可以用多个设备进行登录(同时不同时我就不是很清楚了),其实这个resource一般都不写。最重要的一点   因为是xmpp是通过流传播的,所以在TCP传播中传播的其实就是xml所以在调用方法的时候需要传输的一些可能就是xml格式的东西  
下面是上课的时候一个Demo
首先确定xmpp是通过流进行传播,所以第一步要先创建流。关于 XMPPRoster 我也不是很懂  看英文文档解释的也是比较粗浅  个人觉得这个东西实现的用流应该也可以实现  但是可能会比流的方法要简单一些,可能理解有些偏差。
要想懂得如何实现个人聊天  我觉得首先应该要明确的一点就是理解XMPPStreamDelegate这个代理协议调用方法的意思 以及知道何时调用   知道了这个应该也就理解了这个聊天是怎么用这个三方库实现的

//

//  ViewController.m

//  XMPPDemo

//

//  Created by pk on 14/10/17.

//  Copyright (c) 2014 pk. All rights reserved.

//


#import "ViewController.h"

#import "XMPPFramework.h"


#define HOST @"1000phone.net"


@interface ViewController (){

    IBOutlet UITextField* _nameField;

    IBOutlet UITextField* _passwordField;

    IBOutlet UITextField* _friendField;

    IBOutlet UITextField* _textField;

    XMPPStream* _stream;

    XMPPRoster* _roster;

}


- (IBAction)reg:(id)sender;

- (IBAction)login:(id)sender;

- (IBAction)addFriend:(id)sender;

- (IBAction)sendMessage:(id)sender;

- (IBAction)getFriendList:(id)sender;


@end


@implementation ViewController



- (void)viewDidLoad

{

    [super viewDidLoad];


    //xmpp

    _stream = [[XMPPStream alloc] init];

    //设定服务器

    [_stream setHostName:HOST];

    //添加代理

    [_stream addDelegate:self delegateQueue:dispatch_get_main_queue()];


    //roster

    _roster = [[XMPPRoster alloc] initWithRosterStorage:[[XMPPRosterCoreDataStorage alloc] init]];

    [_roster addDelegate:self delegateQueue:dispatch_get_main_queue()];

    //stream关联

    [_roster activate:_stream];

}


//上线

- (void)goOnline{

    //

    XMPPPresence* presence = [XMPPPresence presence];

    //发送

    [_stream sendElement:presence];

}


//下线

- (void)goOffline{

    //

    XMPPPresence* presence = [XMPPPresence presenceWithType:@"unavailable"];

    [_stream sendElement:presence];

    [_stream disconnect];

}


//注册

- (void)reg:(id)sender{

    //如果现在已经连接,先断开

    if (_stream.isConnected) {

        [self goOffline];

    }

    //设置jid

    [_stream setMyJID:[XMPPJID jidWithString:[NSString stringWithFormat:@"%@@%@", _nameField.text, HOST]]];

    //设置tag

    _stream.tag = @"注册";

    //连接服务器

    [_stream connectWithTimeout:30 error:nil];

}


//登陆

- (void)login:(id)sender{

    //如果连接,断开

    if (_stream.isConnected) {

        [self goOffline];

    }

    //设置登陆jid

    [_stream setMyJID:[XMPPJID jidWithString:[NSString stringWithFormat:@"%@@%@", _nameField.text, HOST]]];

    //tag

    _stream.tag = @"登陆";

    [_stream connectWithTimeout:30 error:nil];

}


//添加好友

- (void)addFriend:(id)sender{

   

    [_roster subscribePresenceToUser:[XMPPJID jidWithString:[NSString stringWithFormat:@"%@@%@", _friendField.text, HOST]]];

}


//得到好友列表

- (void)getFriendList:(id)sender{

   

    XMPPIQ* iq = [XMPPIQ iqWithType:@"get"];

    [iq addAttributeWithName:@"id" stringValue:@"roster"];

    NSXMLElement* query = [NSXMLElement elementWithName:@"query" xmlns:@"jabber:iq:roster"];

    [iq addChild:query];

    [_stream sendElement:iq];

}


//发送消息

- (void)sendMessage:(id)sender{

   

    XMPPMessage* msg = [XMPPMessage messageWithType:@"chat" to:[XMPPJID jidWithString:[NSString stringWithFormat:@"%@@%@", _friendField.text, HOST]]];

    NSXMLElement* body = [NSXMLElement elementWithName:@"body" stringValue:_textField.text];

    [msg addChild:body];

    [_stream sendElement:msg];


}


//连接到服务器

- (void)xmppStreamDidConnect:(XMPPStream *)sender{

    //注册

    if ([sender.tag isEqualToString:@"注册"]) {

        [_stream registerWithPassword:_passwordField.text error:nil];

    }

    //登陆

    if ([sender.tag isEqualToString:@"登陆"]) {

        [_stream authenticateWithPassword:_passwordField.text error:nil];

    }

}


//注册成功

- (void)xmppStreamDidRegister:(XMPPStream *)sender{

    NSLog(@"注册成功");

}

//注册失败

- (void)xmppStream:(XMPPStream *)sender didNotRegister:(DDXMLElement *)error{

    NSLog(@"注册失败");

}


//登陆成功

- (void)xmppStreamDidAuthenticate:(XMPPStream *)sender{

    NSLog(@"登陆成功");

    //上线

    [self goOnline];

}


//登录失败

- (void)xmppStream:(XMPPStream *)sender didNotAuthenticate:(DDXMLElement *)error{

    NSLog(@"登陆失败");

}


//接收到好友请求

- (void)xmppStream:(XMPPStream *)sender didReceivePresence:(XMPPPresence *)presence{

    //同意添加好友,是否也要添加对方为好友

    [_roster acceptPresenceSubscriptionRequestFrom:presence.from andAddToRoster:NO];

}


//得到好友列表

- (BOOL)xmppStream:(XMPPStream *)sender didReceiveIQ:(XMPPIQ *)iq{

   

    for (NSXMLElement* item in iq.childElement.children) {

        NSString* jid = [item attributeStringValueForName:@"jid"];

        NSLog(@"%@", jid);

    }

    

    return YES;

}


//接收到消息

- (void)xmppStream:(XMPPStream *)sender didReceiveMessage:(XMPPMessage *)message{

   

    NSLog(@"%@", message.XMLString);

}




@end


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值