XMPPFramework不发送在线状态

时间:2012-06-12 11:16:52

标签: iphone xcode xmppframework

我正在为iPhone开发一个应用程序,其中一个功能是使用XMPPFramework的即时消息系统。到目前为止,我正在使用Google Talk进行测试。委托是管理用户界面的同一个类。所以,我得到了这段代码:

在viewDidLoad中:

- (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=@"somegmailaccount@gmail.com";
    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");
}

这样,就不会发送状态。我有另一个谷歌帐户,我尝试测试(比如,testing @ gmail.com),在这个帐户中没有看到somegmailaccount.gmail.com的存在。这两个帐户都是相互关联的,因为我使用相同的帐户来开发Android应用程序。

对我做错了什么的想法?任何帮助表示赞赏。

非常感谢。

2 个答案:

答案 0 :(得分:6)

我找到了!存在不是以这种方式发送的:

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

相反,我这样做了:

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

通过这种方式,可以毫无问题地发送状态:)

答案 1 :(得分:0)

使用此代码,我实现方法xmppStreamDidAuthenticate:(XMPPStream *)sender  并且程序DO输入该方法而没有来自我的代码的任何调用。但是,如果我把

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

...在方法连接中,程序不要输入该方法,也不要输入xmppStreamDidConnect。

我生气了。