Cómo crear / actualizar / recuperar vCard de usuario usando XMPPFramework y OpeFire en iOS

Como sugiere el título, estoy tratando de crear una vcard para mi usuario y enviarla al server, pero parece que no funciona, ¿alguna idea? Apreciaré mucho cualquier ayuda

Aquí está mi código junto con la transmisión de stream y la authentication, he incluido esta parte porque también puede haber algo mal con ellos, ya que soy un noob trabajando con xmpp framework, el cliente iOS que uso es: https: // github. com / robbiehanson / XMPPFramework

el código de class .h es:

#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 implementación de class

 @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 shanetworkingInstance]; 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]; } } 

Devuelve 1 cuando me conecto y cuando autentico, pero la tarjeta no se carga, ¿es correcto lo que hago, al less parcialmente?

¡Gracias por su apoyo y vote por todas las respuestas!

ACTUALIZACIÓN 1: CARGA DE VCARD SUCCEEDED:

He logrado actualizar / crear una vCard utilizando el siguiente código, pero tengo un problema cuando bash enviar una NSArray, utilizando el método setLabels, la matriz no se envía al server o el server no lo guarda cuando lo recibe

Aquí está mi actualización:

 - (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 shanetworkingInstance]; 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]; } }); } } 

de mi testing llego a la conclusión de que debería haber un problema cuando el service debe manejar NSArrays.

También traté de enviar un XML personalizado, aquí está el ejemplo, no sé cómo enviar un array, así que lo convertí en cadena:

  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]; 

Mi pregunta sigue siendo ahora, ¿cómo comprobar si llegó al server? ¿Hay algún método de delegado llamado por xmpp framework cuando la transferencia de vCard se completa como en el caso de transmisión? y ¿cómo puedo recibir la vCard desde el server?

ACTUALIZACIÓN 2

-> ¿Cómo comprobar que la vCard se envió con éxito o no?

-> Respuesta: Esto se hace mediante la implementación de los siguientes dos methods de delegado:

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

ACTUALIZACIÓN 3: necesita ayuda para cargar la vCard:

Así que después de tener éxito en cargar mi vCard intenté implementar la fetch vCard, así que reemplacé el código de carga con el código de fetch en el xmppStreamDidAuthenticate: delegate method y también en mi file .h agregué el delegado XMPPvCardTempModuleDelegate. Y se probó si se llama al método xmppvCardTempModule: didReceivevCardTemp: forJID: delegate. El problema es que se llama al método de delegado pero el NSLogs: tarjeta almacenada: (nulo).

 -(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(@"Stonetworking card: %@",test.description); }