XMPPFramework не отправляет сведения о присутствии

Я разрабатываю приложение для iPhone, одной из функций которого является система мгновенных сообщений с использованием XMPPFramework. Сейчас я тестирую его с помощью Google Talk. Делегат — это тот же класс, который управляет пользовательским интерфейсом. Итак, я получил этот код:

В представленииDidLoad:

- (void)viewDidLoad
{
    [super viewDidLoad];
    [self setupStream];
}

Метод setupStream:

- (void) setupStream
{
    NSLog(@"Inside setupStream");
    xmppStream = [[XMPPStream alloc] init];
    [xmppStream addDelegate:self delegateQueue:dispatch_get_main_queue()];
    [self connect];
}

Способ подключения:

- (BOOL) connect
{
    NSLog(@"Inside connect method");


    General *general = [General sharedManager];//this is a singleton to manage settings for every user
    NSString *chatid;
    NSString *chatpass;

    //chatid=[general user];
    chatid=@"[email protected]";
    xmppStream.myJID=[XMPPJID jidWithString:chatid];

    if (![xmppStream isDisconnected]) {
        return YES;
    }

    NSError *error = nil;
    if (![xmppStream connect:&error])
    {
        UIAlertView *alertView = [[UIAlertView alloc] initWithTitle:@"Error"
            message:[NSString stringWithFormat:@"Can't connect to server %@", [error localizedDescription]]
            delegate:nil
            cancelButtonTitle:@"Ok"
            otherButtonTitles:nil];
        [alertView show];

        return NO;
    }

    return YES;
}

В методе xmppStreamDidConnect:

- (void) xmppStreamDidConnect:(XMPPStream *)sender
{
    [xmppStream authenticateWithPassword:@"password" error:NULL];
    [self goOnline];
}

И метод goOnline:

- (void) goOnline
{
    XMPPPresence *presence = [XMPPPresence presence];
    [[self xmppStream] sendElement:presence];
    NSLog(@"Presence sent");
}

При этом присутствие не отправляется. У меня есть другая учетная запись google, которую я пробую для тестирования (скажем, [email protected]), и в этой учетной записи не видно присутствия somegmailaccount.gmail.com. Обе учетные записи связаны и знают друг друга, так как я использовал эти же учетные записи для разработки приложения для Android.

Любая идея о том, что я делаю неправильно? Любая помощь приветствуется.

Спасибо большое.


person Fustigador    schedule 12.06.2012    source источник


Ответы (2)


Я нашел это! Присутствие не передается таким образом:

XMPPPresence *presence = [XMPPPresence presence];
[[self xmppStream] sendElement:presence];

Insted, я сделал это следующим образом:

NSXMLElement *presence = [NSXMLElement elementWithName:@"presence"];
[xmppStream sendElement:presence];

Таким образом, присутствие отправляется без проблем :)

person Fustigador    schedule 13.06.2012
comment
вы также можете сделать [xmppStream sendElement:presence], где присутствие — это XMPPPresence *, по крайней мере, у меня это сработало только что. XMPPPresence — это просто дочерний элемент XMPPElement, который является дочерним элементом NSXMLElement. См. github.com/robbiehanson/XMPPFramework/wiki/IntroToFramework. - person ChrisC; 13.12.2014

С помощью этого кода я реализую метод xmppStreamDidAuthenticate:(XMPPStream *)sender, и программа ДЕЙСТВИТЕЛЬНО вводит этот метод без какого-либо вызова из моего кода. Но если я поставлю

[xmppStream setHostName:@"talk.google.com"];
[xmppStream setHostPort:5222];

... в методе подключения программа НЕ вводит ни этот метод, ни xmppStreamDidConnect.

Я схожу с ума.

person Fustigador    schedule 12.06.2012