2015-03-05 3 views
3

Как следует из названия, я пытаюсь создать vcard для своего пользователя и отправить его на сервер, но кажется, что он не работает, есть идеи? я буду очень признателен за любую помощь.Как создать/обновить/извлечь пользовательскую визитную карточку с помощью XMPPFramework и OpeFire на iOS

Вот мой код вместе с потоковым подключением и аутентификацией, я включил эту часть, потому что с ними может быть что-то не так, поскольку я работаю с картой xmpp, клиентом iOS THAI использование: 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:@"[email protected]"]; 
    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]; 
    } 
} 

Он вновь поворачивается 1, когда я подключаюсь, и когда я проверяю подлинность, но карта не загружается, правильно ли я делаю, по крайней мере частично?

Благодарим вас за поддержку и проголосуйте за ответы!

ответ

3

UPDATE 1 - ЗАГРУЗИТЬ VCARD SUCCEEDED:

мне удалось обновить/создать визитную карточку, используя следующий код, но у меня есть проблема, когда я пытаюсь отправить 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]; 
      } 
     }); 
    } 
} 

из моего теста я делаю вывод, что не должно быть проблемой, когда служить должен обрабатывать NSArrays.

Я также попытался отправить пользовательский XML, вот пример, я не знаю, как отправить массив таким образом я преобразовал его в строку:

 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 завершен, как в случае потока? и как я могу получить vCard с сервера?

2

UPDATE 2

-> Как проверить, что визитную карточку успешно отправить или нет?

-> Ответ: Это делается путем выполнения следующих двух методов делегата:

- (void)xmppvCardTempModuleDidUpdateMyvCard:(XMPPvCardTempModule *)vCardTempModule; 

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

UPDATE 3 - Нужна помощь в загрузке визитной карточки:

Таким образом, после успеха в загрузке мою визитную карточку я попытался реализуем визитную карточку fetch, поэтому я заменил код загрузки кодом выборки в методе xmppStreamDidAuthenticate: delegate, а также в моем файле .h добавлен делегат XMPPvCardTempModuleDelegate. И протестирован, если вызывается метод xmppvCardTempModule: didReceivevCardTemp: forJID: delegate. Проблема заключается в том, что вызывается метод delegate, но NSLogs: Хранимая карта: (null).

-(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:@"[email protected]"] 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); 

}