Développement application client/serveur via une API

PierrePierre Membre
19:24 modifié dans Vos applications #1
Bonjour à  tous, je me présente Pierre Ammeloot. Je suis nouveau sur ce forum.

Je commence à  développer sur iPhone depuis une petite semaine.

L'objectif est de créer une application client/serveur qui dialogue avec une API.

Cette application permettras de lister des pays, ainsi que les grandes villes de chacun des pays.

Cette API demande une authentification "Basic Access Authentication" (http://en.wikipedia.org/wiki/Basic_access_authentication).

On l'appel avec une adresse du type :

http://api.monsite.com/pays/list/xml

Qui renvoie une arborescence XMl de type :

<payss>
    <pays>
        <nom>France</nom>
        <nb_habitants>65 m</nb_habitants>
        ...
    </pays>
    <pays>
        ...
    </pays>
    ...
</payss>

J'ai commencé par regarder comment faire pour faire une requête HTTP et "parser" la réponse XML. J'ai réussi à  le faire sur un fichier simple.

Par contre le code que j'ai trouvé ne gère par l'authentification.

J'ai donc regardé du côté des classes Twitter pour iPhone, j'en ai trouvé une : MGTwitterEngine que je suis en train d'essayer d'adapter à  mes besoins.

Apparemment (debug avec NSLog) j'arrive à  appeler le fichier XML par contre je n'arrive pas à  récupérer le résultat du "parser" sous forme d'objet Objective-C.

Je ne sait pas si ce que je fait comme modification/adaptation de la classe va dans le bon sens ou si je suis en train de m'embrouiller.

Est-ce que j'ai fait le bon choix en me tournant vers MGTwitterEngine ?

Existe-il des classes plus simples d'accès (et mieux documenté que MGT) pour faire des appel clients serveurs (gérant l'authentification et SSL) ?

Aujourd'hui si j'arrive à  faire un cycle complet (appel à  l'API avec une adresse de mon choix, récupération du XML, "parsage" et transformation en objet Objective-C) alors je pense être capable d'adapter la procédure pour l'ensemble des appel à  l'API.

Est-ce que vous pouvez m'aider ? Me conseiller ?

Je vous remercie d'avance,

Cordialement,
Pierre Ammeloot

Réponses

  • AliGatorAliGator Membre, Modérateur
    19:24 modifié #2
    Si je dit pas de bétise les classes Cocoa gèrent l'authentification "Basic".
    Il suffit d'implémenter les bonnes méthodes, en particulier les méthodes relatives à  "Connection Authentication" dans NSURLConnection.

    Tout est de toute façon expliqué en détail, comme toujours, dans les programming guides (en l'occurrence celui du URL Loading System, référencé entre autres dans la doc de NSURLConnection)
  • PierrePierre Membre
    19:24 modifié #3
    Bonjour AliGator, je vais suivre tes conseils et effectuer des tests dès demain matin.

    A bientôt,
    Pierre
  • AliGatorAliGator Membre, Modérateur
    19:24 modifié #4
    Et bienvenue sur PommeDev au passage :)
  • PierrePierre Membre
    19:24 modifié #5
    Bonjour,

    Merci AliGator pour l'accueil. :)

    J'ai suivi ta piste mais je bloque sans trop comprendre ce qu'il se passe, dans mon fichier RootViewController.view j'ai le code suivant :

    <br />@implementation RootViewController<br /><br /><br />- (void)viewDidLoad {<br />&nbsp;  <br />	tableau = [[NSMutableArray alloc] init];	<br /><br />	//NSURL *url = [NSURL URLWithString: @&quot;http://localhost:80/xml/contacts-test.xml&quot;];<br />	<br />	NSString *username = @&quot;user&quot;;<br />	NSString *password = @&quot;pass&quot;;<br />	NSString *urlString = @&quot;myproject/api_dev.php/pays/list&quot;; <br />	NSURL *url = [NSURL URLWithString: [NSString stringWithFormat:@&quot;%@://%@&quot;, @&quot;http&quot;, urlString]];<br />	<br />	NSURLCredential *credential = [NSURLCredential credentialWithUser: username password: password persistence: NSURLCredentialPersistenceForSession];<br />	NSURLProtectionSpace *protectionSpace = [[NSURLProtectionSpace alloc] initWithHost: urlString port: 80 protocol: @&quot;http&quot; realm: nil authenticationMethod: NSURLAuthenticationMethodHTTPBasic];<br />	[[NSURLCredentialStorage sharedCredentialStorage] setDefaultCredential: credential forProtectionSpace: protectionSpace];<br />	[protectionSpace release];<br />	NSURLRequest *request = [NSURLRequest requestWithURL: url cachePolicy: NSURLRequestReloadIgnoringLocalCacheData timeoutInterval: 60.0];<br />	[NSURLConnection connectionWithRequest: request delegate: self];<br />	<br />	XMLToObjectParser *myParser = [[XMLToObjectParser alloc] parseXMLAtURL:url toObject:@&quot;pays&quot; parseError:nil];<br />	<br />	//XMLToObjectParser *myParser = [[XMLToObjectParser alloc] parseXMLAtURL:url toObject:@&quot;Contact&quot; parseError:nil];<br />	<br />	for(int i = 0; i &lt; [[myParser items] count]; i++) {<br />		Contact *new = [[Contact alloc] init];<br />		new = (Contact *)[[myParser items] objectAtIndex:i];<br />		[tableau addObject:new];<br />		[new release];<br />	}<br />	 [super viewDidLoad];<br />}<br />


    L'erreur renvoyé est :

    WARNING: Using legacy cell layout due to delegate implementation of tableView:accessoryTypeForRowWithIndexPath: in <RootViewController: 0x3e1e350>.  Please remove your implementation of this method and set the cell properties accessoryType and/or editingAccessoryType to move to the new cell layout behavior.


    Je n'arrive pas à  l'interpréter. Comment sait-on le fichier concerné et la ligne ? Désolé mes questions doivent paraitre trivial mais je débute sous XCode. :)

    Pourtant si je dé-commente l'URL "http://localhost:80/xml/contacts-test.xml"; le fichier de test est bien chargé et affiché par le simulateur.
    Je bloque donc au niveau de l'authentification sans vraiment comprendre ce qui se passe derrière.

    Si quelqu'un à  une piste je suis preneur.

    D'avance merci et bonne journée. ;)
    Pierre
  • AliGatorAliGator Membre, Modérateur
    19:24 modifié #6
    Heu je comprend pas trop le lien entre le warning que tu as et le mécanisme d'authentification.

    Le warning parle de cell layout sur tableView:accessoryTypeForRowWithIndexPath; et tout : ce sont des méthodes relatives à  une UITableView, pour remplir cette dernière. Le warning dit, en substance, que tu as apparemment implémenté la méthode "tableView:accessoryTypeForRowWithIndexPath:" dans ton RootViewController, alors que maintenant (depuis je ne sais pas trop quelle version du SDK), ils précaunisent plutôt d'utiliser les propriétés accessoryType et editingAccessoryType sur tes UITableViewCells.

    Donc en gros rien à  voir avec la problématique de credentials et d'authentication pour ta requête HTTP.

    Maintenant, je ne sais pas trop si ton code pour t'authentifier sur ton serveur est bon, perso j'ai jamais fait comme ça (mais j'ai rarement eu où utiliser l'authentification en même temps...). Je pensais plutôt qu'il fallait implémenter les méthodes connection:didRequestAuthentication:blabla de NSURLConnection que je t'ai citées plus haut (qui sont appellées quand le serveur a besoin d'une authentification, et te la demande donc explicitement). Maintenant ta méthode fonctionne sans doute aussi (je sais pas je me suis pas penché dessus), et permet de forcer l'authentifaction même si le serveur ne la demande pas (par exemple s'il autorise les connections sans authentifications, et retourne alors des données "publiques", aussi bien qu'il supporte les connections avec auth, et dans ce cas retournera les données privées propres à  l'utilisateur, je sais pas).

    En tout cas le warning n'est à  priori pas lié à  ton pb.
  • PierrePierre Membre
    19:24 modifié #7
    Bonjour AliGator, et merci pour ces réponses.

    Si je comprend bien il n'est pas possible de connaà®tre la ligne de code qui pose problème lorsque la console renvoie un erreur, c'est ça ?

    Ce que je ne comprend pas c'est que cette erreur n'apparaà®t pas quand j'appelle un "bête" fichier XML qui ne demande pas à  être authentifier.  :)
    Sûrement que le fait de ne pas arriver à  récupérer le flux XML fait que ça plante.

    J'ai été voir les liens que tu m'as fournis mais je t'avoue que je n'ai aucune idée de ce qu'il faut faire concrètement. La doc. explique plein de choses mais sans code d'exemples et je ne suis pas encore assez à  l'aise avec le dév. Objective-C pour comprendre ce qu'il faut faire.

    Il faut que je reprenne les fonctions :
    – connection:canAuthenticateAgainstProtectionSpace:  delegate method
    – connection:didCancelAuthenticationChallenge:  delegate method
    – connection:didReceiveAuthenticationChallenge:  delegate method
    – connectionShouldUseCredentialStorage:  delegate method

    Et que je les surcharge dans mon code ?

    Je suis un peu perdu... Désolé de poser ce genre de question, mais si j'ai loupé un épisode je suis preneur de tutos complémentaires pour approfondir ma connaissance de l'Objective-C qui est déroutant. ;)

    Merci encore pour ton aide,
    Pierre
  • lgriffielgriffie Membre
    19:24 modifié #8
    Oui tu as juste à  implémenter ces méthodes dans le fichier .m de l'objet déclarait comme delegate NSURLConnection. Comme tu le ferais pour les delegate méthode d'un UITableView.

  • PierrePierre Membre
    19:24 modifié #9
    @lgriffie merci pour ce conseil, j'ai donc le code suivant :

    <br />//&nbsp; RootViewController.h<br />//&nbsp; Xmlparser<br />//<br /><br />@interface RootViewController : UITableViewController &lt;NSURLConnection&gt; {<br />	NSMutableArray *tableau;<br />}<br /><br />- (BOOL)connection:(NSURLConnection *)connection canAuthenticateAgainstProtectionSpace:(NSURLProtectionSpace *)protectionSpace;<br />- (void)connection:(NSURLConnection *)connection didCancelAuthenticationChallenge:(NSURLAuthenticationChallenge *)challenge;<br />- (void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error;<br />- (void)connection:(NSURLConnection *)connection didReceiveAuthenticationChallenge:(NSURLAuthenticationChallenge *)challenge;<br />@end<br />


    et
    <br />//<br />//&nbsp; RootViewController.m<br />//&nbsp; Xmlparser<br />//<br /><br />#import &quot;RootViewController.h&quot;<br />#import &quot;Foundation/NSURLConnection.h&quot;<br />#import &quot;XMLToObjectParser.h&quot;<br />#import &quot;Contact.h&quot;<br />#import &quot;ContactViewController.h&quot;<br /><br />@implementation RootViewController<br /><br />- (void)viewDidLoad {<br />&nbsp;  <br />	tableau = [[NSMutableArray alloc] init];<br /><br />	//Exemple de fichier de test avec des informations de contacts.<br />	//NSURL *url = [NSURL URLWithString: @&quot;http://www.jkraft.fr/testXml.xml&quot;];<br />	//NSURL *url = [NSURL URLWithString: @&quot;http://dl.dropbox.com/u/2928702/contacts-test.xml&quot;]; <br />	<br />	NSString *username = @&quot;user&quot;;<br />	NSString *password = @&quot;password&quot;;<br />	NSString *urlString = @&quot;myproject/api_dev.php/contact/list&quot;; <br />	NSURL *url = [NSURL URLWithString: [NSString stringWithFormat:@&quot;%@://%@&quot;, @&quot;http&quot;, urlString]];<br />	<br />	NSURLCredential *credential = [NSURLCredential credentialWithUser: username password: password persistence: NSURLCredentialPersistenceForSession];<br />	NSURLProtectionSpace *protectionSpace = [[NSURLProtectionSpace alloc] initWithHost: urlString port: 80 protocol: @&quot;http&quot; realm: nil authenticationMethod: NSURLAuthenticationMethodHTTPBasic];<br />	<br />	[[NSURLCredentialStorage sharedCredentialStorage] setDefaultCredential: credential forProtectionSpace: protectionSpace];<br />	<br />	NSURLRequest *request = [NSURLRequest requestWithURL: url cachePolicy: NSURLRequestReloadIgnoringLocalCacheData timeoutInterval: 60.0];<br />	<br />	if(self connection:[NSURLConnection connectionWithRequest: request delegate: self] canAuthenticateAgainstProtectionSpace: protectionSpace) {<br />		XMLToObjectParser *myParser = [[XMLToObjectParser alloc] parseXMLAtURL:url toObject:@&quot;contact&quot; parseError:nil];<br />		<br />		for(int i = 0; i &lt; [[myParser items] count]; i++) {<br />			Contact *new = [[Contact alloc] init];<br />			new = (Contact *)[[myParser items] objectAtIndex:i];<br />			[tableau addObject:new];<br />			[new release];<br />		}<br />	}<br />	else {<br />		NSLog(@&quot;Error ! &quot;);<br />	}<br />		<br />	[protectionSpace release];<br />	[super viewDidLoad];<br />}<br /><br />- (BOOL)connection:(NSURLConnection *)connection canAuthenticateAgainstProtectionSpace:(NSURLProtectionSpace *)protectionSpace {<br />	return true;<br />}<br />- (void)connection:(NSURLConnection *)connection didCancelAuthenticationChallenge:(NSURLAuthenticationChallenge *)challenge {<br />}<br />- (void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error {<br />}<br />- (void)connection:(NSURLConnection *)connection didReceiveAuthenticationChallenge:(NSURLAuthenticationChallenge *)challenge {<br />}<br />...<br />


    Juste après :
    #import "RootViewController.h"

    J'ai l'erreur suivante :
    error: cannot find protocol declaration for 'NSURLConnection'
    :(

    Et la fonction "connection" n'est pas reconnue par XCode.

    Qu'est-ce que j'ai pas fait correctement ? Le delegate dans le .h est mal fait ? (pourtant aucune erreur dans le .h)

    Merci encore pour votre aide,
    Pierre
  • AliGatorAliGator Membre, Modérateur
    19:24 modifié #10
    NSURLConnection n'est pas un protocole.
    Or tu as déclaré <NSURLConnection> dans l'interface de ta classe dans ton .h, donc il cherche un protocole de ce nom... et ne le trouve pas, d'où l'erreur.

    Il se trouve que, comme c'est une classe qui existe depuis longtemps (à  l'époque où les @protocol n'existaient pas, en Objective-C 1.0), il n'y a pas de @protocol formel à  proprement parler pour ces méthodes : c'est un protocole informel.
    Cela veut dire que tu as juste à  implémenter les méthodes dans ton objet qui te sert de delegate (comme tu l'as fait dans ton RootViewController, si c'est bien lui le delegate de ton objet NSURLConnection évidemment) mais tu n'as pas à  déclarer que tu te conformes à  un protocole particulier comme NSURLConnection (puisque ledit protocole n'existe pas -- de toute façon s'il existait il s'appellerait plutôt NSURLConnectionDelegate, mais bon)



    Pour le warning : si c'est un warning que tu as à  la compilation, la ligne qui pose problème te sera indiquée. Tu peux même double-cliquer sur le warning pour qu'il te mène à  la ligne de code. Si c'est un warning à  l'exécution, alors tu n'auras pas la ligne qui correspond, c'est une erreur de runtime qui n'est plus trop dépendante du code source. C'est rare comme type de warning (en général c'est plutôt à  la compilation), mais bon t'es tombé dessus :P
  • PierrePierre Membre
    19:24 modifié #11
    @AliGator : je ne suis pas sur d'avoir compris tout ce que tu explique. ;)

    Je pense savoir ce qui envoie un Warning mais aucune idée de la manière de corriger ça. J'utilise à  priori une méthode "deprecated" pour donner du texte à  une cellule. Le Warning n'empêche pas la bonne exécution du script, je chercherais donc comment régler le problème après. ;)

    J'essaie de faire que mon code s'authentifie auprès de l'API avec le code suivant :

    <br />//<br />//&nbsp; RootViewController.m<br />//&nbsp; Xmlparser<br />//<br /><br />#import &quot;RootViewController.h&quot;<br />#import &quot;Foundation/NSURLConnection.h&quot;<br />#import &quot;XMLToObjectParser.h&quot;<br />#import &quot;Contact.h&quot;<br />#import &quot;ContactViewController.h&quot;<br /><br />@implementation RootViewController<br /><br />- (void)viewDidLoad {<br />&nbsp;  <br />	tableau = [[NSMutableArray alloc] init];<br />	//NSURL *url = [NSURL URLWithString: @&quot;http://dl.dropbox.com/u/2928702/contacts-test.xml&quot;];<br />	<br />	NSString *username = @&quot;user&quot;;<br />	NSString *password = @&quot;password&quot;;<br />	NSString *urlString = @&quot;myproject/api_dev.php/challenge/list&quot;; <br /><br />	NSURL *url = [NSURL URLWithString: [NSString stringWithFormat:@&quot;%@://%@&quot;, @&quot;http&quot;, urlString]];<br />	<br />	NSURLCredential *credential = [NSURLCredential credentialWithUser: username password: password persistence: NSURLCredentialPersistenceForSession];<br />	NSURLProtectionSpace *protectionSpace = [[NSURLProtectionSpace alloc] initWithHost: urlString port: 80 protocol: @&quot;http&quot; realm: nil authenticationMethod: NSURLAuthenticationMethodHTTPBasic];<br />	<br />	[[NSURLCredentialStorage sharedCredentialStorage] setDefaultCredential: credential forProtectionSpace: protectionSpace];<br />	[protectionSpace release];	<br />	NSURLRequest *request = [NSURLRequest requestWithURL: url cachePolicy: NSURLRequestReloadIgnoringLocalCacheData timeoutInterval: 60.0];<br />	[NSURLConnection connectionWithRequest: request delegate: self];<br />	<br />	XMLToObjectParser *myParser = [[XMLToObjectParser alloc] parseXMLAtURL:url toObject:@&quot;Contact&quot; parseError:nil];<br />	<br />	NSLog(@&quot;Info sur le parser : %@&quot;, myParser);<br />	<br />	for(int i = 0; i &lt; [[myParser items] count]; i++) {<br />		Contact *new = [[Contact alloc] init];<br />		new = (Contact *)[[myParser items] objectAtIndex:i];<br />		[tableau addObject:new];<br />		[new release];<br />	}	<br />	<br />	[super viewDidLoad];<br />}<br /><br />- (BOOL)connection:(NSURLConnection *)connection canAuthenticateAgainstProtectionSpace:(NSURLProtectionSpace *)protectionSpace {<br />	NSLog(@&quot;Ok canAuthenticateAgainstProtectionSpace&quot;);<br />}<br />- (void)connection:(NSURLConnection *)connection didCancelAuthenticationChallenge:(NSURLAuthenticationChallenge *)challenge {<br />	NSLog(@&quot;Error didCancelAuthenticationChallenge &quot;);<br />}<br />- (void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error {<br />	NSLog(@&quot;Error didFailWithError &quot;);<br />}<br />- (void)connection:(NSURLConnection *)connection didReceiveAuthenticationChallenge:(NSURLAuthenticationChallenge *)challenge {<br />	NSLog(@&quot;Ok didReceiveAuthenticationChallenge&quot;);		<br />}<br />


    J'arrive à  avoir dans la console : "Ok canAuthenticateAgainstProtectionSpace" mais apparemment le flux XML n'est pas récupéré.

    Comme faire pour le récupérer ?  :)

    Pierre
  • PierrePierre Membre
    19:24 modifié #12
    J'ai enfin réussi !!  8--)

    Pour ceux que ça intéresse voici le code pour effectuer une Basic Authentification en Objective-C pour iPhone.

    <br />- (void)viewDidLoad {<br />&nbsp;  <br />	tableau = [[NSMutableArray alloc] init];	<br />	<br />	NSString *username = @&quot;username&quot;; //remplacer les caractères spéciaux du username par leurs équivalent HTML (@ en %40 par exemple).<br />	NSString *password = @&quot;password&quot;;<br />	NSString *urlString = @&quot;myproject.com/api_dev.php/pays/list&quot;;<br /><br />	//Concaténation de la pour former l&#39;adresse suivante : http://username:password@myproject.com/api_dev.php/pays/list<br />	NSURL *url = [NSURL URLWithString: [NSString stringWithFormat:@&quot;%@://%@:%@@%@&quot;, @&quot;http&quot;, username, password, urlString]];<br />	<br />	//Parsing<br />	XMLToObjectParser *myParser = [[XMLToObjectParser alloc] parseXMLAtURL:url toObject:@&quot;pays&quot; parseError:nil];<br />	<br />	NSLog(@&quot;Info sur le parser : %@&quot;, myParser);<br />	<br />	//Remplissage du tableau<br />	for(int i = 0; i &lt; [[myParser items] count]; i++) {<br />		Pays *new = [[Challenge alloc] init];<br />		new = (Pays *)[[myParser items] objectAtIndex:i];<br />		[tableau addObject:new];<br />		[new release];<br />	}	<br />	[super viewDidLoad];<br />}<br />


    J'espère que ça pourras aider d'autres personnes à  ne pas rester bloquer plusieurs jours sur un problème embêtants. ;)

    Merci à  AliGator et à  lgriffie pour votre aide. :)

    A bientôt,
    Pierre
  • DrakenDraken Membre
    19:24 modifié #13
    C'est sympa de ta part de poster la solution de ton problème.
  • PierrePierre Membre
    19:24 modifié #14
    Bonjour Draken, comme je m'inspire de ce que font les autres pour comprendre et m'améliorer cela me semble normal d'aider aussi les autres quand je trouve une solution.  ;)

    Et puis si jamais quelqu'un trouve une meilleure solution peut être qu'il/elle l'exposeras à  son tour et nous pourrons enrichir mutuellement nos connaissances. :)

    A bientôt,
    Pierre
  • segaoufsegaouf Membre
    19:24 modifié #15
    dans 1272903522:


    Je pense savoir ce qui envoie un Warning mais aucune idée de la manière de corriger ça. J'utilise à  priori une méthode "deprecated" pour donner du texte à  une cellule. Le Warning n'empêche pas la bonne exécution du script, je chercherais donc comment régler le problème après. ;)

    ...


    Bravo Pierre. Juste pour apporter une precision. une methode "deprecated" signifie qu'il n'est plus conseille de l'utiliser.

    Cela peut etre pour plusieurs raisons : securite, la methode ne fonctionne pas comme prevu, pas thread-safe, anomalie ...

    Donc en general la methode passe de methode utilisable a deprecated, pour que les gens qui utilisent cette methode soient notifier et aient le temps d'agir en consequence.

    Il est fort probable qu'une methode deprecated soit supprimer lors d'une mise a jour de la classe.

    Donc tu devrais lire la documentation sur cette methode, qui t'expliquera pourquoi elle est depreciee, et ce qu'ils preconisent d'utiliser a la place !
  • PierrePierre Membre
    19:24 modifié #16
    @ segaouf : je connaà®t bien le principe des méthodes dites "deprecated" avant qu'elle ne soit plus utilisable dans le SDK suivant.

    J'ai consulté la doc. pour voir ce qu'Apple préconise, j'ai trouvé ceci :

    The text of the cell. (Deprecated. Use the textLabel and detailTextLabel properties instead.)

    URL : http://developer.apple.com/iphone/library/documentation/UIKit/Reference/UITableViewCell_Class/Reference/Reference.html#//apple_ref/occ/instp/UITableViewCell/text

    Très bien je suis donc aller voir la méthode "textLabel" qui dit :


    textLabel

    Returns the label used for the main textual content of the table cell. (read-only)

    @property(nonatomic, readonly, retain) UILabel *textLabel

    URL : http://developer.apple.com/iphone/library/documentation/UIKit/Reference/UITableViewCell_Class/Reference/Reference.html#//apple_ref/occ/instp/UITableViewCell/textLabel

    C'est le "readonly" qui me pose problème... donc pour le moment je n'ai pas réussi à  remplacer mon code :

    cell.text = @&quot;valeur&quot;;


    Par autre chose qui ne soit pas "deprecated". :)

    Si quelqu'un sait comment faire je suis preneur.

    Pierre
  • 19:24 modifié #17
    cell.textLabel.text = @Valeur; ?
  • PierrePierre Membre
    19:24 modifié #18
    @ EagleloukPosté : en effet c'est ça !! 

    Comment tu a fait pour comprendre ça à  partir de la doc. ? Parce que rien dans la doc. ne laisse entendre que c'est ta syntaxe qu'il faut utiliser.

    En tout cas merci beaucoup, un warning de moins !!  8--)

    Pierre
  • 19:24 modifié #19
    Et bien simplement parce que ça retourne un UILabel. à  y regarder de plus près, c'est même très pratique si tu veux customizer rapidement la couleur du texte et compagnie.
    Et si tu regardes UILabel, tu as l'accesseur "text".
  • dinguadingua Membre
    19:24 modifié #20
    Salut ,
    un peu de curiosité  :pk as tu met le "[super viewDidLoad ]" à  la fin (pk pas au début de la méthode "viewDidLoad") ?
  • PierrePierre Membre
    19:24 modifié #21
    @dingua : je ne sait pas trop, maintenant je le met plutôt au début. :)

    Je ne sait pas s'il y a une convention à  respecter.

    Pierre
  • CeetixCeetix Membre
    19:24 modifié #22
    Plop,

    J'up ce post car j'ai besoin de m'authentifier. J'y arrive avec le post de Pierre mais je ne reçois aucune réponse. Normalement je reçois une chaine de caractere.
    J'ai donc à  un moment
    <br />// mes var username, etc ... avant<br /><br />NSURL *url = [NSURL URLWithString: [NSString stringWithFormat:@&quot;%@://%@:%@@%@&quot;, @&quot;https&quot;, username, password, urlString]];<br /><br />NSMutableURLRequest *requete = [[[NSMutableURLRequest alloc] init] autorelease];<br />[requete setURL:url];<br /><br />NSURLConnection *connexion;<br />connexion = [[NSURLConnection alloc] initWithRequest:requete delegate:self startImmediately:YES];<br />[connexion scheduleInRunLoop:[NSRunLoop currentRunLoop] forMode:NSDefaultRunLoopMode];<br />[connexion start];<br />[connexion release];<br />


    J'implémente les méthodes protocole d'authentification puis celle qui me permettent de recevoir les données :
    <br />-(BOOL)connection:(NSURLConnection *)connection canAuthenticateAgainstProtectionSpace:(NSURLProtectionSpace *)protectionSpace {<br />	NSLog(@&quot;Ok canAuthenticateAgainstProtectionSpace&quot;);<br />	return YES;<br />}<br />-(void)connection:(NSURLConnection *)connection didCancelAuthenticationChallenge:(NSURLAuthenticationChallenge *)challenge {<br />	NSLog(@&quot;Error didCancelAuthenticationChallenge &quot;);<br />}<br />-(void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error {<br />	NSLog(@&quot;Error didFailWithError &quot;);<br />}<br />-(void)connection:(NSURLConnection *)connection didReceiveAuthenticationChallenge:(NSURLAuthenticationChallenge *)challenge {<br />	NSLog(@&quot;Ok didReceiveAuthenticationChallenge&quot;);		<br />}<br /><br />-(void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data<br />{<br />	[datas appendData:data];<br />}<br /><br />-(void)connectionDidFinishLoading:(NSURLConnection *)connection<br />{<br />	NSString *dataString = [[NSString alloc] initWithData:datas encoding:NSUTF8StringEncoding];<br />	NSLog(@&quot;%@&quot;,dataString);<br />}<br />


    J'ai bien l'identification mais je n'ai pas l'affichage des données. D'ailleurs je ne passe même pas dans mes deux dernières méthodes . Je vois pas trop pourquoi ...
Connectez-vous ou Inscrivez-vous pour répondre.