#import "AppDelegate.h"

//#import "DBAreaItem.h"

#pragma mark -

#pragma mark Private Interface

@interface AppDelegate()

typedef enum

{

AlertViewStyleConflict=,//登陆冲突

AlertViewStyleFailAuthenticate=,//登陆失败

AlertViewStyleDisconnect=//server链接失败

}AlertViewStyle;

@property(nonatomic,assign) int
AlertViewTag;

@end

#pragma markImplementation

@implementation AppDelegate

#pragma mark Properties

@synthesize window =_window;

@synthesizecacheinfo,settinginfo,serverInfo,userInfo;

//xmpp

@synthesize xmppStream;

@synthesize xmppRoster;

@synthesizexmppRosterStorage;

@synthesize xmppReconnect;

@synthesizexmppMessageArchivingCoreDataStorage;

@synthesizexmppMessageArchivingModule;

@synthesizejxlName,jxlNumber;

@synthesizexmppvCardStorage,xmppvCardTempModule,xmppvCardAvatarModule,xmppCapabilitiesStorage,xmppCapabilities;

#pragma mark UIApplicationDelegate

- (BOOL)application:(UIApplication *)applicationdidFinishLaunchingWithOptions:(NSDictionary
*)launchOptions

{

[selfmySetupStream];

return YES;

}

#pragma mark - actions

- (void)mySetupStream{

self.messageRecordDic
= [[NSMutableDictionary
alloc]init];//聊天信息的读取写在认证通过里面

//    self.myCardInfo =[[NSMutableDictionary alloc] init];

self.rosterArray
];

self.messageSenders=[[NSMutableDictionary
alloc];

self.allUsersDataDic=[[NSMutableDictionary
alloc];;

//
初始化xmppStream

if(xmppStream) {

return;

}

xmppStream
=[[XMPPStream alloc]init];

[xmppStreamaddDelegate:self delegateQueue:dispatch_get_main_queue()];

//同意后台模式(注意ios模拟器上是不支持后台socket的)

xmppStream.enableBackgroundingOnSocket
= YES;

//
初始化xmppReconnect

xmppReconnect
= [[XMPPReconnect alloc]init];

//
初始化xmppRosterStorage   roster

xmppRosterStorage
= [[XMPPRosterCoreDataStorage alloc]init];

xmppRoster
=[[XMPPRoster alloc]initWithRosterStorage:xmppRosterStorage];

[xmppRosteraddDelegate:self delegateQueue:dispatch_get_main_queue()];

xmppRoster.autoFetchRoster
= YES;

xmppRoster.autoAcceptKnownPresenceSubscriptionRequests=
YES;

//
初始化vCard support

xmppvCardStorage
= [XMPPvCardCoreDataStorage sharedInstance];

xmppvCardTempModule
= [[XMPPvCardTempModule alloc]initWithvCardStorage:xmppvCardStorage];

xmppvCardAvatarModule
= [[XMPPvCardAvatarModule alloc]initWithvCardTempModule:xmppvCardTempModule];

[xmppvCardTempModuleaddDelegate:self delegateQueue:dispatch_get_main_queue()];

[xmppvCardAvatarModuleaddDelegate:self delegateQueue:dispatch_get_main_queue()];

//
初始化capabilities

xmppCapabilitiesStorage
= [XMPPCapabilitiesCoreDataStoragesharedInstance];

xmppCapabilities
= [[XMPPCapabilities alloc]initWithCapabilitiesStorage:xmppCapabilitiesStorage];

xmppCapabilities.autoFetchHashedCapabilities
= YES;

xmppCapabilities.autoFetchNonHashedCapabilities=
NO;

//
初始化message

xmppMessageArchivingCoreDataStorage=[XMPPMessageArchivingCoreDataStorage
sharedInstance];

xmppMessageArchivingModule
= [[XMPPMessageArchiving alloc]initWithMessageArchivingStorage:xmppMessageArchivingCoreDataStorage];

[xmppMessageArchivingModulesetClientSideMessageArchivingOnly:YES];

[xmppMessageArchivingModule
activate:xmppStream];

[xmppMessageArchivingModule
addDelegate:selfdelegateQueue:dispatch_get_main_queue()];

//
激活xmpp的模块

[xmppReconnect
       activate:xmppStream];

[xmppRoster         
activate:xmppStream];

[xmppvCardTempModule
  activate:xmppStream];

[xmppvCardAvatarModule
activate:xmppStream];

[xmppCapabilities    
activate:xmppStream];

//以下这两个依据你自己配置须要来设置

//    allowSelfSignedCertificates= NO;

//    allowSSLHostNameMismatch =NO;

}

- (void)myTeardownStream//

{

[xmppStream removeDelegate:self];

[xmppRoster removeDelegate:self];

[xmppReconnect      
deactivate];

[xmppRoster         
deactivate];

[xmppvCardTempModule 
deactivate];

[xmppvCardAvatarModuledeactivate];

[xmppCapabilities    
deactivate];

[xmppStream disconnect];

xmppStream = nil;

xmppReconnect = nil;

xmppRoster
= nil;

xmppRosterStorage =nil;

xmppvCardStorage =
nil;

xmppvCardTempModule
= nil;

xmppvCardAvatarModule =nil;

xmppCapabilities =
nil;

xmppCapabilitiesStorage =nil;

}

- (BOOL)myConnect//链接server,验证password并上线

{

if ([xmppStream
isConnected]) {

returnYES;

}

[self.rosterInfoDic removeAllObjects];

[self.allUsersDataDicremoveAllObjects];

[self.rosterArray removeAllObjects];

NSString
*strTransAite=[APPALL.cacheinfo.demailstringByReplacingOccurrencesOfString:@"@"withString:@"$"];

NSLog(@"%@",strTransAite);

XMPPJID *myjid = [XMPPJID
jidWithUser:strTransAite
domain:@"eim.abc.com.cn"
resource:@"GIMI0.6"  ];

[xmppStream
setMyJID:myjid];

[xmppStream
setHostName:@"eim.abc.com.cn"];//设置server

// [[self xmppStream]setHostPort:5222];

NSError *error ;

//NSLog(@"xmppStream=%@",xmppStream);

[SVProgressHUDshowWithStatus:@"登录中..."];

error:&error])//XMPPStreamTimeoutNone

{

NSLog(@"my connected error : %@",error.description);

[SVProgressHUDshowErrorWithStatus:@"server连接失败"];

returnNO;

}

else{

returnYES;

}

}

- (void)myDisconnect//断开连接

{

[self myGoOffline];

[xmppStream disconnect];

}

- (void)myDeleteRecord//清楚聊天,信息记录

{

[self.messageRecordDic
removeAllObjects];

[self.messageSenders removeAllObjects];

}

- (void)getMyQueryRoster//Request FriendList

{

NSLog(@"request friendlist...");

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

NSXMLElement
*iq = [NSXMLElement elementWithName:@"iq"];

XMPPJID
*myJID = self.xmppStream.myJID;

[iq addAttributeWithName:@"from" stringValue:myJID.description];

[iq addAttributeWithName:@"to"stringValue:myJID.domain];

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

[iq addAttributeWithName:@"type" stringValue:@"get"];

[iq
addChild:query];

[self.xmppStream
sendElement:iq];

}

- (void)myGoOnline//上线

{

//简单上线

XMPPPresence
*presence = [XMPPPresence presence];

[[selfxmppStream]sendElement:presence];

}

- (void)myGoOffline//下线

{

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

[[self xmppStream] sendElement:presence];

}

- (NSString*)writeDateBase_64Image:(NSString *)photoString WithFileName:(NSString
*)theImageName Size:(CGSize)theSize

{

if ([photoString isEqualToString:@""]) {

NSLog(@"writeDateBase_64Image
没有头像");

return@"";

}

//压缩data再写入本地

NSData *data=[photoString
base64DecodedData];

UIImage *aimage=[self
scaleImage:[UIImage
imageWithData:data]
toSize:theSize];

NSData *dataAfterscale=UIImageJPEGRepresentation(aimage,1.0);

return  [DataPlist
writeData:dataAfterscale
ToTMPWithSubFloderName:@"headImageCache"
FileName:theImageName];

}

-(UIImage*)scaleImage:(UIImage *)imagetoSize:(CGSize)theTize//图片压缩到指定CGSize大小

{

UIGraphicsBeginImageContext(theTize);

[image
,
,theTize.width,theTize.height)];

UIImage
*scaledImage =UIGraphicsGetImageFromCurrentImageContext();

UIGraphicsEndImageContext();

return scaledImage;

}

- (void)updateallUsersDataDic_Group_Presence//更新分组+在线、离线状态好友数据

{

[self.allUsersDataDicremoveAllObjects];

; i < self.rosterArray.count; i++)

{

NSMutableDictionary *adic = [self.rosterArray
objectAtIndex:i];

XMPPJID*ajid=[adic
objectForKey:@"object"];

if ([ajid.user
isEqualToString:xmppStream.myJID.user])

{

continue;

}

NSString*groupName=[adic
objectForKey:@"group"];//分组名

NSString*presenceType=[adic
objectForKey:@"presenceType"];//状态

NSMutableArray*arrayWithgroupName=[self.allUsersDataDic
objectForKey:groupName];//该keyword的数组

if(arrayWithgroupName)//存在该keyword的数组

{

if ([presenceType
isEqualToString:@"yes"])

{

[arrayWithgroupNameinsertObject:[NSNumber
];//在线好友加到数组第一个

}

else

{

[arrayWithgroupNameaddObject:[NSNumber
numberWithInt:i]];//离线的好友,加到数组最后一个

}

}

else//不存在该keyword的数组

{

NSMutableArray*newArray=[[NSMutableArrayalloc]init];

[newArrayaddObject:[NSNumber
numberWithInt:i]];//在线或者离线的好友。加到空白数组里面

[self.allUsersDataDic
setObject:newArray
forKey:groupName];//groupName=newArray,加入到allUsersDataDic

}

}

}

#pragma mark - XMPPStreamDelegate

- (void)xmppStreamDidConnect:(XMPPStream *)sender

{

//验证password

NSError *error;

NSString *md5password= [APPALL.cacheinfo.dpassword
MD5Digest];

NSLog(@"%s--\nmd5password=%@",__func__,md5password);

[xmppStreamauthenticateWithPassword:md5password error:&error];

}

- (void)xmppStreamDidAuthenticate:(XMPPStream*)sender

{

NSLog(@"验证通过%s--\nsender.hostName=%@remoteJID.description=%@  sender.keepAliveInterval=%f",__func__,sender.hostName,sender.remoteJID.description,sender.keepAliveInterval);

XMPPPresence
*presence = [XMPPPresence presence];

[[selfxmppStream]sendElement:presence];

[xmppvCardTempModule
fetchvCardTempForJID:xmppStream.myJID];

self.lastFetchedvCard=xmppStream.myJID;

//      self.rosterInfoDic=[DataPlistopenDPFromDocumentsWithName:xmppStream.myJID.userAndTheType:@"plist"];//我的(xmppStream.myJID.user的)好友信息

self.rosterInfoDic=[DataPlist
openPlistFromDocumentWithName:xmppStream.myJID.user
AndTheType:@"plist"];//我的(xmppStream.myJID.user的)好友信息

NSLog(@"验证通过,本地好友信息数目=%d",self.rosterInfoDic.count);

}

- (void)xmppStream:(XMPPStream *)senderdidNotAuthenticate:(NSXMLElement
*)error//

{

NSLog(@"验证失败didNotAuthenticate:%@",error.description);

[SVProgressHUD
dismiss];

[selfmyDisconnect];

self.AlertViewTag
=AlertViewStyleFailAuthenticate;

[toolesshowSelectMsgBoxWithTitle:nilandMsg:@"登录失败,是否又一次登录?"andDelegate:self];

}

- (BOOL)xmppStream:(XMPPStream*)sender didReceiveIQ:(XMPPIQ*)iq//返回IQ(好友列表、)

{

NSLog(@"--type:%@",iq.type);

//   NSLog(@"--%@",[iq.childElement children]);

//   NSLog(@"--child:%@",iq.childElement );

if ([@"result"
isEqualToString:iq.type]) {

NSXMLElement*query = iq.childElement;

NSXMLElement*aitem=[[query
children]lastObject];

NSString*ajid = [aitem
attributeStringValueForName:@"jid"];

NSLog(@"ajid=%@",ajid);

if([@"query"
isEqualToString:query.name]&&ajid) {

NSArray *items = [querychildren];

NSLog(@"iq.to=%@ items.count=%d ",iq.to,items.count);

[self.rosterArray
removeAllObjects];

for (NSXMLElement *item
in items) {

//             "\U9510\U6770\U7f51\U683c",

NSString *groupName= [[item.children
]stringValue];

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

NSLog(@"分组groupName=%@",groupName);

XMPPJID *object = [XMPPJID
jidWithString:jid];

NSMutableDictionary *dic=[[NSMutableDictionary
alloc]initWithObjectsAndKeys:object,@"object",@"no",@"presenceType",groupName,@"group",
nil];

[self.rosterArray
addObject:dic];

//

if (![self.rosterInfoDic
objectForKey:object.user]&&object)//if本地数据没有该好友信息,就请求fetchvCardTempForJID

{

self.lastFetchedvCard=nil,self.lastFetchedvCard=object;

[xmppvCardTempModulefetchvCardTempForJID:objectignoreStorage:YES];

}

//              NSLog(@"FAMILY=%@\nself.lastFetchedvCard=%@ \nobject.description=%@",[[self.rosterInfoDic objectForKey:object.user]objectForKey:@"FAMILY"],self.lastFetchedvCard,object.description);

}

//          //发送通知

NSNotification*notificationObject =[NSNotification
notificationWithName:@"upDateListData"object:nil];

[[NSNotificationCenterdefaultCenter]
postNotification:notificationObject];

}

if([@"vCard"
isEqualToString:query.name])

{

}

}

return YES;

}

- (void)xmppStream:(XMPPStream*)sender didSendMessage:(XMPPMessage *)message

{

NSString *msg = [[message
elementForName:@"body"]
stringValue];

NSString *from = [[message
attributeForName:@"from"]
stringValue];

NSString
*to =[[message attributeForName:@"to"]stringValue];

NSString *type= [[message
attributeForName:@"type"]
stringValue];

NSRange range=[to
rangeOfString:@"@"];

)return;

NSString *toSimple=[to
substringToIndex:range.location];

NSLog(@"发送给%@的消息:%@
(消息类型:%@)",toSimple,msg,type);

if([messageisChatMessageWithBody])//message

{

NSMutableDictionary*dict = [NSMutableDictionarydictionary];

[dict
setObject:from forKey:@"sender"];

[dict
setObject:msg forKey:@"msg"];

[dict
setObject:@"text"
forKey:@"type"];

[dict
setObject:[NSDate
date] forKey:@"date"];

if(![self.messageRecordDic
objectForKey:toSimple]&&dict) {

NSMutableArray
*array=[[NSMutableArray
alloc]init];

[arrayaddObject:dict];

[self.messageRecordDic
setObject:array forKey:toSimple];

}

else

{

NSMutableArray*array1=[self.messageRecordDic
objectForKey:toSimple];

[array1addObject:dict];

}

[self.messageSenders
setObject:@"0"forKey:toSimple];//将近期联系人放入messageSenders中

NSNotification *notificationObject=[NSNotification
notificationWithName:@"messageGetting"object:nil];

[[NSNotificationCenter
defaultCenter]postNotification:notificationObject];

}

}

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

{

NSString *msg = [[message
elementForName:@"body"]
stringValue];

NSString *from = [[message
attributeForName:@"from"]
stringValue];

NSString *type= [[message
attributeForName:@"type"]
stringValue];

NSRange range=[from
rangeOfString:@"@"];

)return;

NSString *fromSimple=[from
substringToIndex:range.location];

NSLog(@"接受%@的消息:%@
(消息类型:%@)",fromSimple,msg,type);

NSLog(@"接受消息%@",message);

if([messageisChatMessageWithBody])//message

{

NSLog(@"%@",message);

NSMutableDictionary*dict = [NSMutableDictionarydictionary];

[dict
setObject:fromSimple
forKey:@"sender"];

[dict
setObject:msg forKey:@"msg"];

[dict
setObject:@"text"
forKey:@"type"];

[dict
setObject:[NSDate
date] forKey:@"date"];

if(![self.messageRecordDic
objectForKey:fromSimple]&&dict){

NSMutableArray
*array=[[NSMutableArray
alloc]init];

[arrayaddObject:dict];

[self.messageRecordDic
setObject:array forKey:fromSimple];

}

else

{

NSMutableArray*array1=[self.messageRecordDic
objectForKey:fromSimple];

[array1addObject:dict];

}

//未读消息来源者

if(![self.messageSenders
objectForKey:fromSimple]) {

[self.messageSenders
setObject:@"1"
forKey:fromSimple];

}

else

{

int number=[[self.messageSenders
objectForKey:fromSimple]
intValue]+;

[self.messageSenders
setObject:[NSString
stringWithFormat:@"%d",number]
forKey:fromSimple];

}

}

else//语音、图片类

{

NSLog(@"其它信息");

}

NSNotification *notificationObject=[NSNotification
notificationWithName:@"messageGetting"object:nil];

[[NSNotificationCenter
defaultCenter]postNotification:notificationObject];

}

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

{

NSLog(@"___%s",__func__);

NSString*presenceType = [presence
type]; //online/offline

//当前用户

NSString *userId = [[[APPALL
xmppStream]myJID]user] ;

//在线用户

NSString *presenceFromUser = [[presencefrom]
user];

if (![presenceFromUser
isEqualToString:userId]) {

//在线状态

if([presenceType isEqualToString:@"available"]) {

//用户列表托付

for (NSMutableDictionary *dic
in self.rosterArray) {

XMPPJID *object = [dic
objectForKey:@"object"];

if ([object.user
hasPrefix:presenceFromUser]) {

[dic
setObject:@"yes"
forKey:@"presenceType" ];

}

}

NSLog(@"%@上线了",presenceFromUser);

}elseif ([presenceType
isEqualToString:@"unavailable"]) {

//用户列表托付

for (NSMutableDictionary *dic
in self.rosterArray) {

XMPPJID *object = [dic
objectForKey:@"object"];

if ([object.user
hasPrefix:presenceFromUser]) {

[dic
setObject:@"no"
forKey:@"presenceType" ];

}

}

NSLog(@"%@下线了",presenceFromUser);

}

}

[selfupdateallUsersDataDic_Group_Presence];

//发送好友列表刷新通知

NSNotification *notificationObject=[NSNotification
notificationWithName:@"upDateListData"object:nil];

[[NSNotificationCenter
defaultCenter] postNotification:notificationObject];

}

- (void)xmppStream:(XMPPStream*)sender didReceiveError:(NSXMLElement *)error

{

NSLog(@"didReceiveError description: %@",error.description);

DDXMLNode *errorNode = (DDXMLNode *)error;

for(DDXMLNode *node
in [errorNode children])

{

//若错误节点有【冲突】

if([[nodename]
isEqualToString:@"conflict"])

{

//停止轮训检查链接状态

//           [_timerinvalidate];

[self
myDisconnect];

NSNotification*notificationObject =[NSNotification
notificationWithName:@"upDateListData"object:nil];

[[NSNotificationCenterdefaultCenter]
postNotification:notificationObject];

self.AlertViewTag
= AlertViewStyleConflict;

[tooles
showSelectMsgBoxWithTitle:nilandMsg:@"您的账户已在其它手机上登录,您已被挤下线,请确定是否是您本人操作!是否又一次登录?"andDelegate:self];

}

}

}

- (void)xmppStream:(XMPPStream*)sender
didSendIQ:(XMPPIQ*)iq

{

NSLog(@"didSendIQ:%@",iq.description);

//    1、 didSendIQ:

//    2、 didSendIQ:

//    3、(手动发送好友列表请求) didSendIQ:}

- (void)xmppStream:(XMPPStream*)sender didFailToSendMessage:(XMPPMessage *)message
error:(NSError *)error

{

NSLog(@"didFailToSendMessage:%@",error.description);

[SVProgressHUDshowErrorWithStatus:@"消息发送失败"];

}

- (void)xmppStream:(XMPPStream*)sender didFailToSendPresence:(XMPPPresence
*)presence error:(NSError *)error

{

NSLog(@"didFailToSendPresence:%@",error.description);

[SVProgressHUDshowErrorWithStatus:@"状态更新失败"];

}

//[xmppStream disconnect]时会运行;掉线、断网故障时不运行

- (void)xmppStreamWasToldToDisconnect:(XMPPStream*)sender

{

NSLog(@"xmppStreamWasToldToDisconnect");

}

//[xmppStream disconnect]、掉线、断网故障时运行

- (void)xmppStreamDidDisconnect:(XMPPStream *)sender withError:(NSError *)error

{

NSString
*str=[NSString
stringWithFormat:@"server连接失败%@",[error.userInfoobjectForKey:@"NSLocalizedDescription"]];

NSLog(@"%s--=%@---\n error=%@",__func__,str,error);

NSLog(@"error.userInfo =%@",error.userInfo);

//登陆不到server

//    error.userInfo ={

//       NSLocalizedDescription = "nodename nor servnameprovided, or not known";

//    }

[selfmyDisconnect];

if([error.userInfo
objectForKey:@"NSLocalizedDescription"]) {

[SVProgressHUD
showErrorWithStatus:[error.userInfo
objectForKey:@"NSLocalizedDescription"]];

}

else

{

[SVProgressHUDshowErrorWithStatus:@"好友server连接失败!"];

}

}

#pragma mark - XMPPReconnectDelegate

- (void)xmppReconnect:(XMPPReconnect *)senderdidDetectAccidentalDisconnect:(SCNetworkReachabilityFlags)connectionFlags

{

NSLog(@"didDetectAccidentalDisconnect:%u",connectionFlags);

}

- (BOOL)xmppReconnect:(XMPPReconnect *)sendershouldAttemptAutoReconnect:(SCNetworkReachabilityFlags)reachabilityFlags

{

NSLog(@"shouldAttemptAutoReconnect:%u",reachabilityFlags);

return YES;

}

#pragma mark-XMPPvCardTempModuleDelegate名片信息

- (void)xmppvCardTempModule:(XMPPvCardTempModule *)vCardTempModule

didReceivevCardTemp:(XMPPvCardTemp *)vCardTemp

forJID:(XMPPJID *)jid

{

//    NSLog(@"%s",__func__);

NSXMLElement *xmlData=(NSXMLElement *)vCardTemp;

NSString *titleString =
@"这个用户非常懒。没有签名!

";

NSString *familyString =
@"无名用户";

NSString *photoString =
@"";

for(idmyItem
in [xmlData children])

{

NSLog(@"myItemname=%@",[myItem
name]);

if([myItemstringValue].length <=
)

{

//          NSLog(@"valuelalala:%@",[myItem stringValue]);

}

else

{

NSLog(@"too long");

}

if([[myItemname]
isEqualToString:@"TITLE"])

{

titleString = [myItem
stringValue];

}

elseif([[myItem
name] isEqualToString:@"N"])

{

familyString = [myItem
stringValue];

}

elseif([[myItem
name] isEqualToString:@"PHOTO"])

{

photoString = [[myItem
];

}

}

//    头像image写入本地

NSString *PHOTOImagePath=[self
writeDateBase_64Image:photoStringWithFileName:jid.user
,
)];

NSMutableDictionary*dicObject=[[NSMutableDictionary
alloc]initWithObjectsAndKeys:titleString,@"TITLE",familyString,@"FAMILY",PHOTOImagePath,@"PHOTO",nil];

[self.rosterInfoDic
setObject:dicObject
forKey:jid.user];//

//family photopath title
写入本地

NSLog(@"forJID:(XMPPJID *)jid=%@  \n self.lastFetchedvCard=%@  \n ",jid.user,self.lastFetchedvCard.user);

if([self.lastFetchedvCard.user
isEqualToString:jid.user])//(在最后一次名片请求的时候,写入本地,)

{

//       [DataPlist writeDP:self.rosterInfoDicWithName:xmppStream.myJID.user AndTheType:@"plist"];

[DataPlistwritePlistToDocumentWithDic:self.rosterInfoDic
WithName:xmppStream.myJID.userAndTheType:@"plist"];

}

NSNotification *notificationObject=[NSNotification
notificationWithName:@"upDateListData"object:nil];

[[NSNotificationCenter
defaultCenter] postNotification:notificationObject];

}

- (void)xmppvCardTempModuleDidUpdateMyvCard:(XMPPvCardTempModule*)vCardTempModule//更新名片

{

NSLog(@"%s--%@",__func__,vCardTempModule);

}

//获取完善友列表

- (void)xmppRosterDidEndPopulating:(XMPPRoster*)sender

{

NSLog(@"获取完成好友列表");

[SVProgressHUDshowSuccessWithStatus:@"登录成功"];

if([self.lastFetchedvCard.user
isEqualToString:xmppStream.myJID.user]){

[SVProgressHUDdismiss];

}

[selfupdateallUsersDataDic_Group_Presence];

//发给BigDesktopViewController

NSNotification *notificationObject_1=[NSNotification
notificationWithName:@"DidAuthenticate"object:nil];

[[NSNotificationCenter
defaultCenter] postNotification:notificationObject_1];

//发送通知BigFriendListViewController

NSNotification *notificationObject=[NSNotification
notificationWithName:@"upDateListData"object:nil];

[[NSNotificationCenter
defaultCenter] postNotification:notificationObject];

}

//- (XMPPvCardTemp *)myvCardTempForXMPPStream:(XMPPStream*)stream

//{}

#pragma mark Core Data

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

- (NSManagedObjectContext*)managedObjectContext_roster

{

return [xmppRosterStoragemainThreadManagedObjectContext];

}

- (NSManagedObjectContext*)managedObjectContext_capabilities

{

return [xmppCapabilitiesStoragemainThreadManagedObjectContext];

}

#pragma mark - XMPPRosterDelegate

- (void)xmppRoster:(XMPPRoster*)sender didReceivePresenceSubscriptionRequest:(XMPPPresence
*)presence

{

NSLog(@"好友状态更改--%s",__func__);

}

- (void)xmppRoster:(XMPPRoster*)sender didReceiveBuddyRequest:(XMPPPresence
*)presence//接受好友请求

{

NSLog(@"%s",__func__);

XMPPUserCoreDataStorageObject *user =[xmppRosterStorage
userForJID:[presence
from]

xmppStream:xmppStream

managedObjectContext:[self
managedObjectContext_roster]];

NSString *displayName = [userdisplayName];

NSString *jidStrBare =[presence
fromStr];

NSString *body =
nil;

if (![displayName
isEqualToString:jidStrBare])

{

body = [NSString
stringWithFormat:@"Buddy request from %@

iOS xmpp的使用的更多相关文章

  1. iOS XMPP 通信协议实现 图形化直观感受

    第一次随笔,实在不知写点什么有用的东西,那就分享一下本人最近的研究所得吧! 是关于iOS-XMPP-通信协议的实现,具体代码比较复杂,三言两句也实在难表达清楚,网上已有很多关于iOS XMPP协议的讲 ...

  2. ios xmpp开发应用后台模式接收聊天信息处理方案

    ios xmpp开发应用后台模式接收聊天信息 最近在使用xmppframwork来实现一个聊天应用,碰到了一个问题,应用进入后台以后,就接收不到消息了: 怎么样才能使应用被切到后台时,应用中的网络连接 ...

  3. iOS xmpp协议实现聊天之openfire的服务端配置(一)

    今天弄这个openfire服务端的配置直接苦了一逼,只是好在最后最终配置好了.首先感谢@月光的尽头的博客给了我莫大的帮助. 切入正题,首先说一下iOS xmpp协议实现聊天openfireserver ...

  4. ios xmpp 发送语音图片解决方案

    ios xmpp 发送语音,图片解决方案,有需要的朋友可以参考下. 目前做IM多是用的xmpp. 因为项目需求需要实现语音和图片的发送. 发送语音图片有三种方法. 1,xmpp smack.文件传输方 ...

  5. iOS XMPP Framework 中文概述

    本篇文章翻译XMPP Framework中的Overview of the XMPP Framework部分 介绍 The framework is divided into 2 parts: 1. ...

  6. iOS - XMPP 的使用

    1.XMPP XMPP 是一个基于 Socket 通信的即时通讯的协议,它规范了即时通信在网络上数据的传输格式,比如登录,获取好友列表等等的格式.XMPP 在网络传输的数据是 XML 格式. 开发架构 ...

  7. iOS - XMPP Openfire 服务器的搭建

    前言 提前下载好相关软件,且安装目录最好安装在全英文路径下.如果路径有中文名,那么可能会出现一些莫名其妙的问题. 提前准备好的软件: jdk-8u91-macosx-x64.dmg mysql-5.7 ...

  8. 【iOS XMPP】使用XMPPFramewok(五):好友列表

    转自:http://www.cnblogs.com/dyingbleed/archive/2013/05/17/3082226.html 好友列表 好友列表,在 XMPP 中被称为 roster,花名 ...

  9. 【iOS XMPP】使用XMPPFramewok(四):收发消息

    转自:http://www.cnblogs.com/dyingbleed/archive/2013/05/16/3075105.html 收发消息 接收消息 通过实现 - (void)xmppStre ...

  10. 【iOS XMPP】使用XMPPFramewok(二):用户登录

    转自:http://www.cnblogs.com/dyingbleed/archive/2013/05/10/3069397.html 用户登录 准备工作 比较知名的开源XMPP服务器:一个是Ope ...

随机推荐

  1. python调用aapt工具直接获取包名和tagertSdkversion

    背景: 每次海外游戏上架都需要符合google的上架规则,其中适配方面tagetSdkversion有硬性要求,比如需要适配安卓q就需要tagetSdkversion达到28,水平太渣的我每次调用aa ...

  2. oracle 存储过程,存储函数,包,

    http://heisetoufa.iteye.com/blog/366957 认识存储过程和函数 存储过程和函数也是一种PL/SQL块,是存入数据库的PL/SQL块.但存储过程和函数不同于已经介绍过 ...

  3. 文艺平衡树(splay模板)

    题干:splay模板,要求维护区间反转. splay是一种码量小于treap,但支持排名,前驱后继等treap可求的东西,也支持区间反转的平衡树. 但是有两个坏处: 1.splay常数远远大于trea ...

  4. POJ-1328-放置雷达

    这是一道贪心的题目,首先我们要知道,我们放置雷达的话我们可以做一个转换,就是已知岛屿的点坐标的时候,我们可以算一下,这个点以d为半径与x轴交点之间的线段在x轴上的投影,然后我们只需要在这个投影范围内设 ...

  5. 彻底卸载WIN10 OneDrive

    彻底卸载WIN10 OneDrive @ECHO OFF %SystemRoot%\SysWOW64\OneDriveSetup.exe /uninstall RD "%UserProfil ...

  6. python 05 关于对python中引用的理解

    数据的在内存中的地址就是数据的引用. 如果两个变量为同一个引用,那么这两个变量对应的数据一定相同: 如果两个变量对应的数据相同,引用不一定相同. 通过id(数据)可以查看数据对应的地址,修改变量的值, ...

  7. 用tkinter写出you-get下载器界面,并用pyinstaller打包成exe文件

    本文为原创文章,转载请标明出处 一.you-get介绍 you-get是一个基于 python 3 的下载工具,使用 you-get 可以很轻松的下载到网络上的视频.图片及音乐.目前支持网易云音乐.A ...

  8. LeetCode(69) Sqrt(x)

    题目 Total Accepted: 67411 Total Submissions: 286086 Difficulty: Medium Implement int sqrt(int x). Com ...

  9. java.sql.SQLException: Data truncated for column 'lastSeason' at row 1

    在使用项目将数据存储到 datetime 的字段 ,抛出了这个异常 而我是使用Java.util.Date 存储过去的 解决代码如下: Date date = new Date(); demo.set ...

  10. 如何用scanf读入一个string

    #include <stdio.h> #include <string> using namespace std; int main() { string a; a.resiz ...