2015-03-09 4 views
1

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

Вот мой код вместе с потоковым подключением и аутентификацией. Я включил эту часть, потому что с ними может быть что-то не так, так как я работаю с XMPP Framework, 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 
    { 
     XMPPvCardCoreDataStorage *xmppvCardStorage; 
     XMPPvCardTempModule * xmppvCardTempModule; 
    } 
    @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 = @"ServerAddress"; 
     xmppStream.hostPort = 5222; 
     [xmppStream addDelegate:self   delegateQueue:dispatch_get_main_queue()]; 

     xmppvCardStorage = nil; 
     xmppvCardStorage = [[XMPPvCardCoreDataStorage alloc]initWithInMemoryStore]; 
     xmppvCardTempModule = [[XMPPvCardTempModule alloc] initWithvCardStorage:xmppvCardStorage]; 
     [xmppvCardTempModule activate:xmppStream]; 
     [xmppvCardTempModule 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)xmppStreamDidAuthenticate:(XMPPStream *)sender{ 
     NSLog(@"e%d",[xmppStream isConnected]);//prints out 1 
     NSLog(@"e%d",[xmppStream isAuthenticated]);//prints out 1 

     if ([xmppStream isAuthenticated]) { 

      NSLog(@"authenticated"); 
      [xmppvCardTempModule fetchvCardTempForJID:[XMPPJID jidWithString:@"[email protected]"] ignoreStorage:YES]; 

     } 
    } 

    - (void)xmppvCardTempModule:(XMPPvCardTempModule *)vCardTempModule 
      didReceivevCardTemp:(XMPPvCardTemp *)vCardTemp 
         forJID:(XMPPJID *)jid{ 

      XMPPvCardTemp *test = [xmppvCardStorage vCardTempForJID:jid xmppStream:xmppStream]; 
      NSLog(@"Stored card: %@",test.description); 
      //Prints out: "Stored card: (null)" 
    } 

Он возвращает 1, когда я подключаюсь, и когда я проверяю подлинность, но карта не извлекается, правильно ли это, что я делаю, хотя бы частично?

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

Это сообщение связано с: How to create/ update/ retrieve user vCard using XMPPFramework and OpeFire on iOS

ответ

1

Вы можете получить вошедшего пользователя визитную карточку с помощью [AppDelegate delegate].xmppvCardTempModule myvCardTemp] Если вы используете https://github.com/robbiehanson/XMPPFramework этот код.

И если вы хотите, чтобы обновить визитную карточку вы можете использовать этот код в AppDelegate

- (void)updateProfile:(UIImage *)profilePicture userData:(NSDictionary *)userData 

{ 
NSMutableArray *elements = [NSMutableArray array]; 
[elements addObject:[NSXMLElement elementWithName:@"fullname" stringValue:@""]]; 
NSData *pictureData = UIImagePNGRepresentation(profilePicture); 
dispatch_queue_t queue = dispatch_queue_create("queue", DISPATCH_QUEUE_PRIORITY_DEFAULT); 
dispatch_async(queue, ^{ 
    XMPPvCardTemp *myVcardTemp = [xmppvCardTempModule myvCardTemp]; 
    [myVcardTemp setPhoto:pictureData]; 
    [myVcardTemp setEmailAddresses:@[[userData valueForKey:@"email"]]]; 
    [myVcardTemp setName:[userData valueForKey:@"name"]]; 
    [xmppvCardTempModule updateMyvCardTemp:myVcardTemp]; 
}); 
} 

UPDATE

- (void)configurePhotoForCell:(CurrentChatCell *)cell user:(XMPPUserCoreDataStorageObject *)user 
{ 
// Our xmppRosterStorage will cache photos as they arrive from the xmppvCardAvatarModule. 
// We only need to ask the avatar module for a photo, if the roster doesn't have it. 

if (user.photo != nil) 
{ 
    cell.imgUser.image = user.photo; 
} 
else 
{ 
    NSData *photoData = [[[AppDelegate delegate] xmppvCardAvatarModule] photoDataForJID:user.jid]; 

    if (photoData != nil) 
     cell.imgUser.image = [UIImage imageWithData:photoData]; 
    else 
     cell.imgUser.image = [UIImage imageNamed:@"userUnknown"]; //Setting a demo image only } 
} 

Я называю этот метод из cell_for_row_at_index вы можете отправить пользовательские данные здесь ,

+0

Спасибо @souvickcse, но я думаю, что это не Anser Я ищу Я ​​заинтересован, чтобы получить зарегистрированных пользователей визитной карточки, а также других пользователей VCards, и я думаю, что лучше использовать fetchvCardTempForJID и игнорируя хранилище, поэтому я могу быть уверен, что получаю новую vCard. Из того, что я вижу, метод, который вы предложили, использует этот метод: vCardTempForJID, и я не знаю, является ли это лучшей альтернативой в использовании этого вместо того, который я использую. Я полагаю, что один из них собирает кэшированную визитную карточку, а другая делает запрос ne, можете ли вы мне помочь? –

+0

Пожалуйста, уточните мой обновленный ответ. В моем проекте я должен показать образ профиля ростера. Вы можете изменить его, чтобы получить другую информацию. – souvickcse

1

Вызвать метод - (NSData *) photoDataForJID: (XMPPJID *) jid в XEP-0153.

NSData *photoData= [[Appdelegate appdelegateobject ]xmppvCardAvatarModule] photoDataForJID:jid]; 
UIImage *img=[UIImage imageWithData:data];