2010-08-10 6 views
3

Quelqu'un peut-il m'aider s'il vous plaît à déchiffrer ce code? Il s'exécute lorsqu'un utilisateur appuie sur un bouton pour envoyer les données, ou dans ce cas, une "question" dans l'application iPhone.Aide à déchiffrer le code de l'application iPhone

Je sais qu'il envoie la chaîne à mon phpscript.php hébergé sur le serveur, mais ce que je ne connais pas, c'est la longue liste de commandes qui se passent.

NSUserDefaults *p = [NSUserDefaults standardUserDefaults]; 
[p setObject:[NSString stringWithContentsOfURL:[NSURL URLWithString:[NSString stringWithFormat:@"http://website.com/phpscript.php?user=%@&pass=%@&cat=%@&sub=%@&body=%@",[[p valueForKey:@"user"] stringByAddingPercentEscapesUsingEncoding:NSASCIIStringEncoding],[[p valueForKey:@"pass"] stringByAddingPercentEscapesUsingEncoding:NSASCIIStringEncoding],sport,@"",[[tvQ.text stringByReplacingOccurrencesOfString:@"\n" withString:@" "] stringByAddingPercentEscapesUsingEncoding:NSASCIIStringEncoding]]]] forKey:@"q"]; 
+11

C'est horrible. Celui qui a écrit cela a besoin de conseils. –

+0

Ce code va juste montrer pourquoi le logiciel devrait être écrit pour être lu par les humains. Oui ça marche, oui c'est tout sur une ligne et il n'y a pas beaucoup de variables en un coup mais ce n'est pas maintenable. En ces jours de compilateurs rapides et optimisés, il n'est probablement pas efficace. Celui qui a écrit ça essayait juste de prouver à quel point il était un programmeur hardcore. – Abizern

+1

Mon développeur a fait cela .... l'application a été achevée, et j'ai pris le relais. Maintenant, essayant de comprendre les choses et de nettoyer. – BigMike

Répondre

8

En le décomposant, c'est un peu plus facile.

NSUserDefaults *p = [NSUserDefaults standardUserDefaults]; 
NSString* string1 = [[p valueForKey:@"user"] stringByAddingPercentEscapesUsingEncoding:NSASCIIStringEncoding]; 
NSString* string2 = [[p valueForKey:@"pass"] stringByAddingPercentEscapesUsingEncoding:NSASCIIStringEncoding]; 
NSString* string3 = [[tvQ.text stringByReplacingOccurrencesOfString:@"\n" withString:@" "] stringByAddingPercentEscapesUsingEncoding:NSASCIIStringEncoding]; 
NSString* urlString = [NSString stringWithFormat:@"http://website.com/phpscript.php?user=%@&pass=%@&cat=%@&sub=%@&body=%@",string1,string2,sport,@"",string3]; 
id val1 = [NSString stringWithContentsOfURL:[NSURL URLWithString:urlString]]; 
[p setObject:val1 forKey:@"q"]; 

donc p est un objet dictionnaire chargé de paramètres utilisateur par défaut, ressemble à des informations de connexion qui sont probablement enregistrés depuis la dernière fois l'application a été exécuté. StringByAddingPercentEscapesUsingEncoding est une méthode standard qui permet de transmettre en toute sécurité des caractères tels que '' (espace) ou '%' dans une requête. Il est appliqué aux chaînes pour garantir que la requête atteindra le serveur à la recherche de l'intention.

String1 et String2 sont vraisemblablement le nom d'utilisateur et les mots de passe. String3 est le corps de la requête je suppose. Lorsque l'URL est construite, elle exécute la requête représentée par urlString (le code s'arrêtera à ce moment pendant l'exécution du fetch - j'espère que ce bloc entier est déjà sur un thread secondaire). Le résultat de la requête est stocké dans le dictionnaire p et est accessible via une clé @ "q".

Manipulation esperluette explicitement:

[myString replaceOccurrencesOfString:@"&" withString:@"%26" options:NSCaseInsensitiveSearch range:wholeString]; 

Cette méthode peut être appliquée à toute chaîne - si elle est appliquée à la même chaîne deux fois, puis la deuxième fois, il ne fera rien.

+0

Adam, c'est génial. Je vous remercie. Y at-il quelque part ici je peux l'avoir accepter l'esperluette (&) afin que je puisse le passer à mon script php? Je vois qu'il encode d'autres caractères spéciaux. – BigMike

+0

Dans http: // stackoverflow.com/questions/705448/iphone-sdk-problème-avec-ampersand-dans-le-url-chaîne, Roger Nolan a donné un exemple de code qui gérera tout ce que stringByAddingPercentEscapesUsingEncoding ne fait pas. Mais si vous voulez juste '&' - vous pouvez utiliser "% 26". Voir la ligne de code ajoutée à la réponse. –

+0

Adam, désolé de ne pas être au top, mais si je voulais couvrir toutes mes bases, avec l'exemple de Roger Nolan, où est-ce que je branche l'exemple de code "NSMutableString * échappé" dans le code propre fourni ci-dessus? – BigMike

3

Il crée une chaîne à partir du tvQ.text qui remplace toutes les nouvelles lignes avec un espace vide, il crée alors la chaîne à la recherche URL en utilisant la chaîne ci-dessus et d'autres, il prend (valeurs dans les paramètres utilisateur par défaut, de l'apparence des choses). Il fixe ensuite les pourcentages d'échappement dans cette chaîne d'URL, puis crée un objet NSURL à partir de NSString. Ce NSURL est ensuite défini comme l'objet de la clé "q" dans les valeurs par défaut de l'utilisateur.

et ça me fait mal à la tête.

+0

Oui, j'avais déjà mal à la tête. De toute façon pour nettoyer ça? J'ai un problème d'une esperluette (&) qui n'est pas transmise à mon script php, qui est ensuite inséré dans ma base de données. La chaîne est coupée. Par exemple, si je tape "hello & goodbye" dans l'application, cela ne finit que de transmettre "hello" à mon script, qui est placé dans la base de données. – BigMike