如何在iOS上使用XMPPFramework和OpeFire创build/更新/检索用户vCard

正如标题所示,我正尝试为我的用户创build一个vcard并将其发送到服务器,但似乎它不起作用,有什么想法? 我将非常感谢任何帮助

这里是我的代码连同stream连接和身份validation,我包括了一些部分,因为他们可能也有问题,因为我是一个noob在使用xmpp框架,iOS客户端使用的是: https:// github。 COM / robbiehanson / XMPPFramework

.h类代码是:

#import <UIKit/UIKit.h> #import "XMPPStream.h" #import "XMPP.h" #import "XMPPReconnect.h" #import "XMPPPresence.h" #import "XMPPRoster.h" #import "ForgotPasswordViewController.h" #import "XMPPReconnect.h" #import "XMPPRosterCoreDataStorage.h" #import "ConractsViewController.h" #import "KeychainItemWrapper.h" #import "SignUpViewController.h" #import "XMPPvCardTemp.h" #import "XMPPvCardTempModule.h" #import "XMPPvCardCoreDataStorage.h" @interface SignInViewController : UIViewController <UITextFieldDelegate, XMPPRosterDelegate, XMPPStreamDelegate> @property (strong, nonatomic) XMPPRosterCoreDataStorage *xmppRosterStorage; @property (strong, nonatomic) XMPPRoster *xmppRoster; @property (strong, nonatomic) XMPPReconnect *reconnect; @property (strong, nonatomic) XMPPStream *xmppStream; @end 

.m类实现

 @implementation SignInViewController @synthesize xmppRosterStorage, xmppRoster, reconnect, xmppStream; - (void)viewDidLoad { //add SignIn button int signInButtonXPossition = [[UIScreen mainScreen] bounds].size.width * 0.1f; int signInButtonYPossition = [[UIScreen mainScreen] bounds].size.height * 0.55f; int signInButtonWidth = [[UIScreen mainScreen] bounds].size.width * 0.8f; int signInButtonHeight = [[UIScreen mainScreen] bounds].size.height * 0.07; UIButton *signInButton = [[UIButton alloc] initWithFrame:CGRectMake(signInButtonXPossition, signInButtonYPossition, signInButtonWidth, signInButtonHeight)]; [signInButton addTarget:self action:@selector(signInButtonFunction) forControlEvents:UIControlEventTouchUpInside]; signInButton.backgroundColor = [UIColor colorWithRed:(167/255.f) green:(224/255.f) blue:(250/255.f) alpha:1]; signInButton.layer.cornerRadius=[[UIScreen mainScreen] bounds].size.width * 0.05f; signInButton.layer.borderWidth=1.0; signInButton.layer.masksToBounds = YES; signInButton.layer.borderColor=[[UIColor whiteColor] CGColor]; [self.view addSubview:signInButton]; [signInButton setTitle:@"Sign In" forState:UIControlStateNormal]; } - (void)signInButtonFunction{ xmppStream = [[XMPPStream alloc] init]; xmppStream.myJID = [XMPPJID jidWithString:@"test@administrator"]; xmppStream.hostName = @"www.domainName.com"; xmppStream.hostPort = 5222; [xmppStream addDelegate:self delegateQueue:dispatch_get_main_queue()]; reconnect = [[XMPPReconnect alloc] init]; [reconnect activate:xmppStream]; NSError *error = nil; if (![xmppStream connectWithTimeout:XMPPStreamTimeoutNone error:&error]) { NSLog(@"error: %@", error); } NSLog(@"error: %@", error); } - (void)xmppStreamDidConnect:(XMPPStream *)sender { NSError *error = nil; if (![xmppStream authenticateWithPassword:@"test" error:&error]) { UIAlertView *alertView = [[UIAlertView alloc] initWithTitle:@"Error" message:[NSString stringWithFormat:@"Can't authenticate %@", [error localizedDescription]] delegate:nil cancelButtonTitle:@"Ok" otherButtonTitles:nil]; [alertView show]; } XMPPPresence *mypresence = [XMPPPresence presenceWithType:@"available"]; [xmppStream sendElement:mypresence]; } - (void)xmppStreamWillConnect:(XMPPStream *)sender{ NSLog(@"Did connect"); } - (void)xmppStreamDidAuthenticate:(XMPPStream *)sender{ NSLog(@"e%d",[xmppStream isConnected]);//prints out 1 NSLog(@"e%d",[xmppStream isAuthenticated]);//prints out 1 if ([xmppStream isAuthenticated]) { NSLog(@"authenticated"); XMPPvCardCoreDataStorage* xmppvCardStorage = [XMPPvCardCoreDataStorage sharedInstance]; XMPPvCardTempModule *xmppvCardTempModule = [[XMPPvCardTempModule alloc] initWithvCardStorage:xmppvCardStorage dispatchQueue:dispatch_get_main_queue()]; XMPPvCardTemp *xmppvCardTemp; NSXMLElement *vCardElement = [NSXMLElement elementWithName:@"vCard" xmlns:@"vcard-temp"]; NSXMLElement *nicknameElement = [NSXMLElement elementWithName:@"nickname" stringValue:@"A0Test1"]; [vCardElement addChild:nicknameElement]; xmppvCardTemp = [XMPPvCardTemp vCardTempFromElement:vCardElement]; [xmppvCardTempModule updateMyvCardTemp:xmppvCardTemp]; } } 

当我连接,当我authentication,但卡没有上传时,它返回1,这是我正在做的,至less部分是正确的?

感谢您的支持,并为所有答案投票!

更新1 – 上传VCARD成功:

我设法通过使用下一个代码更新/创build一个vCard,但我有一个问题,当我尝试发送一个NSArray,使用方法setLabels,数组不发送到服务器或服务器不保存它时收到它。

这是我的更新:

 - (void)xmppStreamDidAuthenticate:(XMPPStream *)sender{ if ([xmppStream isAuthenticated]) { NSLog(@"authenticated"); dispatch_queue_t queue = dispatch_queue_create("queue", DISPATCH_QUEUE_PRIORITY_DEFAULT); dispatch_async(queue, ^{ XMPPvCardCoreDataStorage * xmppvCardStorage = [XMPPvCardCoreDataStorage sharedInstance]; XMPPvCardTempModule * xmppvCardTempModule = [[XMPPvCardTempModule alloc] initWithvCardStorage:xmppvCardStorage]; [xmppvCardTempModule activate:[self xmppStream]]; XMPPvCardTemp *myVcardTemp = [xmppvCardTempModule myvCardTemp]; if (!myVcardTemp) { NSLog(@"TEST FOR VCARD"); NSXMLElement *vCardXML = [NSXMLElement elementWithName:@"vCard" xmlns:@"vcard-temp"]; XMPPvCardTemp *newvCardTemp = [XMPPvCardTemp vCardTempFromElement:vCardXML]; [newvCardTemp setNickname:@"nick"]; [xmppvCardTempModule updateMyvCardTemp:newvCardTemp]; }else{ //Set Values as normal NSLog(@"TEST FOR VCARD ELSE"); NSLog(@"TEST FOR VCARD"); NSXMLElement *vCardXML = [NSXMLElement elementWithName:@"vCard" xmlns:@"vcard-temp"]; XMPPvCardTemp *newvCardTemp = [XMPPvCardTemp vCardTempFromElement:vCardXML]; [newvCardTemp setNickname:@"aaaaaa"]; NSArray *interestsArray= [[NSArray alloc] initWithObjects:@"food", nil]; [newvCardTemp setLabels:interestsArray]; [newvCardTemp setMiddleName:@"Stt"]; [newvCardTemp setEmailAddresses:[NSMutableArray arrayWithObjects:@"email", nil]]; [xmppvCardTempModule updateMyvCardTemp:newvCardTemp]; } }); } } 

从我的testing我得出结论应该有一个问题,当发球员应该处理NSArrays。

我也尝试发送一个自定义XML,这里是例子,我不知道如何发送一个数组,所以我把它转换为string:

  NSLog(@"TEST FOR VCARD"); NSXMLElement *vCardXML = [NSXMLElement elementWithName:@"vCard" xmlns:@"vcard-temp"]; NSXMLElement *nicknameElement = [NSXMLElement elementWithName:@"nickname" stringValue:@"A0Test1"]; NSArray *myTestArray = [NSArray arrayWithObjects:@"IT",@"PC", nil]; NSXMLElement *nicknameElement2 = [NSXMLElement elementWithName:@"interests" stringValue:[NSString stringWithFormat:@"%@", myTestArray]]; [vCardXML addChild:nicknameElement]; [vCardXML addChild:nicknameElement2]; XMPPvCardTemp *newvCardTemp = [XMPPvCardTemp vCardTempFromElement:vCardXML]; [xmppvCardTempModule updateMyvCardTemp:newvCardTemp]; 

我的问题仍然存在,如何检查它是否到达服务器,是否有任何委托方法由xmpp框架调用当vCard传输完成,如在stream情况下? 以及如何从服务器接收电子名片?

更新2

– >如何检查电子名片是否成功发送?

– >答:这是通过实现下面两个委托方法完成的:

  - (void)xmppvCardTempModuleDidUpdateMyvCard:(XMPPvCardTempModule *)vCardTempModule; - (void)xmppvCardTempModule:(XMPPvCardTempModule *)vCardTempModule failedToUpdateMyvCard:(NSXMLElement *)error; 

更新3 – 需要帮助上传vCard:

因此,成功上传我的vCard后,我试图实现fetch vCard,所以我用xmppStreamDidAuthenticate:delegate方法取代了上传代码,并在我的.h文件中添加了代理XMPPvCardTempModuleDelegate。 并testing是否调用了xmppvCardTempModule:didReceivevCardTemp:forJID:delegate方法。 问题是调用委托方法,但NSLogs:存储卡:(空)。

 -(void)xmppStreamDidAuthenticate:(XMPPStream *)sender{ if ([xmppStream isAuthenticated]) { NSLog(@"authenticated"); xmppvCardStorage = [[XMPPvCardCoreDataStorage alloc] initWithInMemoryStore]; xmppvCardTempModule = [[XMPPvCardTempModule alloc] initWithvCardStorage:xmppvCardStorage]; [xmppvCardTempModule activate:[self xmppStream]]; [xmppvCardTempModule addDelegate:self delegateQueue:dispatch_get_main_queue()]; [xmppvCardTempModule fetchvCardTempForJID:[XMPPJID jidWithString:@"test11@administrator"] ignoreStorage:YES]; } } - (void)xmppvCardTempModule:(XMPPvCardTempModule *)vCardTempModule didReceivevCardTemp:(XMPPvCardTemp *)vCardTemp forJID:(XMPPJID *)jid{ NSLog(@"Delegate is called"); XMPPvCardTemp *test = [xmppvCardStorage vCardTempForJID:jid xmppStream:xmppStream]; NSLog(@"Stored card: %@",test.description); }