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.
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? –
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
Quelle structure/classe utilisez-vous pour la connexion? Et qu'est-ce que vous envoyez? Seulement login et mot de passe? – David