2010-09-21 3 views
2

Ce problème me donne de sérieux maux de tête, je n'ai aucune idée de ce qui se passe ici. Si vous n'avez aucune expérience avec le réseau Windows Live, je vous demande de le lire de toute façon, peut-être que cela n'a rien à voir avec ça et que je néglige quelque chose de totalement différent. En bref: J'ai écrit une classe Objective-C qui me permet de me connecter au réseau Windows Live Messenger, appelé WLNotificationSession. Je travaille très simple, j'ai mis les variables username et password et faire [notificationSession start];. Il se connecte ensuite avec succès.Impossible de se connecter au réseau Windows Live Messenger

Disons que j'ai deux comptes Windows Live. Le premier, A, est maintenant connecté.

Le problème se pose lorsque je tente de tirer jusqu'à une secondeWLNotificationSession, avec l'autre compte Windows Live, B. Il échoue toujours. Les noms d'utilisateur et les mots de passe sont 100% corrects. Lorsque j'essaie de me connecter en premier, ça réussit. Lorsque j'essaie A pendant que B est connecté, il échoue. La deuxième session de connexion échoue toujours.

Cela ne peut pas être quelque chose comme "trop ​​de tentatives de connexion dans un court laps de temps". Lorsque je me connecte à A, quittez l'application, redémarrez l'application et reconnectez-vous à A, les deux tentatives réussissent. Je peux le faire en 20 secondes. Mais, quand je lance l'application, connectez-vous A, débranchez A, attendez 2 heures, connectez-vous B (tout sans fermer l'application), échoue. (??)

Pour ceux d'entre vous qui ont de l'expérience avec le réseau WL: la panne se produit pendant l'authentification Tweener. La partie où vous obtenez l'en-tête HTTP "Authentication-Info" ou "WWW-Authenticate" du serveur de connexion. Quand il échoue, j'obtiens cette valeur: "Www-Authenticate" = "Passport1.4 da-status=failed-noretry,srealm=Passport.NET,ts=-2,prompt,cburl=http://messenger.msn.com/images/logo102x88.gif,cbtxt=.NET%20Messenger%20Service";

J'espère vraiment que quelqu'un peut aider avec ceci. Je vous remercie.

MISE À JOUR Ceci est un exemple de code. Je crée un nouveau projet, ajoutez ce code dans la méthode applicationDidFinishLaunching et cliquez sur Créer & Run:

WLNotificationSession *notificationSession1 = [[WLNotificationSession alloc] init];

notificationSession1.username = @"[email protected]";

notificationSession1.password = @"testpwd";

[notificationSession1 start];

WLNotificationSession *notificationSession2 = [[WLNotificationSession alloc] init];

notificationSession2.username = @"[email protected]";

notificationSession2.password = @"testpwd";

[notificationSession2 start];

notificationSession1 réussit toujours, notificationSession2 échoue toujours. Pas de variables globales ou de variables partagées.

MISE À JOUR 2

Suite à la suggestion de David le problème pourrait être lié cookie, j'ai ajouté ce code à mon projet: [[NSHTTPCookieStorage sharedHTTPCookieStorage] setCookieAcceptPolicy:NSHTTPCookieAcceptPolicyNever];

J'utilise aussi sa méthode dans les commentaires ci-dessous pour supprimer tous les cookies avant et après chaque requête d'URL. C'est probablement inutile, mais je le fais quand même.

Je pense qu'à ce stade, il est prudent de supposer que ce ne sont pas les cookies, ou qu'il doit y avoir un autre endroit où les cookies sont stockés.

+0

Est-ce que vous réutilisez la même instance de WLNotificationSession ou en créez une nouvelle? Il est possible que certaines variables d'état ne soient pas réinitialisées entre les tentatives de connexion. Même si vous utilisez une nouvelle instance, stockez-vous l'état dans des variables statiques ou des variables globales? Ou un autre endroit en dehors des ivars qui pourrait persister? –

+0

C'est ce que vous penseriez, mais non, j'utilise des instances distinctes de WLNotificationSession, chacune avec leurs propres socket et variables. En outre, pas de variables statiques ou globales du tout. (J'ai ajouté un exemple de code dans la question) – Rits

+0

Quelle structure/classe utilisez-vous pour la connexion? Et qu'est-ce que vous envoyez? Seulement login et mot de passe? – David

Répondre

1

Aucune variables globales ou des variables partagées quels qu'ils soient

Puis, comme l'authentification est effectuée en utilisant demande http, ce qui pourrait être question de cookie. Il peut y avoir un cookie de session rappelant au serveur l'ancienne session.

Je sais que FBConnect (API Facebook pour iPhone) utilise la méthode suivante lors de la connexion pour enlever tout cookie:

- (void)deleteFacebookCookies { 
    NSHTTPCookieStorage* cookies = [NSHTTPCookieStorage sharedHTTPCookieStorage]; 
    NSArray* facebookCookies = [cookies cookiesForURL:[NSURL URLWithString:@"http://login.facebook.com"]]; 
    for (NSHTTPCookie* cookie in facebookCookies) { 
    [cookies deleteCookie:cookie]; 
    } 
} 

Vous pouvez essayer (remplacer url facebook avec le vôtre). Vous pourriez même ajouter quelques NSLogs pour surveiller ces cookies.

+0

Eh bien, cela a certainement du sens pour moi et j'espérais que ce serait le problème ... mais malheureusement, le problème persiste. J'utilise votre code pour supprimer tous les cookies tout le temps, et j'utilise ceci: [[NSHTTPCookieStorage sharedHTTPCookieStorage] setCookieAcceptPolicy: NSHTTPCookieAcceptPolicyNever]; 'Je pense que cela devrait éliminer la possibilité de cookies qui gâchent, non? – Rits

+0

Peu importe. Ça marche. La chose de cookie a fait l'affaire. Merci beaucoup l'homme. – Rits

Questions connexes