Méthodes de AppDelegate ne sont pas appelées

AliAli Membre
juin 2013 modifié dans API UIKit #1

Bonjour tout le monde,


Je développe actuellement une application avec une partie chat. J'utilise le xmppFramework. le problème c'est que les méthodes définies dans mon appDelegate ne sont à  aucun moment appelées B)


 


Voici le code de mon 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];


Voici le code de ma classe 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);
}

}
 

Si vous voyez comment faire régler ce problème, n'hesitez pas à  me faire part de vos points de vue.


 


Best regards


 


   


Mots clés:

Réponses

  • AliGatorAliGator Membre, Modérateur
    Bonjour,

    Je t'invite à  éditer ton message pour :
    • Mettre le sujet du message en français. cocoacafe.fr est un forum francophone. (c'est quoi cette manie qu'ont certains membres ces derniers temps de mettre le titre de leur question en anglais ?)
    • Clarifier ton message. Je ne vois pas le rapport entre xmppFramework (et surtout l'intérêt de mettre tout ce code autour de ton utilisation de ce framework) et les "méthodes de AppDelegate" c'est à  dire les méthodes définies dans le protocole <UIApplicationDelegate> comme "application:didFinishLaunchingWithOptions:" & co
    • Nous dire ce que tu as essayé, par où ton code passe, etc... car j'ose espérer que tu as débugué un peu ton code par toi-même, mis des breakpoints et des logs, regardé la valeur des diverses variables et les méthodes appellées, etc... pour essayer de mieux centrer le problème. Et simplifier ton post (qui est plutôt long et donc pas très motivant à  lire) pour ne citer que le nécessaire et se concentrer sur le code qui te pose problème.
  • AliAli Membre


    Bonjour,


    Je t'invite à  éditer ton message pour :


    • Mettre le sujet du message en français. cocoacafe.fr est un forum francophone. (c'est quoi cette manie qu'ont certains membres ces derniers temps de mettre le titre de leur question en anglais ?)
    • Clarifier ton message. Je ne vois pas le rapport entre xmppFramework (et surtout l'intérêt de mettre tout ce code autour de ton utilisation de ce framework) et les "méthodes de AppDelegate" c'est à  dire les méthodes définies dans le protocole <UIApplicationDelegate> comme "application:didFinishLaunchingWithOptions:" & co
    • Nous dire ce que tu as essayé, par où ton code passe, etc... car j'ose espérer que tu as débugué un peu ton code par toi-même, mis des breakpoints et des logs, regardé la valeur des diverses variables et les méthodes appellées, etc... pour essayer de mieux centrer le problème. Et simplifier ton post (qui est plutôt long et donc pas très motivant à  lire) pour ne citer que le nécessaire et se concentrer sur le code qui te pose problème.

     




     


     


    Par rapport aux méthodes implémentées dans AppDelegate, c'est pour vous donner une idée de ce qu'il y a dans cette classe. De mon coté, lorsque je lance l'application et plus précisément je passe par la classe chatViewController, les méthodes de xmppframework implémentées dans la classe AppDelegate ne sont pas appelées carrément (à  part la méthode connect qui est appelée en dur dans la méthode application:didFinishLaunchingWithOptions: ). Ce que je n'arrive pas à  comprendre c'est Pourquoi ces méthodes là  ne sont pas appelées à  aucun moment de la vie de l'application.


    Voilà 

  • AliGatorAliGator Membre, Modérateur
    Ok donc ça n'a rien à  voir avec les méthodes de UIApplicationDelegate, c'était pas clair dans ton message... tu parles de méthodes que tu as (bizarrement) mises dans l'objet AppDelegate (qui est sensé être utilisé surtout comme delegate de ton UIApplication, pas pour y mettre tout et n'importe quoi... mais bon). Ce n'est pas une bonne pratique, mais bon ça ne devrait pas empêcher les choses de marcher.

    Et donc, tu n'as pas répondu à  ma question, qu'as-tu essayé, que donnent tes tests avec les breakpoints, les valeurs des variables... et surtout, pourquoi tu voudrais que ces méthodes soient magiquement appelées ? Tu as bien indiqué qqpart qui était le delegate de ton XMPPStream par exemple, etc ?

    Je reste sur l'impression que tu confonds AppDelegate et delegate de manière générale et ne comprend pas comment le pattern delegate fonctionne (pourtant un pattern de base pour faire du Cocoa)
  • NackuNacku Membre

    Ah oui effectivement tu sembles confondre.


     


    J'ai trouvé un site qui explique comment fonctionne un delegate en objective c


     


    http://enroyed.com/ios/delegation-pattern-in-objective-c-and-writing-custom-delegates/


  • AliAli Membre

    Merci pour vos réponses,


     




    Ok donc ça n'a rien à  voir avec les méthodes de UIApplicationDelegate, c'était pas clair dans ton message... tu parles de méthodes que tu as (bizarrement) mises dans l'objet AppDelegate (qui est sensé être utilisé surtout comme delegate de ton UIApplication, pas pour y mettre tout et n'importe quoi... mais bon). Ce n'est pas une bonne pratique, mais bon ça ne devrait pas empêcher les choses de marcher.


    Et donc, tu n'as pas répondu à  ma question, qu'as-tu essayé, que donnent tes tests avec les breakpoints, les valeurs des variables... et surtout, pourquoi tu voudrais que ces méthodes soient magiquement appelées ? Tu as bien indiqué qqpart qui était le delegate de ton XMPPStream par exemple, etc ?


    Je reste sur l'impression que tu confonds AppDelegate et delegate de manière générale et ne comprend pas comment le pattern delegate fonctionne (pourtant un pattern de base pour faire du Cocoa)




    J'attendais des résultats déterminés en essayant de lancer mon application. En fait non rien ne ce passe. En mettant des breakpoints sur les méthodes écrites dans la classe AppDelegate, le compilateur ne s'arrête même pas :s (à  part la méthode connect qui renvoie YES car elle est appelé directement dans le code )


    Bah, je m'attendais à  que les méthodes soient appelées car dans une autre classe de mon application, j'ai écrit:



    - (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);
    }

    }



    Ah oui effectivement tu sembles confondre.


     


    J'ai trouvé un site qui explique comment fonctionne un delegate en objective c


     


    http://enroyed.com/ios/delegation-pattern-in-objective-c-and-writing-custom-delegates/




    Merci, vraiment ça éclaire bien les idées avec des exemples super sympa.

Connectez-vous ou Inscrivez-vous pour répondre.