xmpp协议的实现
来源:互联网 发布:网络用语af是什么意思 编辑:程序博客网 时间:2024/05/19 21:16
查了资料发现 现在的聊天服务器有开源的
http://www.cnblogs.com/dyingbleed/archive/2013/05/09/3069145.html
http://blog.csdn.net/ihefe/article/details/8230414
想想其实他的实现方式 还是相对比较简单的 很多都是靠xmpp自己来实现的我们只要在协议方法里面获得数据 其他的我们都不用考虑
实现xmpp
XMPPFramework
网上下的demo要修改几个地方
(以下代码为了方便使用-调用都写在appdeleage里面)
第一步:算是初始化吧
.h里面
- #import
<</span>UIKit/UIKit.h> - #import
"XMPPFramework.h" - @interface
AppDelegate : UIResponder <</span>UIApplicationDelegate> - {
-
// XMPPStream *xmppStream; -
// XMPPRoster *xmppRoster; -
// XMPPRosterCoreDataStorag e *xmppRosterStorage; -
// XMPPReconnect *xmppReconnect; -
// XMPPMessageArchivingCore DataStorage *xmppMessageArchivingCore DataStorage; -
// XMPPMessageArchiving *xmppMessageArchivingModu le; -
-
-
-
XMPPReconnect *xmppReconnect; -
XMPPStream *xmppStream; -
XMPPvCardCoreDataStorage *xmppvCardStorage ; -
XMPPvCardTempModule*xmppvCardTempModule ; -
XMPPvCardAvatarModule* xmppvCardAvatarModule ; -
-
// 初始化 capabilities -
-
-
XMPPCapabilitiesCoreData Storage * xmppCapabilitiesStorage ; -
XMPPCapabilities* xmppCapabilities; -
XMPPRosterCoreDataStorag e* xmppRosterStorage; -
// xmppRosterStorage = [[XMPPRosterCoreDataStorag e alloc] initWithInMemoryStore]; -
BOOL isXmppConnected; -
NSString *password; -
XMPPRoster* xmppRoster ; -
-
XMPPMessageArchivingCore DataStorage *xmppMessageArchivingCore DataStorage; -
XMPPMessageArchiving *xmppMessageArchivingModu le; -
-
BOOL allowSelfSignedCertifica tes; -
BOOL allowSSLHostNameMismatch ; - }
- //---------------------------------------------------------------------
- @property
(nonatomic, strong) XMPPStream *xmppStream; - @property
(nonatomic, strong) XMPPRosterCoreDataStorag e *xmppRosterStorage; - @property
(nonatomic, strong) XMPPRoster *xmppRoster; - @property
(nonatomic, strong) XMPPReconnect *xmppReconnect; - @property
(nonatomic, strong) XMPPMessageArchivingCore DataStorage *xmppMessageArchivingCore DataStorage; - @property
(nonatomic, strong) XMPPMessageArchiving *xmppMessageArchivingModu le; - @property
(strong, nonatomic) UIWindow *window; - -
(BOOL)connect:(NSString *)loginName; - -(void)showAlertView:(NSString
*)message; -
- @property
(nonatomic, strong) NSMutableArray *friendArray; - @end
.m里面
- -
(BOOL)application:(UIApplication *)application didFinishLaunchingWithOp tions:(NSDictionary *)launchOptions - {
-
[self setupStream]; -
return YES; - }
- -
(void)setupStream - {
-
NSAssert(xmppStream == nil, @"Method setupStream invoked multiple times"); -
-
// 初始化XmppStream -
-
xmppStream = [[XMPPStream alloc] init]; -
- #if
!TARGET_IPHONE_SIMULATOR -
{ -
// 想要xampp在后台也能运行? -
// -
// P.S. - 虚拟机不支持后台 -
-
xmppStream.enableBackgroundingOnSoc ket = YES; -
} - #endif
-
-
// 初始化 reconnect -
// -
// 这东西可以帮你把意外断开的状态连接回去...具体看它的头文件定义 -
-
xmppReconnect = [[XMPPReconnect alloc] init]; -
-
// 初始化 roster -
-
xmppRosterStorage = [[XMPPRosterCoreDataStorag e alloc] init]; -
// xmppRosterStorage = [[XMPPRosterCoreDataStorag e alloc] initWithInMemoryStore]; -
-
xmppRoster = [[XMPPRoster alloc] initWithRosterStorage:xmppRosterStorage]; -
-
xmppRoster.autoFetchRoster = YES; -
xmppRoster.autoAcceptKnownPresenceS ubscriptionRequests = YES; -
-
// 初始化 vCard support -
-
xmppvCardStorage = [XMPPvCardCoreDataStorage sharedInstance]; -
xmppvCardTempModule = [[XMPPvCardTempModule alloc] initWithvCardStorage:xmppvCardStorage]; -
-
xmppvCardAvatarModule = [[XMPPvCardAvatarModule alloc] initWithvCardTempModule:xmppvCardTempModule]; -
-
// 初始化 capabilities -
-
-
xmppCapabilitiesStorage = [XMPPCapabilitiesCoreData Storage sharedInstance]; -
xmppCapabilities = [[XMPPCapabilities alloc] initWithCapabilitiesStor age:xmppCapabilitiesStorage]; -
-
xmppCapabilities.autoFetchHashedCapabilit ies = YES; -
xmppCapabilities.autoFetchNonHashedCapabi lities = NO; -
-
// 激活xmpp的模块 -
-
[xmppReconnect activate:xmppStream]; -
[xmppRoster activate:xmppStream]; -
[xmppvCardTempModule activate:xmppStream]; -
[xmppvCardAvatarModule activate:xmppStream]; -
[xmppCapabilities activate:xmppStream]; -
-
// 我们可以加添加委托来获取我们感兴趣的东西 -
-
[xmppStream addDelegate:self delegateQueue:dispatch_get_main_queue()]; -
[xmppRoster addDelegate:self delegateQueue:dispatch_get_main_queue()]; -
-
// 下面可以替换成自己的域名和端口 -
-
// 如果你没有提供一个地址,JID也是一样可以代替的,JID的格式类似这样"用户名@域名/roster",框架会自动抓取域名作为你的地址 -
-
// 如果没有设置特殊的端口,默认为5222 -
-
[xmppStream setHostName:@"223.4.32.64"];//AY130618164649Z -
[xmppStream setHostPort:5222]; -
-
-
//下面这两个根据你自己配置需要来设置 -
allowSelfSignedCertifica tes = NO; -
allowSSLHostNameMismatch = NO; - }
//连接到openfire
- (BOOL)connect:(NSString
}
以下是主要的一些会使用到的方法- //将要连接
- -
(void)xmppStreamWillConnect:(XMPPStream *)sender - {
-
NSLog(@"xmppStreamWillConnect"); - }
- //已经连接
- -
(void)xmppStreamDidConnect:(XMPPStream *)sender - {
-
NSLog(@"xmppStreamDidConnect"); -
NSError *error ; -
if (![self.xmppStream authenticateWithPassword :@"123" error:&error]) { //密码跟 abc@127.0.0.1 的密码对应 -
NSLog(@"error authenticate : %@",error.description); -
} - }
-
- //注册
- -
(void)xmppStreamDidRegister:(XMPPStream *)sender - {
-
NSLog(@"xmppStreamDidRegister"); -
-
NSError *error ; -
if (![self.xmppStream authenticateWithPassword :@"123" error:&error]) { -
NSLog(@"error authenticate : %@",error.description); -
} - }
- -(void)goOnline{
-
-
//发送在线状态 -
XMPPPresence *presence = [XMPPPresence presence]; -
[[self xmppStream] sendElement:presence]; -
- }
- -
(void)goOffline - {
-
XMPPPresence *presence = [XMPPPresence presenceWithType:@"unavailable"]; -
-
[[self xmppStream] sendElement:presence]; - }
-
- -
(void)xmppStream:(XMPPStream *)sender didNotRegister:(NSXMLElement *)error - {
-
[self showAlertView:@"当前用户已经存在"]; - }
- //上线
- -
(void)xmppStreamDidAuthenticat e:(XMPPStream *)sender - {
-
[self goOnline]; - }
- -
(void)xmppStream:(XMPPStream *)sender didNotAuthenticate:(NSXMLElement *)error - {
-
NSLog(@"didNotAuthenticate:%@",error.description); - }
- -
(NSString *)xmppStream:(XMPPStream *)sender alternativeResourceForCo nflictingResource:(NSString *)conflictingResource - {
-
NSLog(@"alternativeResourceForCo nflictingResource: %@",conflictingResource); -
return @"XMPPIOS"; - }
- //获取到好友列表
- -
(BOOL)xmppStream:(XMPPStream *)sender didReceiveIQ:(XMPPIQ *)iq - {
-
NSString *str=@""; -
self.friendArray =[[NSMutableArray alloc] init]; - //
NSLog(@"获取到好友列表didReceiveIQ: %@",iq.description); -
if ([@"result" isEqualToString:iq.type]) { -
NSXMLElement *query = iq.childElement; -
if ([@"query" isEqualToString:query.name]) { -
NSArray *items = [query children]; -
for (NSXMLElement *item in items) { -
NSString *jid = [item attributeStringValueForN ame:@"jid"]; -
XMPPJID *xmppJID = [XMPPJID jidWithString:jid]; -
NSLog(@"好友:%@",xmppJID); -
str = [NSString stringWithFormat:@"%@\n%@",str,xmppJID]; -
[self.friendArray addObject:[NSString stringWithFormat:@"%@",xmppJID]]; -
} -
//通知 -
[[NSNotificationCenter defaultCenter] postNotificationName:@"user" object:nil userInfo:[NSDictionary dictionaryWithObject:self.friendArray forKey:@"userlist"]]; -
} -
} -
-
return YES; - }
- //收到信息
- -
(void)xmppStream:(XMPPStream *)sender didReceiveMessage:(XMPPMessage *)message - {
-
NSString *msg = [[message elementForName:@"body"] stringValue]; -
NSString *from = [[message attributeForName:@"from"] stringValue]; -
NSLog(@"消息内容:\n%@ 信息来源:\n%@ ",msg,from); -
NSString *str = [NSString stringWithFormat:@"消息内容:\n%@ 信息来源:\n%@ ",msg,from]; -
UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"好友" message:str delegate:nil cancelButtonTitle:@"ok" otherButtonTitles:nil, nil]; -
[alert show]; -
[[NSNotificationCenter defaultCenter] postNotificationName:@"userMSG" object:nil userInfo:[NSDictionary dictionaryWithObject:str forKey:@"MSG"]]; - }
- //获取好友状态,通过实现
- //available
上线 - //away
离开 - //do
not disturb 忙碌 - //unavailable
下线 - -
(void)xmppStream:(XMPPStream *)sender didReceivePresence:(XMPPPresence *)presence - {
-
//取得好友状态 -
NSString *presenceType = [presence type]; //online/offline -
//当前用户 -
// NSString *userId = [[sender myJID] user]; -
//在线用户 -
NSString *presenceFromUser = [[presence from] user]; -
-
NSLog(@"状态:%@ 帐号:%@",presenceType,presenceFromUser); - }
- (void)xmppStream:(XMPPStream *)senderdidReceivePresence:(XMPPPresence *)presence
这个协议方法是获取好友的状态的我发现 只有注册注意点
//获取appdelegate的连接方法
- (AppDelegate
{
return
}
- (IBAction)RegAction:(id)sender {
}
- (IBAction)connectAction:(id)sender{
}
添加好友的代码
//添加好友
- (IBAction)AddAction:(id)sender {
}
//AY130618164649Z- xmpp协议的实现
- xmpp协议的实现
- 基于XMPP协议的IOS实现(二)XMPP解析
- iOS客户端实现 XMPP协议的步骤
- iOS 实现XMPP协议
- XMPP协议实现原理
- 【XMPP协议】XMPP协议的原理介绍
- XMPP的协议
- XMPP协议的基础知识
- xmpp协议的使用
- XMPP协议的原理
- XMPP协议的原理
- XMPP协议的原理
- XMPP协议的原理
- 基于XMPP协议的即时通讯工具的客户端实现原理
- 基于XMPP协议的即时通讯工具的客户端实现原理
- 基于XMPP协议的即时通讯工具的服务器端实现
- XMPP协议实现原理介绍
- iOS面试问题
- 进程与线程的区别和联系
- (转)SOCKET通信(入门)
- Socket原理与编程基础
- #include、#import与class之间的区…
- xmpp协议的实现
- POJ题目分类
- XMPP个人觉得解释还凑合,可以看看…
- 初识xmpp笔记
- 开发经验小结
- 通过代码自定义cell(cell高度不同…
- iOS常用的注释方法
- C++中引用
- C# 带滚动条的Label控件