Методы AppDelegate не вызываются

Я пытаюсь создать приложение для чата jabber, используя xmppframework. Я реализовал методы xmppStream в applicationAppDelegate, но ни один из этих методов не был вызван.

Вот код приложенияAppDelegate:

    - (void)setupStream {
    xmppStream = [[XMPPStream alloc] init];
    [xmppStream addDelegate:self delegateQueue:dispatch_get_main_queue()];
    //[self connect];
}
- (void)goOnline {
    XMPPPresence *presence = [XMPPPresence presence];
    [[self xmppStream] sendElement:presence];
}
- (void)goOffline {
    XMPPPresence *presence = [XMPPPresence presenceWithType:@"unavailable"];
    [[self xmppStream] sendElement:presence];
}

- (BOOL)connect {
    [self setupStream];


    NSString *emailUserDefault = [[NSUserDefaults standardUserDefaults] stringForKey:@"email"];

    NSString *jabberID = [emailUserDefault stringByAppendingString:@"@server.local"];
    NSLog(@"%@",jabberID);
    NSString *myPassword = [[NSUserDefaults standardUserDefaults] stringForKey:@"password"];
    NSLog(@"%@",myPassword);

    if (![xmppStream isDisconnected]) {
        NSLog(@"You are connected");

        return YES;
    }
    if (jabberID == nil || myPassword == nil) {
        return NO;
    }
    [xmppStream setMyJID:[XMPPJID jidWithString:jabberID]];
    //xmppStream.myJID = [XMPPJID jidWithString:jabberID];
    password = myPassword;

    NSError *error = nil;
    if (![xmppStream connectWithTimeout:20 error:&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;
}
- (void)disconnect {
    [self goOffline];
    [xmppStream disconnect];
}
- (void)xmppStreamDidConnect:(XMPPStream *)sender {
    isOpen = YES;
    NSError *error = nil;
    [[self xmppStream] authenticateWithPassword:password error:&error];
}
- (void)xmppStreamDidAuthenticate:(XMPPStream *)sender {
    [self goOnline];
}
- (void)xmppStream:(XMPPStream *)sender didReceivePresence:(XMPPPresence *)presence {
    NSString *presenceType = [presence type]; // online/offline
    NSString *myUsername = [[sender myJID] user];
    NSString *presenceFromUser = [[presence from] user];
    if (![presenceFromUser isEqualToString:myUsername]) {
        if ([presenceType isEqualToString:@"available"]) {
            [__chatDelegate newBuddyOnline:[NSString stringWithFormat:@"%@@%@", presenceFromUser, @"server.local"]];
        } else if ([presenceType isEqualToString:@"unavailable"]) {
            [__chatDelegate buddyWentOffline:[NSString stringWithFormat:@"%@@%@", presenceFromUser, @"server.local"]];
        }
    }
}
- (void)xmppStream:(XMPPStream *)sender didReceiveMessage:(XMPPMessage *)message {
    NSString *msg = [[message elementForName:@"body"] stringValue];
    NSString *from = [[message attributeForName:@"from"] stringValue];
    NSMutableDictionary *m = [[NSMutableDictionary alloc] init];
    [m setObject:msg forKey:@"msg"];
    [m setObject:from forKey:@"sender"];
    [__messageDelegate newMessageReceived:m];

}

Вот мой код для класса chatViewController:

- (myApplicationAppDelegate *)appDelegate {
    return (myApplicationAppDelegate *)[[UIApplication sharedApplication] delegate];
}
- (XMPPStream *)xmppStream {
    return [[self appDelegate] xmppStream];
}

- (void)viewDidLoad
{
    [super viewDidLoad];
    onlineBuddies = [[NSMutableArray alloc ] init];
    myApplicationAppDelegate *del = [self appDelegate];
    [self xmppStream];
    NSString *login = [[NSUserDefaults standardUserDefaults] objectForKey:@"email"];
    del._chatDelegate = self;
    if (login) {
        if ([[self appDelegate] connect]) {
            NSLog(@"show buddy list");
        }
    } else {
        NSLog(@"Login Error");
    }

}

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

Заранее спасибо.


person Ali    schedule 23.06.2013    source источник


Ответы (1)


Я думаю, вы неправильно поняли цель AppDelegate. Прежде всего, для каждого приложения iOS, которое вы создаете в Xcode, создается класс, содержащий имя AppDelegate, но этот класс следует использовать только для получения информации о состоянии вашего приложения, например, переходит ли приложение в фоновый режим, если оно запущено. с успехом или если это происходит из фона. Также делегат приложения используется для указания корневого (или точки входа) контроллера представления вашего приложения.

Поэтому я думаю, что вы должны сначала проверить основные правила (или базовый учебник) о том, как создать очень простое приложение («Приложение Hello World»), после чего вы можете двигаться вперед и создать базовую структуру вашего приложения и решить, что контроллер представления или какие классы модели будут обрабатывать вашу обработку соединения и синтаксический анализ ответа/запроса.

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

P.S. Последнее, обратите внимание на "Именование iOS и другие соглашения"введите описание ссылки здесьlife циклические методы

person danypata    schedule 23.06.2013