Xcode7 如何xcode怎么导入框架XMPPframework框架

这两天由于会用到framework所以研究了一下framework的制作,我用到了xcode6.1、AFNetworing。
转载请注明http://blog.csdn.net/mengxiangyue 废话不多说了,下面是步骤: 1 建立一个single view application工程,然后打开工程中的Main.storyboard,选中里面的唯一一个ViewController,点击菜单栏的Editor-&embed in-&navigation Controller(嵌入这个navigation controller只是为了测试需要,并不是必须的)。 2 点击工程,在targets项目点击左下角的加号,如下图(下图中的TTTTTTT是我已经添加的Framework):
会出现如下的图,选择Cocoa Touch Framework
选择next后,输入对应的framework的名字,到这里就创建好了这个framework的工程。 3 引入AFNetWorking,将AFNetWorking拖到项目中,会出现如下的图,选择好Finish导入成功。
在创建的Framework上面点击右键,new File--&Coco Touch Class,创建一个Objective-C的类XYTestViewController,类的内容如下:(这个类只是简单的演示,里面引用了AFnetworking) #import &UIKit/UIKit.h&#import &AFNetworking.h&@interface XYTestViewController : UIViewController@end.m文件#import &XYTestViewController.h&@interface XYTestViewController ()@end@implementation XYTestViewController- (void)viewDidLoad { [super viewDidLoad]; NSLog(@&进入框架内博&); self.view.backgroundColor = [UIColor whiteColor];
UIButton *button = [[UIButton alloc] initWithFrame:CGRectMake(100, 100, 200, 60)]; [button setTitle:@&点击& forState:UIControlStateNormal]; [button setTitleColor:[UIColor blackColor] forState:UIControlStateNormal]; [button addTarget:self action:@selector(click:) forControlEvents:UIControlEventTouchUpInside]; [self.view addSubview:button]; }- (void)click:(UIButton*)sender { NSLog(@&点击&); AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager]; manager.responseSerializer = [AFHTTPResponseSerializer serializer]; AFHTTPRequestOperation *option1 =[manager GET:@&& parameters:nil success:^(AFHTTPRequestOperation *operation, id responseObject) {
NSLog(@&xxxxxxxxxxxx----%@&, responseObject); } failure:^(AFHTTPRequestOperation *operation, NSError *error) { }]; }- (void)didReceiveMemoryWarning { [super didReceiveMemoryWarning]; // Dispose of any resources that can be recreated.}/*#pragma mark - Navigation// In a storyboard-based application, you will often want to do a little preparation before navigation- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender { // Get the new view controller using [segue destinationViewController]. // Pass the selected object to the new view controller.}*/@end5 测试修改工程内的ViewController类,修改后的内容如下: #import &UIKit/UIKit.h&#import &XYTestViewController.h&@interface ViewController : UIViewController@end.m文件////ViewController.m//sssssssssss////Created by mxy on 14-11-11.//Copyright (c) 2014年 mxy. All rights reserved.//#import &ViewController.h&@interface ViewController ()@end@implementation ViewController- (void)viewDidLoad { [super viewDidLoad]; UIButton *button = [[UIButton alloc] initWithFrame:CGRectMake(100, 100, 200, 60)]; [button setTitle:@&进入下一个VC& forState:UIControlStateNormal]; [button setTitleColor:[UIColor blackColor] forState:UIControlStateNormal]; [button addTarget:self action:@selector(click:) forControlEvents:UIControlEventTouchUpInside]; [self.view addSubview:button]; }- (void)click:(UIButton*)sender { NSLog(@&进入下一个VC&); XYTestViewController *testVC = [[XYTestViewController alloc] init]; [self.navigationController pushViewController:testVC animated:YES];}- (void)didReceiveMemoryWarning { [super didReceiveMemoryWarning]; // Dispose of any resources that can be recreated.}@end点击运行看看能否正常运行,如果能正常运行就没问题了,然后就能进行下一步了。 在运行的过程中其实我们已经生成了framework,点击项目中的products,能够看到已经生成的framework,右键show In Finder,能够看到我们生成的framework。在其上级目录会出现四个文件夹:Debug-iphoneos、Debug-iphonesimulator、Release-iphoneos、Release-iphonesimulator,分别对应不同情况下使用的framework。 下面图片中的1、2选择不同,然后commond+b编译出来的framework是不同的: 1 framework框架 2 iPhone模拟器 scheme debug 会编译出Debug-iphonesimulator 1 framework框架 2 IOS Device &scheme debug 会编译出Debug-iphoneos 1 framework框架 2 iPhone模拟器 scheme Release 会编译出Release-iphonesimulator 1 framework框架 2 IOS Device &scheme Release 会编译出Release-iphoneos
设置对外公开的api,如下图:
另外新建一个工程,将合适的framework导入到工程内,编写代码使用,由于framework中使用到了AFNetworking,但是并没有将其打包到Framework中,所以新建的工程需要自己手动导入一个framework。如果在代码中遇到如下错误:
dyld: Library not loaded: @rpath/TTTTTTTT.framework/TTTTTTTT Referenced from: /Users/mxy/Library/Developer/CoreSimulator/Devices/72AF601F-3B90-4720-ACB0-E98EE7FD26FE/data/Containers/Bundle/Application/5B492415-EB7E-C/testFFFFFF.app/testFFFFFF Reason: image not found
上面这个错误我个人理解,是工程编译的过程中没有找到我们自己写的framework。在工程的buildsetting中搜索runpath search paths,添加$(SRCROOT),然后运行正常。终于写完了,欢迎拍砖。3453人阅读
本文主要说的是ios客户端。服务端的默认已经构建好。//主要的关键是:
//-(void)xmppRoom:(XMPPRoom *)sender didReceiveMessage:(XMPPMessage *)message fromOccupant:(XMPPJID *)occupantJID
//接收到消息
//在该方法中调用代理方法
//-(void)newMessageReceived:(NSDictionary *)message
1、下载xmppframework(googol一下就出来了)
2、导入到你的工程(参照github)
3、在AppDelegate中实现xmpp代理
& (1)、初始化XMPPStream
-(void)setupStream{
//初始化XMPPStream
xmppStream = [[XMPPStream alloc] init];
[xmppStream addDelegate:self delegateQueue:dispatch_get_main_queue()];
xmppPing = [[XMPPPing alloc]init];
xmppPing.respondsToQueries = YES;
[xmppPing activate:xmppStream];
xmppReconnect = [[XMPPReconnect alloc]init];
xmppReconnect.autoReconnect = YES;
[xmppReconnect activate:xmppStream];
(3)、登录xmpp消息服务器
//登录XMPP服务器
-(BOOL)login:(NSString*)userid code:(NSString*)passcode{
[self setupStream];
if (![xmppStream isDisconnected]) {
[self.chatDelegate didConnect];
return YES;
NSString *server = ChatH
//设置用户
NSString *userId = [NSString stringWithFormat:@&%@@%@&,userid,server];
XMPPJID *jid = [XMPPJID jidWithString:userId];
[xmppStream setMyJID:jid];
//设置服务器
[xmppStream setHostName:server];
password =
NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
[defaults setObject:userid forKey:USER];
[defaults setObject:passcode forKey:PSW];
//连接服务器
NSError *error =
if(![xmppStream connectWithTimeout:XMPPStreamTimeoutNone error:&error]){
NSLog(@&cant connect %@&, server);
return NO;
return YES;
& (2)、初始化聊天室
-(void)initxmpproom{
[self getrooms];
xmppRoomStorage
= [XMPPRoomCoreDataStorage sharedInstance];
XMPPJID *roomJID = [XMPPJID jidWithString:CHATROOM];
xmppRoom = [[XMPPRoom alloc] initWithRoomStorage:xmppRoomStorage jid:roomJID];
[xmppRoom activate:xmppStream];
[xmppRoom addDelegate:self delegateQueue:dispatch_get_main_queue()];
//加入房间
[self joinroom];
(3)、加入房间
-(void)joinroom{
NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
[xmppRoom joinRoomUsingNickname:[defaults stringForKey:USER] history:nil];
(4)、有人在群里发言(实现代理方法)
-(void)xmppRoom:(XMPPRoom *)sender didReceiveMessage:(XMPPMessage *)message fromOccupant:(XMPPJID *)occupantJID{
NSLog(@&群发言了。。。。&);
NSString *type = [[message attributeForName:@&type&] stringValue];
if ([type isEqualToString:@&groupchat&]) {
NSString *msg = [[message elementForName:@&body&] stringValue];
NSString *timexx = [[timex attributeForName:@&stamp&] stringValue];
NSString *from = [[message attributeForName:@&from&] stringValue];
NSMutableDictionary *dict = [NSMutableDictionary dictionary];
[dict setObject:msg forKey:@&body&];
[dict setObject:from forKey:@&from&];
//消息委托
[messageDelegate newMessageReceived:dict];
(5)、新人加入群聊
- (void)xmppRoom:(XMPPRoom *)sender occupantDidJoin:(XMPPJID *)occupantJID
NSLog(@&新人加入群聊&);
(6)、有人退出群聊
- (void)xmppRoom:(XMPPRoom *)sender occupantDidLeave:(XMPPJID *)occupantJID
NSLog(@&有人退出群聊&);
(7)、发送新的群聊消息
//发送群消息
- (IBAction)sendPress:(UIButton *)sender {
//本地输入框中的信息
NSString *message = self.sendtextfield.
self.sendtextfield.text = @&&;
[self.sendtextfield resignFirstResponder];
if (message.length & 0){
NSXMLElement *body = [NSXMLElement elementWithName:@&body&];
[body setStringValue:message];
//生成XML消息文档
NSXMLElement *mes = [NSXMLElement elementWithName:@&message&];
//消息类型
[mes addAttributeWithName:@&type& stringValue:@&groupchat&];
//发送给谁
[mes addAttributeWithName:@&to& stringValue:CHATROOM];
//由谁发送
NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
[mes addAttributeWithName:@&from& stringValue:[NSString stringWithFormat:@&%@/%@&,CHATROOM,[defaults stringForKey:USER]]];
[mes addChild:body];
//发送消息
[[app xmppStream] sendElement:mes];
-(void)newMessageReceived:(NSDictionary *)messageContent{
[arr1 addObject:messageContent];
[self.tableview1 reloadData];
if (self.tableview1.contentSize.height & self.tableview1.frame.size.height) {
[self.tableview1 setContentOffset:CGPointMake(0, self.tableview1.contentSize.height - self.tableview1.frame.size.height)];
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:4581次
排名:千里之外
评论:10条iOS的xmppframework简介
iOS的xmppframework简介
1登录和好友上下线
1.1XMPP中常用对象们
XMPPStream:xmpp基础服务类
XMPPRoster:好友列表类
XMPPRosterCoreDataStorage:好友列表(用户账号)在core data中的操作类
XMPPvCardCoreDataStorage:好友名片(昵称,签名,性别,年龄等信息)在core data中的操作类
XMPPvCardTemp:好友名片实体类,从数据库里取出来的都是它
xmppvCardAvatarModule:好友头像
XMPPReconnect:如果失去连接,自动重连
XMPPRoom:提供多用户聊天支持
XMPPPubSub:发布订阅
1.2登录操作,也就是连接xmpp服务器
- (void)connect {
if (self.xmppStream == nil) {
self.xmppStream = [[XMPPStream alloc] init];
[self.xmppStream addDelegate:self delegateQueue:dispatch_get_main_queue()];
if (![self.xmppStream isConnected]) {
NSString *username = [[NSUserDefaults standardUserDefaults] objectForKey:@"username"];
XMPPJID *jid = [XMPPJID jidWithUser:username domain:@"lizhen" resource:@"Ework"];
[self.xmppStream setMyJID:jid];
[self.xmppStream setHostName:@"10.4.125.113"];
NSError *error =
if (![self.xmppStream connect:&error]) {
NSLog(@"Connect Error: %@", [[error userInfo] description]);
connect成功之后
会依次调用XMPPStreamDelegate的方法,
- (void)xmppStream:(XMPPStream *)sender socketDidConnect:(GCDAsyncSocket *)socket
- (void)xmppStreamDidConnect:(XMPPStream *)sender
在该方法下面需要使用xmppStream 的authenticateWithPassword方法进行密码验证,成功的话会响应delegate的方法,就是下面这个
- (void)xmppStreamDidAuthenticate:(XMPPStream *)sender
实现 - (void)xmppStreamDidAuthenticate:(XMPPStream *)sender 委托方法
- (void)xmppStreamDidAuthenticate:(XMPPStream *)sender {
XMPPPresence *presence = [XMPPPresence presenceWithType:@"available"];
[self.xmppStream sendElement:presence];
1.4退出并断开连接
- (void)disconnect {
XMPPPresence *presence = [XMPPPresence presenceWithType:@"unavailable"];
[self.xmppStream sendElement:presence];
[self.xmppStream disconnect];
1.5好友状态
获取好友状态,通过实现
- (void)xmppStream:(XMPPStream *)sender didReceivePresence:(XMPPPresence *)presence
当接收到 &presence /& 标签的内容时,XMPPFramework 框架回调该方法
一个 &presence /& 标签的格式一般如下:
&presence from=""&
  &show&这里是显示的内容&show /&
  &status&这里是显示的状态&status /&
&presence /&
presence 的状态:
available 上线
do not disturb 忙碌
unavailable 下线
- (void)xmppStream:(XMPPStream *)sender didReceivePresence:(XMPPPresence *)presence {
NSString *presenceType = [presence type];
NSString *presenceFromUser = [[presence from] user];
if (![presenceFromUser isEqualToString:[[sender myJID] user]]) {
if ([presenceType isEqualToString:@"available"]) {
} else if ([presenceType isEqualToString:@"unavailable"]) {
2接收消息和发送消息
2.1接收消息
- (void)xmppStream:(XMPPStream *)sender didReceiveMessage:(XMPPMessage *)
当接收到 &message /& 标签的内容时,XMPPFramework 框架回调该方法
根据 XMPP 协议,消息体的内容存储在标签 &body /& 内
- (void)xmppStream:(XMPPStream *)sender didReceiveMessage:(XMPPMessage *)message {
NSString *messageBody = [[message elementForName:@"body"] stringValue];
2.2发送消息
发送消息,我们需要根据 XMPP 协议,将数据放到 &message /& 标签内,例如:
&message type="chat" to=""&
  &body&Hello World!&body /&
&message /&
- (void)sendMessage:(NSString *) message toUser:(NSString *) user {
NSXMLElement *body = [NSXMLElement elementWithName:@"body"];
[body setStringValue:message];
NSXMLElement *message = [NSXMLElement elementWithName:@"message"];
[message addAttributeWithName:@"type" stringValue:@"chat"];
NSString *to = [NSString stringWithFormat:@"%@@", user];
[message addAttributeWithName:@"to" stringValue:to];
[message addChild:body];
[self.xmppStream sendElement:message];
3获取好友信息和删除好友
3.1好友列表和好友名片
[_xmppRoster fetchRoster];//获取好友列表
//获取到一个好友节点
- (void)xmppRoster:(XMPPRoster *)sender didRecieveRosterItem:(NSXMLElement *)item
//获取完好友列表
- (void)xmppRosterDidEndPopulating:(XMPPRoster *)sender
//到服务器上请求联系人名片信息
- (void)fetchvCardTempForJID:(XMPPJID *)
//请求联系人的名片,如果数据库有就不请求,没有就发送名片请求
- (void)fetchvCardTempForJID:(XMPPJID *)jid ignoreStorage:(BOOL)ignoreS
//获取联系人的名片,如果数据库有就返回,没有返回空,并到服务器上抓取
- (XMPPvCardTemp *)vCardTempForJID:(XMPPJID *)jid shouldFetch:(BOOL)shouldF
//更新自己的名片信息
- (void)updateMyvCardTemp:(XMPPvCardTemp *)vCardT
//获取到一盒联系人的名片信息的回调
- (void)xmppvCardTempModule:(XMPPvCardTempModule *)vCardTempModule
didReceivevCardTemp:(XMPPvCardTemp *)vCardTemp
forJID:(XMPPJID *)jid
3.2添加好友
//name为用户账号
- (void)XMPPAddFriendSubscribe:(NSString *)name
//XMPPHOST 就是服务器名,
XMPPJID *jid = [XMPPJID jidWithString:[NSString stringWithFormat:@"%@@%@",name,XMPPHOST]];
//[presence addAttributeWithName:@"subscription" stringValue:@"好友"];
[xmppRoster subscribePresenceToUser:jid];
3.3收到添加好友的请求
- (void)xmppRoster:(XMPPRoster *)sender didReceivePresenceSubscriptionRequest:(XMPPPresence *)presence
//取得好友状态
NSString *presenceType = [NSString stringWithFormat:@"%@", [presence type]]; //online/offline
//请求的用户
NSString *presenceFromUser =[NSString stringWithFormat:@"%@", [[presence from] user]];
NSLog(@"presenceType:%@",presenceType);
NSLog(@"presence2:%@
sender2:%@",presence,sender);
XMPPJID *jid = [XMPPJID jidWithString:presenceFromUser];
//接收添加好友请求
[xmppRoster acceptPresenceSubscriptionRequestFrom:jid andAddToRoster:YES];
3.4删除好友
//删除好友,name为好友账号
- (void)removeBuddy:(NSString *)name
XMPPJID *jid = [XMPPJID jidWithString:[NSString stringWithFormat:@"%@@%@",name,XMPPHOST]];
[self xmppRoster] removeUser:jid];
//初始化聊天室
XMPPJID *roomJID = [XMPPJID jidWithString:ROOM_JID];
xmppRoom = [[XMPPRoom alloc] initWithRoomStorage:self jid:roomJID];
[xmppRoom activate:xmppStream];
[xmppRoom addDelegate:self delegateQueue:dispatch_get_main_queue()];
//创建聊天室成功
- (void)xmppRoomDidCreate:(XMPPRoom *)sender
DDLogInfo(@"%@: %@", THIS_FILE, THIS_METHOD);
//加入聊天室,使用昵称
[xmppRoom joinRoomUsingNickname:@"quack" history:nil];
//获取聊天室信息
- (void)xmppRoomDidJoin:(XMPPRoom *)sender
[xmppRoom fetchConfigurationForm];
[xmppRoom fetchBanList];
[xmppRoom fetchMembersList];
[xmppRoom fetchModeratorsList];
如果房间存在,会调用委托
// 收到禁止名单列表
- (void)xmppRoom:(XMPPRoom *)sender didFetchBanList:(NSArray *)
// 收到好友名单列表
- (void)xmppRoom:(XMPPRoom *)sender didFetchMembersList:(NSArray *)
// 收到主持人名单列表
- (void)xmppRoom:(XMPPRoom *)sender didFetchModeratorsList:(NSArray *)
房间不存在,调用委托
- (void)xmppRoom:(XMPPRoom *)sender didNotFetchBanList:(XMPPIQ *)iqE
- (void)xmppRoom:(XMPPRoom *)sender didNotFetchMembersList:(XMPPIQ *)iqE
- (void)xmppRoom:(XMPPRoom *)sender didNotFetchModeratorsList:(XMPPIQ *)iqE
[xmppRoom deactivate:xmppStream];
XMPPRoomDelegate的其他代理方法
//离开聊天室
- (void)xmppRoomDidLeave:(XMPPRoom *)sender
DDLogVerbose(@"%@: %@", THIS_FILE, THIS_METHOD);
//新人加入群聊
- (void)xmppRoom:(XMPPRoom *)sender occupantDidJoin:(XMPPJID *)occupantJID
DDLogVerbose(@"%@: %@", THIS_FILE, THIS_METHOD);
//有人退出群聊
- (void)xmppRoom:(XMPPRoom *)sender occupantDidLeave:(XMPPJID *)occupantJID
DDLogVerbose(@"%@: %@", THIS_FILE, THIS_METHOD);
//有人在群里发言
- (void)xmppRoom:(XMPPRoom *)sender didReceiveMessage:(XMPPMessage *)message fromOccupant:(XMPPJID *)occupantJID
DDLogVerbose(@"%@: %@", THIS_FILE, THIS_METHOD);
这个是XEP-0184协议的内容
协议内容:
发送消息时附加回执请求
from='northumberland@shakespeare.lit/westminster'
id='richard2-4.1.247'
to='kingrichard@royalty.england.lit/throne'&
&body&My lord, read o'er these articles.&/body&
&request xmlns='urn:xmpp:receipts'/&
&/message&
NSString *siID = [XMPPStream generateUUID];
//发送消息
XMPPMessage *message = [XMPPMessage messageWithType:@"chat" to:jid elementID:siID];
NSXMLElement *receipt = [NSXMLElement elementWithName:@"request" xmlns:@"urn:xmpp:receipts"];
[message addChild:receipt];
[message addBody:@"测试"];
[self.xmppStream sendElement:message];
收到回执请求的消息,发送回执
from='kingrichard@royalty.england.lit/throne'
id='bi29sg183b4v'
to='northumberland@shakespeare.lit/westminster'&
&received xmlns='urn:xmpp:receipts' id='richard2-4.1.247'/&
&/message&
- (void)xmppStream:(XMPPStream *)sender didReceiveMessage:(XMPPMessage *)message
//回执判断
NSXMLElement *request = [message elementForName:@"request"];
if (request)
if ([request.xmlns isEqualToString:@"urn:xmpp:receipts"])//消息回执
//组装消息回执
XMPPMessage *msg = [XMPPMessage messageWithType:[message attributeStringValueForName:@"type"] to:message.from elementID:[message attributeStringValueForName:@"id"]];
NSXMLElement *recieved = [NSXMLElement elementWithName:@"received" xmlns:@"urn:xmpp:receipts"];
[msg addChild:recieved];
//发送回执
[self.xmppStream sendElement:msg];
NSXMLElement *received = [message elementForName:@"received"];
if (received)
if ([received.xmlns isEqualToString:@"urn:xmpp:receipts"])//消息回执
//发送成功
NSLog(@"message send success!");
//消息处理
6添加AutoPing
为了监听服务器是否有效,增加心跳监听。用XEP-0199协议,在XMPPFrameWork框架下,封装了 XMPPAutoPing 和 XMPPPing两个类都可以使用,因为XMPPAutoPing已经组合进了XMPPPing类,所以XMPPAutoPing使用起来更方便。
//初始化并启动ping
-(void)autoPingProxyServer:(NSString*)strProxyServer
_xmppAutoPing = [[XMPPAutoPingalloc] init];
[_xmppAutoPingactivate:_xmppStream];
[_xmppAutoPingaddDelegate:selfdelegateQueue:
dispatch_get_main_queue()];
_xmppAutoPing.respondsToQueries = YES;
_xmppAutoPing.pingInterval=2;//ping 间隔时间
if (nil != strProxyServer)
_xmppAutoPing.targetJID = [XMPPJID jidWithString: strProxyServer ];//设置ping目标服务器,如果为nil,则监听socketstream当前连接上的那个服务器
//卸载监听
[_xmppAutoPing
deactivate];
[_xmppAutoPing
removeDelegate:self];
_xmppAutoPing =
//ping XMPPAutoPingDelegate的委托方法:
- (void)xmppAutoPingDidSendPing:(XMPPAutoPing *)sender
NSLog(@"- (void)xmppAutoPingDidSendPing:(XMPPAutoPing *)sender");
- (void)xmppAutoPingDidReceivePong:(XMPPAutoPing *)sender
NSLog(@"- (void)xmppAutoPingDidReceivePong:(XMPPAutoPing *)sender");
- (void)xmppAutoPingDidTimeout:(XMPPAutoPing *)sender
NSLog(@"- (void)xmppAutoPingDidTimeout:(XMPPAutoPing *)sender");
如果您想提高自己的技术水平,认识同行朋友、开拓技术视野,请加入QQ群:
Powered by
& 2014 &&&联系本站:在应用中集成XMPPFramework - 简书
下载简书移动应用
写了10859字,被4人关注,获得了6个喜欢
在应用中集成XMPPFramework
由于刚刚做完一个即时通信的小功能,故写此文记录一下 可扩展通讯和表示协议在iOS应用里集成即时聊天功能,可以使用开源框架,或者也可以使用各种第三方的SDK,比如融云,环信等等1.下载好XMPPFramework,将如下的5个文件夹拖进你的项目中
2.由于在该框架中使用KissXml解析XML数据,所以还需要在项目中添加libxml2.a、libresolv.a两个静态库
3.之后在build setting中这是header search path
4.这样XMPPFramework框架就添加完毕了,编译运行一下
5.接下来的下载一个支持XMPP服务器,Openfire或者Ejabberd都是可以的,我选择的是Openfire服务器,下载好安装包之后双击直接安装即可openfire下载地址:openfire的配置
6.服务器配置完毕,接下来就要写代码了,实现XMPPFramework的一些代理方法和我自己写的方法
//是否连接
//断开连接
//设置xmppStream
-(void)setupS
-(void)goO
-(void)goO
-(void)connect {
[selfsetupStream];
[xmppStreamsetMyJID:[XMPPJIDjidWithString:MyUserId]];
[xmppStreamsetHostName:serverDoamin];
[xmppStreamsetHostPort:portNum];
NSError* error =
if(![xmppStreamconnectWithTimeout:10error:&error]) {
NSLog(@"can not connect to %@",serverDoamin);
-(void)disconnect {
[xmppStreamdisconnect];
[selfgoOffline];
-(void)goOnline {
XMPPPresence* presence = [XMPPPresencepresence];
[xmppStreamsendElement:presence];//当前用户上线,获取好友列表
-(void)goOffline {
XMPPPresence*presence = [XMPPPresencepresenceWithType:@"unavailable"];
[xmppStreamsendElement:presence];
-(void)setupStream {
xmppStream= [[XMPPStreamalloc]init];
[xmppStreamaddDelegate:selfdelegateQueue:dispatch_get_current_queue()];
以上只是设置xmppstream对象,连接xmpp服务器的一些操作接下来就要实现XMPPFramework中的代理方法了如果连接服务器成功则会调用该代理方法
//连接服务器成功
-(void)xmppStreamDidConnect:(XMPPStream*)sender {
NSError* error =
[xmppStreamauthenticateWithPassword:@"123123"error:&error];
//验证当前用户名和密码
-(void)xmppStreamDidAuthenticate:(XMPPStream*)sender {
//验证通过
[selfgoOnline];//上线获取到好友列表,可以发送消息
用户登录成功之后接收到新消息后触发该代理方法,在这里解析消息体并更新UI,提示显示新消息
//收到消息
-(void)xmppStream:(XMPPStream*)sender didReceiveMessage:(XMPPMessage*)message {
NSString *idStr = [[message attributeForName:@"id"] stringValue];
NSString *msg = [[message elementForName:@"body"] stringValue];
NSString *from = [[message attributeForName:@"from"] stringValue];
NSString *strTime = [self getCurrentTime];
if (msg && from) {
NSLog(@"新消息:%@", msg);
本文只记录了xmpp的基本配置方法和一些基本的使用方法,另外在聊天中我们肯定会向对方发送语音、图片或者文件等类型的消息,这些类型的消息需要服务端的支持,使用上传服务器文件然后回发文件地址,再将文件地址以文本消息的方式发送给接收者,在消息体中需要区别文件类型的字段fileType,接收者根据该字段来显示不同的消息即时聊天中xmpp协议的实现只是一个难点,另外一个比较复杂的东西就是聊天的界面,不过如果使用第三方的即时通信平台的话他们都现成的直接可以使用的聊天界面,还是比较方便易用的
如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!
打开微信“扫一扫”,打开网页后点击屏幕右上角分享按钮
被以下专题收入,发现更多相似内容:
个人学习资料管理
· 18人关注
如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!
选择支付方式:}

我要回帖

更多关于 xcode怎么导入框架 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信