<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Développeur d&#039;application iPhone - iPad - Android &#187; Développement</title>
	<atom:link href="http://www.iphonedeveloppeur.fr/category/developpement-2/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.iphonedeveloppeur.fr</link>
	<description>Boréal Business - créateur d&#039;applications mobiles innovantes, de A à Z</description>
	<lastBuildDate>Fri, 06 Apr 2012 13:07:18 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.1</generator>
		<item>
		<title>IOS / Objective C : Gérer les requêtes REST</title>
		<link>http://www.iphonedeveloppeur.fr/2012/04/06/ios-objective-gerer-le-requetes-rest/</link>
		<comments>http://www.iphonedeveloppeur.fr/2012/04/06/ios-objective-gerer-le-requetes-rest/#comments</comments>
		<pubDate>Fri, 06 Apr 2012 12:53:45 +0000</pubDate>
		<dc:creator>Aurélien</dc:creator>
				<category><![CDATA[Développement]]></category>
		<category><![CDATA[ios]]></category>
		<category><![CDATA[iphone]]></category>
		<category><![CDATA[NSURLConnection]]></category>
		<category><![CDATA[objective c]]></category>
		<category><![CDATA[rest]]></category>

		<guid isPermaLink="false">http://www.iphonedeveloppeur.fr/?p=222</guid>
		<description><![CDATA[Voici un exemple de classe permettant d&#8217;envoyer des requêtes pour l&#8217;architecture REST vers un serveur Les requêtes REST utilisent le protocole HTTP pour le transport des données restRequest.h #import &#60;Foundation/Foundation.h&#62; @interface restRequest : NSObject &#60;NSURLConnectionDelegate, NSURLConnectionDataDelegate&#62; { SEL callback; // Selecteur vers la fonction de retour id delegate; // objet cible pour l'appel de la [...]]]></description>
			<content:encoded><![CDATA[<p>Voici un exemple de classe permettant d&#8217;envoyer <a href="http://fr.wikipedia.org/wiki/Representational_State_Transfer">des requêtes pour l&#8217;architecture REST </a>vers un serveur</p>
<p>Les requêtes REST utilisent le protocole HTTP pour le transport des données</p>
<p><strong>restRequest.h</strong></p>
<pre>#import &lt;Foundation/Foundation.h&gt;

@interface restRequest : NSObject &lt;NSURLConnectionDelegate, NSURLConnectionDataDelegate&gt; {
SEL callback; // Selecteur vers la fonction de retour
id delegate; // objet cible pour l'appel de la fonction de retour
int status; // code HTTP
bool done; // true si la requête est terminée

NSMutableString *method;
NSMutableString *url;
NSMutableString *payload;

NSMutableURLRequest *request;
NSURLConnection *connection;
NSMutableData *dta;
NSMutableString *result;
}

@property (nonatomic,retain) NSMutableData *dta;

@property (nonatomic,retain) NSMutableString *method;
@property (nonatomic,retain) NSMutableString *url;
@property (nonatomic,retain) NSMutableString *payload;

@property (nonatomic,retain) NSMutableURLRequest *request;
@property (nonatomic,retain) NSURLConnection *connection;

@property (nonatomic) SEL callback;
@property (nonatomic,assign) id delegate;

@property (nonatomic) int status;
@property (nonatomic) bool done;
@property (nonatomic,retain) NSMutableString *result;

-(id)initWithCallback:(SEL)cal andDelegate:(id)dl;
-(void)start;
-(void)cancel;
@end</pre>
<p><strong>restRequest.m</strong></p>
<pre>#import "restRequest.h"

@implementation restRequest

@synthesize callback;
@synthesize delegate;

@synthesize url;
@synthesize method;
@synthesize payload;

@synthesize connection;
@synthesize request;
@synthesize dta;
@synthesize status;
@synthesize result;
@synthesize done;

-(id)initWithCallback:(SEL)cal andDelegate:(id)dl {

    self = [super init];
    if(self) {
        callback = cal; // Selecteur vers la fonction de retour
        delegate = [dl retain]; // objet cible de la fonction de retour
        status = -1; // code de retour HTTP
        done = FALSE; // indique si la requête est terminée

        dta = [[NSMutableData alloc] init]; // buffer
        url = [[NSMutableString alloc] init]; // url appelée
        method = [[NSMutableString alloc] initWithString:@"GET"]; // méthode HTTP : GET / POST / PUT, ...
        payload = [[NSMutableString alloc] init]; // contenu de la requete (Body)

        result = [[NSMutableString alloc] init]; // résultat de la requête
    }

    return self;

}
-(void)dealloc {

    [self cancel];

    done = TRUE;

    delegate = nil;
    callback = nil;

    [dta release];
    [url release];
    [method release];
    [payload release];
    [result release];

    if(request){
        [request release];
        request = nil;
    }

    [super dealloc];
}
-(void)start {

    status = 0;

    [dta setLength:0];

        [result setString:@""];
        NSString *full = [NSString stringWithFormat:@"http://%@/%@",@"http://www.url-de-base.com/",url];
        NSURL *myurl = [NSURL URLWithString:full];

        if(request){
            [request release];
            request = nil;
        }

        request = [[NSMutableURLRequest alloc] initWithURL:myurl];
        [request setHTTPMethod:method];
        if([payload length] &gt; 0) [request setHTTPBody:[payload dataUsingEncoding:NSUTF8StringEncoding]];
        //[request setValue:@"application/xml" forHTTPHeaderField:@"Content-Type"]; // spécifie le format du contenu de la requête
        [request setTimeoutInterval:10];

        connection = [NSURLConnection connectionWithRequest:request delegate:self];
      [connection start];

}
-(void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data {
    [dta appendData:data];
}
-(void)connection:(NSURLConnection *)sconnection didFailWithError:(NSError *)error {
    NSLog(@"Error restRequest %@",[error localizedDescription]);
    [dta setLength:0];

    status = -2;

    if(delegate &amp;&amp; [delegate respondsToSelector:callback]) [delegate performSelector:callback withObject:self];

    connection = nil;
    delegate = nil;
    callback = nil;

    done = TRUE;
}
-(void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response {
    if([response respondsToSelector:@selector(statusCode)]){
        status = [(NSURLResponseInternal *)response statusCode];
    }
}
-(void)connectionDidFinishLoading:(NSURLConnection *)sconnection {

    NSMutableString *res = [[NSMutableString alloc] initWithData:dta encoding:NSUTF8StringEncoding];
    [result setString:res];

    if(delegate &amp;&amp; [delegate respondsToSelector:callback]){
        [delegate performSelector:callback withObject:self];
        [delegate release];
    }

    connection = nil;
    delegate = nil;
    callback = nil;
    done = TRUE;

    [res release];
}
-(void)cancel {
    if(connection){
        [connection cancel];
        connection = nil;
    }

    if(request){
        [request release];
        request = nil;
    }

    delegate = nil;
    callback = nil;
    done = TRUE;
}

@end</pre>
<p><strong>Pour l&#8217;utiliser :</strong></p>
<pre>-(void)start_request {

    restRequest *rest = [[restRequest alloc] initWithCallback:@selector(register_response:) andDelegate:self];

    [[(restRequest *)rest url] setString:@"appel/fonction.php"];
    [[(restRequest *)rest method] setString:@"PUT"];
    [[(restRequest *)rest payload] setString:@"contenu xml, json, ..."];

    [(restRequest *)rest start];

}
-(void)register_response:(restRequest *)res {

    if (res.status == 204) {
        // success
        NSString *resultat = res.result;
    }
    else if(res.status == 404){
        // document introuvable ...
    }
    else if(res.status == 500){
        // erreur interne
    }
    else if(res.status == -2){
        // impossible d'établir la connection, probablement un problème de réseau
    }

}</pre>
<p>&nbsp;</p>
]]></content:encoded>
			<wfw:commentRss>http://www.iphonedeveloppeur.fr/2012/04/06/ios-objective-gerer-le-requetes-rest/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Offre d&#8217;emploi développeur web et applications mobiles</title>
		<link>http://www.iphonedeveloppeur.fr/2012/02/08/offre-demploi-developpeur-web-applications-mobiles/</link>
		<comments>http://www.iphonedeveloppeur.fr/2012/02/08/offre-demploi-developpeur-web-applications-mobiles/#comments</comments>
		<pubDate>Wed, 08 Feb 2012 09:08:16 +0000</pubDate>
		<dc:creator>Aurélien</dc:creator>
				<category><![CDATA[Développement]]></category>

		<guid isPermaLink="false">http://www.iphonedeveloppeur.fr/?p=220</guid>
		<description><![CDATA[Contexte et missions : Boréal Business est une jeune entreprise de 5 personnes créée en 2008, implantée à Bourges et Paris. Notre activité de développement s&#8217;articule autour de 3 domaines d&#8217;activité stratégiques : Développement d&#8217;applications mobiles (smartphones et tablettes tactiles) sur plateformes iPhone / iPad / Android Développement de boutiques en ligne et d&#8217;outils e-commerce [...]]]></description>
			<content:encoded><![CDATA[<p><span style="text-decoration: underline;">Contexte et missions</span> :<br />
Boréal Business est une jeune entreprise de 5 personnes créée en 2008, implantée à Bourges et Paris.<br />
Notre activité de développement s&#8217;articule autour de 3 domaines d&#8217;activité stratégiques :</p>
<ul>
<li>Développement d&#8217;applications mobiles (smartphones et tablettes tactiles) sur plateformes iPhone / iPad / Android</li>
<li>Développement de boutiques en ligne et d&#8217;outils e-commerce</li>
<li>Développement de solutions web annexes (sites de présentation, back-offices &#8230;)</li>
</ul>
<p>Nous recherchons un développeur web junior, avec intérêt fort ou première expérience autonome dans le développement d&#8217;applications mobiles (smartphones et/ou tablettes tactiles). Une culture en e-commerce / e-marketing sera un + appréciable.<br />
Nous sommes intéressés par une personne disponible immédiatement, capable d&#8217;intégrer notre équipe jeune (moyenne 25 ans) et motivée pour accompagner l&#8217;équipe actuelle de développeurs sur les projets en web et mobile. La croissance rapide de notre structure permettra de responsabiliser rapidement la personne recrutée. L&#8217;état d&#8217;esprit et la motivation sont prépondérants par rapport à l&#8217;expérience et la formation.</p>
<p><span style="text-decoration: underline;">Profil recherché</span> :</p>
<ul>
<li>Formation : niveau BTS / Licence ou Autodidacte</li>
<li>Environnement LAMP : Linux / Apache / MySql / Php</li>
<li>C/C++ et/ou Java</li>
<li>Merci de fournir 1 ou plusieurs références de projets consultables.</li>
</ul>
<p><span style="text-decoration: underline;">Modalités</span> :</p>
<ul>
<li>Lieu : Bourges (18)</li>
<li>Temps plein 35 heures / semaine</li>
<li>CDD 3 mois puis CDI si résultats satisfaisants.</li>
<li>Prétentions salariales à préciser.</li>
</ul>
<p><em>Pour postuler merci d&#8217;envoyer votre CV + lettre de motivation par email à <a href="mailto:contact@boreal-business.net">contact@boreal-business.net</a> ou de nous consulter pour un 1er entretien au 01.75.43.03.82<br />
Votre interlocuteur : Romain FROMENTEAU</em></p>
]]></content:encoded>
			<wfw:commentRss>http://www.iphonedeveloppeur.fr/2012/02/08/offre-demploi-developpeur-web-applications-mobiles/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Installer une application «non-Market» sur Android</title>
		<link>http://www.iphonedeveloppeur.fr/2011/05/03/installer-une-application-a-non-market-a/</link>
		<comments>http://www.iphonedeveloppeur.fr/2011/05/03/installer-une-application-a-non-market-a/#comments</comments>
		<pubDate>Tue, 03 May 2011 14:12:39 +0000</pubDate>
		<dc:creator>vincent</dc:creator>
				<category><![CDATA[Développement]]></category>

		<guid isPermaLink="false">http://www.iphonedeveloppeur.fr/?p=166</guid>
		<description><![CDATA[Installer une application ne provenant pas du Market peut s'avérer très utile, notamment si vous travaillez avec un développeur d'application. En effet cela vous permettra d'installer l'application avant sa publication, par exemple pour suivre l'avancement du développement.]]></description>
			<content:encoded><![CDATA[<p><!-- p { margin-bottom: 0.21cm; } -->Installer une application ne provenant pas du Market peut s&#8217;avérer très utile, notamment si vous travaillez avec un développeur d&#8217;application. En effet cela vous permettra d&#8217;installer l&#8217;application avant sa publication, par exemple pour suivre l&#8217;avancement du développement.</p>
<p><strong>Comment installer l&#8217;application ?</strong></p>
<p>Les applications ont l&#8217;extension .apk.</p>
<p>Pour les installer, il faut d&#8217;abord autoriser les applications ne provenant pas du Market pour cela, il faut aller dans <em>Menu &gt; Paramètre &gt; Applications</em> puis cocher « Sources inconnues ».</p>
<p>Si l&#8217;application se trouve sur votre ordinateur, copiez la sur la carte SD de votre téléphone.</p>
<p>Puis utilisez un gestionnaire de programme, par exemple AppInstaller ; ou un gestionnaire de fichiers par exemple « ES File Explorer » ou « Astro File Manager ». Tous ces gestionnaires sont disponibles gratuitement sur le Market.</p>
<p>Si celle ci se trouve sur internet, entrez l&#8217;adresse dans le navigateur et l&#8217;application se téléchargera automatiquement. Une fois le téléchargement terminé, sélectionnez la notification du téléchargement (<em>Menu &gt; Notification</em>), Android vous proposera alors d&#8217;installer l&#8217;application.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.iphonedeveloppeur.fr/2011/05/03/installer-une-application-a-non-market-a/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Application iPhone et vie privée : la réalité</title>
		<link>http://www.iphonedeveloppeur.fr/2011/04/05/application-iphone-vie-privae-la-raalita/</link>
		<comments>http://www.iphonedeveloppeur.fr/2011/04/05/application-iphone-vie-privae-la-raalita/#comments</comments>
		<pubDate>Tue, 05 Apr 2011 20:32:15 +0000</pubDate>
		<dc:creator>Aurélien</dc:creator>
				<category><![CDATA[Développement]]></category>
		<category><![CDATA[Veille technologique]]></category>
		<category><![CDATA[application iphone]]></category>
		<category><![CDATA[sécurité]]></category>
		<category><![CDATA[vie privée]]></category>

		<guid isPermaLink="false">http://www.iphonedeveloppeur.fr/?p=145</guid>
		<description><![CDATA[Avec la montée en puissance du marché des applis iPhone et le débat sur la vie privée sur Internet, voici un point sur ce que les développeurs d'applications peuvent réellement récupérer comme informations sur vous ou votre appareil au travers d'une application :]]></description>
			<content:encoded><![CDATA[<p>Avec la montée en puissance du marché des applis iPhone et le débat sur la vie privée sur Internet, voici un point sur ce que les développeurs d&#8217;applications peuvent réellement récupérer comme informations sur vous ou votre appareil au travers d&#8217;une application :</p>
<p><strong>Le numéro UDID</strong></p>
<p>Il s&#8217;agit d&#8217;un code d&#8217;identification de 40 caractères, unique et associé au téléphone.<br />
On pourrait comparer ce numéro à une adresse IP, à la différence que celui ci ne change jamais.</p>
<p>Ce numéro est collecté et transmis par beaucoup d&#8217;applications à l&#8217;heure actuelle : il permet de faire des stats d&#8217;utilisation, d&#8217;associer des réglages stockés en ligne à votre terminal, ou encore à envoyer les notifications Push, ces petits messages instantanés (Ex : un nouveau message sur Facebook). Son utilisation est indispensable dans pas mal de cas, et loin d&#8217;être frauduleuse.</p>
<p>Seul, ce numéro n&#8217;a aucune signification, il s&#8217;agit d&#8217;une chaine de caractères aléatoires. Le problème peut se poser si différentes applications recoupent les données saisies dans les applications avec l&#8217; identifiant et établissent ainsi un profil plus global, à la manière des cookies sur le web.  Tout dépend des infos que vous donnez à une application, et des intentions des développeurs.</p>
<p><strong>Les fonctions de téléphonie</strong></p>
<p>Appel : une application peut lancer un appel téléphonique distant, mais celui ci s&#8217;affiche immédiatement à l&#8217;écran et vous laisse la possibilité de raccrocher, impossible donc d&#8217;appeler en arrière plan. Pas de soucis à se faire du coté des numéros surtaxé et de votre forfait.</p>
<p>SMS : une application peut ouvrir l&#8217;application SMS et pré-saisir un numéro, en aucun cas envoyer le SMS de manière autonome.</p>
<p>Le numéro de téléphone : une application ne peut pas accéder au numéro associé à la carte SIM (ou à la moindre infos stockées sur la SIM d&#8217;ailleurs). Un des seuls moyens à mon sens est d&#8217;inciter à appeler un numéro précis à partir de l&#8217;appli et de transmettre une requête à un serveur. Le serveur recoupe alors l&#8217;appel téléphonique reçu avec la petite requête. En comparant les dates et les heures de ces deux événements, on peut en déduire que l&#8217;appel et la requête viennent du même appareil. Tordu, mais faisable techniquement.</p>
<p><strong>Le carnet d&#8217;adresse</strong></p>
<p>Une application a un accès complet en lecture et écriture sur votre carnet de contact : nom, numéro de téléphone, photo, absolument tout. C&#8217;est à mon sens le plus gros problème à l&#8217;heure actuelle sur iPhone. Rien n’empêche (si ce n&#8217;est un peu d’honnêteté) une application de lire l&#8217;ensemble de vos contacts et les transmettre vers un serveur distant. Le spam ciblé par SMS peut commencer tranquillement. Aussi combien d&#8217;entre nous ont dans leurs contacts une entrée &laquo;&nbsp;Moi&nbsp;&raquo; avec leur numéro enregistré ?</p>
<p><strong>Le GPS</strong></p>
<p>La première activation de la fonction GPS d&#8217;une application déclenche systématiquement l&#8217;apparition d&#8217;une boite de dialogue vous demandant d&#8217;activer le GPS. A ce stade un peu de bon sens, demandez vous pourquoi un jeu type Yéti Sport ou Angry Bird a besoin d’accéder à votre position ? Refusez simplement et le GPS ne communiquera aucune coordonnées. A tout moment, dans les réglages, vous pouvez autoriser ou interdire l&#8217;accès au GPS à une application, ou même couper le service de localisation pour tout le téléphone.</p>
<p>Une application peut demander au GPS de rester activé en tache de fond, mais l’icône de la flèche violette reste présente dans la barre du haut. Quittez les applications une par une et voyez laquelle collecte ces infos.</p>
<p>Au niveau localisation, une appli peut aussi obtenir une position approximative en analysant l&#8217;adresse IP du téléphone (en particulier les points Wifi public). En gros la région/ville (technique utilisée un maximum sur le web, vous l&#8217;avez peut-être constatés). Aucune parade mais finalement peu de risques pour votre vie privée.</p>
<p><strong>Les informations nominatives</strong></p>
<p>Une application n&#8217;a pas accès à votre nom, prénom, adresse ou numéro de sécu, sauf évidemment si vous la lui donnez !</p>
<p><strong>Les autres applications</strong></p>
<p>Sauf en recoupant les UDID, impossible pour une application de savoir quelles autres applis vous utilisez, ni d&#8217;accèder aux données stockées par ces applications.</p>
<p><strong>Quelles infos transmet réellement une application précise ?</strong></p>
<p>Il y a des moyens techniques pour savoir que transmet une application, mais rien de simple et rapide malheureusement.</p>
<p><em><span style="color: #808080;">Pour les initiés : connectez votre iPhone en Wifi, changez les paramètres IP en static et placez une box Linux comme Gateway NAT avec comme default route le gateway internet réel, lancez ensuite Wireshark ou tcpdump pour tracer le traffic IP.<br />
La manip est aussi possible sur Windows et Linux en utilisant une attaque MITM / ARP Poisonning sur votre routeur Wifi (idéal si le traffic transite en SSL).<br />
Autre solution : modifier la table DNS locale du routeur pour faire pointer le domaine vers un serveur en lan.</span></em></p>
<p><em>E</em>n résumé, les concepteurs d&#8217;applications ont la possibilité d’accéder à  un certain nombre d&#8217;infos. Le risque arrive quand ces données sont  recoupées, exactement comme pour le web.<br />
Il faut aussi ne pas oublier que toutes les applications sont contrôlées  par Apple (et en particulier les appli payantes), qui ne se gène pas  pour rejeter une appli au moindre problème, et de fermer les compte  développeur à la moindre plainte. Cela a ces inconvénient question  liberté, mais aussi des avantages au niveau sécurité.</p>
<p><span style="color: #999999;"><em>NB : il ne s&#8217;agit ici que de pistes, pas forcément toutes exploitées à l&#8217;heure actuelle, mais faisables techniquement. En restant prudent sur les infos publiées, comme sur Internet, on peut garantir un certain anonymat vis à vis des concepteurs d&#8217;applis. Évidemment si vous voulez être tranquille, ressortez votre 3310 :p</em></span></p>
]]></content:encoded>
			<wfw:commentRss>http://www.iphonedeveloppeur.fr/2011/04/05/application-iphone-vie-privae-la-raalita/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Fonctionnement d&#8217;une application mobile : les différentes possibilités</title>
		<link>http://www.iphonedeveloppeur.fr/2011/04/05/fonctionnement-dune-application-iphone/</link>
		<comments>http://www.iphonedeveloppeur.fr/2011/04/05/fonctionnement-dune-application-iphone/#comments</comments>
		<pubDate>Tue, 05 Apr 2011 14:17:28 +0000</pubDate>
		<dc:creator>Aurélien</dc:creator>
				<category><![CDATA[Développement]]></category>
		<category><![CDATA[android]]></category>
		<category><![CDATA[developpement]]></category>
		<category><![CDATA[explications]]></category>
		<category><![CDATA[iphone]]></category>
		<category><![CDATA[mysql]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[Serveur]]></category>

		<guid isPermaLink="false">http://www.iphonedeveloppeur.fr/?p=123</guid>
		<description><![CDATA[Une petite longue note explicative sur les différents modes de fonctionnement des applications mobiles telles que nous les concevons. Les applications connectées Ce type d&#8217;appli se comporte globalement comme votre navigateur Internet. A chaque opération ou accès de données, les informations sont lues sur Internet Nos apps repose en général sur ces éléments : - [...]]]></description>
			<content:encoded><![CDATA[<p>Une <span style="text-decoration: line-through;">petite</span> longue note explicative sur les différents modes de fonctionnement des applications mobiles telles que nous les concevons.</p>
<h2>Les applications connectées</h2>
<p>Ce type d&#8217;appli se comporte globalement comme votre navigateur Internet. A chaque opération ou accès de données, les informations sont lues sur Internet</p>
<h3><strong>Nos apps repose en général sur ces éléments :</strong></h3>
<p>-<strong> L&#8217;application</strong> en elle même, codée en Objective C sur iPhone, JAVA pour Android et Blackberry<br />
- <strong>Un Serveur Web</strong> type Apache/PHP<br />
- Un serveur de <strong>base de données</strong> (pour nous MySQL)</p>
<h3><strong>La lecture des données se fait de manière suivante :</strong></h3>
<p>Une fois lancée, l&#8217;application se connecte au serveur web et vient télécharger un fichier, en général au format XML (RSS ou WebServices).<br />
Ce flux est généré en temps réel par un script écrit en PHP, qui interprète la demande (et les paramètres GET et POST) et interroge la base de données en fonction.</p>
<p>Reste à l&#8217;appli à interpréter ces données (libxml2 fait le travail) et de le placer dans l&#8217;interface !</p>
<p>En utilisant cette technique, les différentes versions de vos applis (iPhone, Android, &#8230;)<br />
viennent toutes se connecter à la même source de données, et <strong>simplifient la maintenance et les mises à jours.</strong></p>
<p><em>Il est aussi possible de <strong>connecter la base de données existante de votre site web</strong>, les données sur votre iPhone ou sur un navigateur classique sont donc toujours identiques.</em></p>
<h3><strong>Avantages :</strong></h3>
<p>- Une synchronisation parfaite entre toutes vos supports pour votre service.<br />
- Possibilité de donner des infos en temps réels<br />
- Facilité de mise à jour du contenu (couplé avec un BackOffice par exemple)<br />
- Application légère et rapide à télécharger sur le Store<br />
- Le serveur peut effectuer certains traitements lourds un peu délicat à réaliser sur un téléphone qui tourne sur batterie et avec une puissance de calcul limitée (traitement d&#8217;image ou de vidéo par exemple)<br />
- Toutes les possibilités du téléphone sont exploitables (GPS, Push &#8230;)</p>
<h3><strong>Inconvénients</strong> :</h3>
<p>- La connexion Internet est indispensable<br />
- Pour peu que l&#8217;on fasse transiter beaucoup de données (grande photos, vidéo) la couverture en 3G est obligatoire (15 Min de vidéo au fin fond du Berry, oubliez tout de suite)<br />
- Plein de petits chargements qui peuvent être gênants à la longue.</p>
<p><strong>Ce type d&#8217;application est parfait pour des services connectés à un site web, pour l&#8217;utilisation de réseau sociaux, ou généralement quand les informations doivent être obtenus rapidement.</strong></p>
<p><em>Exemples : Dépanne Moi, Astuces FB, b2pweb &#8230;</em></p>
<p><em><br />
</em></p>
<h2>Les applications embarquées</h2>
<p>Pour ce type d&#8217;application, toutes les fonctions, données média sont embarquées dans le téléphone ou la tablette.<br />
<strong>Un seul élément dans ce cas de figure : le téléphone avec son logiciel embarqué.</strong></p>
<p>Le téléphone lit tous les fichiers qu&#8217;il lui faut directement dans la mémoire de stockage du téléphone, ou dans une base de données embarquées (SQLite3 est très efficace dans ce cas de figure)<br />
sur le même modèle qu&#8217;un ordinateur qui ouvre un fichier.</p>
<h3><strong>Avantages :</strong></h3>
<p>- L&#8217;appli est toujours disponible, que l&#8217;on soit en plein Paris ou au beau milieu de la pampa.<br />
- L&#8217;accès aux données est très rapide, d&#8217;autant plus que les téléphones disposent d&#8217;une mémoire de type SSD, avec des débit de lecture assez élevés.<br />
- Les fonctions radio du téléphone ne sont pas sollicitées, la batterie perd donc la charge moins vite.<br />
- Lors du téléchargement de l&#8217;appli, tout son contenu est immédiatement disponible.</p>
<h3><strong>Inconvénients : </strong></h3>
<p>- La moindre correction orthographique demande une mise à jour de l&#8217;appli. Quand on sait que cela peut prendre plusieurs jours avec Apple, mieux vaut bien tout valider à chaque étape<br />
- L&#8217;application peut vite devenir extrêmement lourde. Au delà de 20 Mo (pour l&#8217;iPhone en tout cas), une connexion Wifi est exigée par Apple.<br />
- Pas de réactivité du contenu<br />
- L&#8217;utilisation de Google Maps, du GPS, des notifications devient plus problématique</p>
<p><strong>En résumé ce type d&#8217;appli est adapté pour des utilitaires avec une fonction bien précise, pas vraiment voués à évoluer dans le temps par leur contenu.</strong></p>
<p><em>Exemples : Tecknodent, Planet Solaire</em></p>
<p><em><br />
</em></p>
<h2>Les applications synchronisables</h2>
<p>Il s&#8217;agit d&#8217;une version hybride des deux autres modèles. Elles reposent à la fois :</p>
<p>- Sur un serveur web/php alimenté par une base SQL<br />
- le système de stockage Interne du téléphone<br />
- L&#8217;application en elle même</p>
<p>L&#8217;application en utilisation simple vient lire les données sur son disque de stockage, ou sa base de données interne, mais dispose d&#8217;une fonction qui permet de synchroniser son contenu.<strong> </strong></p>
<h3><strong>En détail cela fonctionne de cette manière :</strong></h3>
<p>- L&#8217;appli vérifie sa connectivité<br />
- Une requête avec la date de dernière mise à jour est envoyée vers le serveur<br />
- Le serveur répond par une liste de données à récupérer (URL de fichiers média, requêtes SQL pour synchro avec la base SQLite, &#8230;). Toute cette liste est envoyée via un flux XML<br />
- L&#8217;application va alors télécharger toutes les infos de manière séquentielles (via HTTP ou FTP), ou exécuter les requêtes SQL. Il est aussi possible, pour des petits fichiers, de les stocker en base de données sous forme de BLOB binaires.<br />
- Une fois toute la séquence terminée, on recharge l&#8217;interface.</p>
<h3><strong>Avantages</strong> :</h3>
<p>- Un bon compromis entre la disponibilité et la flexibilité du contenu<br />
- La radio du téléphone n&#8217;est sollicité que lors des mises à jour<br />
- Application légère à télécharger<br />
- Seules les nouvelles informations sont téléchargées (ou celles mises à jours évidemment), les autres sont stockées dans le téléphone</p>
<p><strong>Inconvénients :</strong></p>
<p>- Les données peuvent ne plus être valables si l&#8217;on oublie de faire la mise à jour<br />
- Lors du premier lancement, cela implique de télécharger tout le contenu. Même en Wifi, cela peut prendre du temps dans certain cas.</p>
<p><em>Exemple : CNRI, iAstreinte, Concorde Hotels &amp; Resorts</em></p>
<p><strong>Ce type d&#8217;appli se prêtent bien aux applications métier, ou à usage professionnel, quand la fiabilité est importante, tout en gardant la possibilité d&#8217;échanger des informations rapidement.</strong></p>
<p>Il est évidemment possible d&#8217;utiliser un mélange de ces techniques en  fonctions des services proposés par l’application, ou de passer en mode  &laquo;&nbsp;dégradé&nbsp;&raquo; si la connexion Internet n&#8217;est pas disponible.</p>
<p>Des questions sur la faisabilité technique de votre projet d&#8217;appli ? Contactez nous au 01.75.43.03.82 pour en discuter</p>
]]></content:encoded>
			<wfw:commentRss>http://www.iphonedeveloppeur.fr/2011/04/05/fonctionnement-dune-application-iphone/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Les types de données en objective C sur le SDK iPhone</title>
		<link>http://www.iphonedeveloppeur.fr/2011/01/17/les-types-de-donnees-en-objective-c-sur-le-sdk-iphone/</link>
		<comments>http://www.iphonedeveloppeur.fr/2011/01/17/les-types-de-donnees-en-objective-c-sur-le-sdk-iphone/#comments</comments>
		<pubDate>Mon, 17 Jan 2011 16:41:20 +0000</pubDate>
		<dc:creator>Aurélien</dc:creator>
				<category><![CDATA[Développement]]></category>
		<category><![CDATA[iphone]]></category>
		<category><![CDATA[objective c]]></category>
		<category><![CDATA[sdk]]></category>
		<category><![CDATA[type]]></category>

		<guid isPermaLink="false">http://www.iphonedeveloppeur.fr/?p=107</guid>
		<description><![CDATA[Voila un petit topo sur les types de données les plus courants disponibles dans le SDK iPhone bool : peut valoir TRUE ou FALSE (vrai ou faux) int : entier signé (+ ou -) numérique (Ex : 5, -2, 0, &#8230;) float : nombre à virgule flottante (Ex : -42.3478) double : nombre à virgule [...]]]></description>
			<content:encoded><![CDATA[<p>Voila un petit topo sur les types de données les plus courants disponibles dans le SDK iPhone</p>
<p><strong>bool </strong>: peut valoir TRUE ou FALSE (vrai ou faux)</p>
<p><strong>int </strong>: entier signé (+ ou -) numérique (Ex : 5, -2, 0, &#8230;)<strong><br />
float </strong>: nombre à virgule flottante (Ex : -42.3478)<br />
<strong>double </strong>: nombre à virgule flottante (peut stocker de plus grands nombres)<strong> </strong>(Ex: 5000000006478975572.5465174674<strong>)<br />
NSNumber </strong>: stock un nombre de n&#8217;importe quelle taille, et peut le ressortir sous n&#8217;importe quelle forme vue ci-dessus (int, float, double &#8230;), pratique pour convertir</p>
<p>Les types suivants existent en version Mutable, c&#8217;est à dire que l&#8217;on peut en changer le contenu après l&#8217;initialisation.</p>
<p><strong>NSString et NSMutableString </strong>: une chaine de caractère standard, vous pouvez les comparer via <em>[machaine isEqualToString:autrechaine] == true, </em>et surtout PAS<em> machaine == autrechaine</em><em> </em>comme en PHP<em><br />
</em></p>
<p><strong>NSArray et NSMutableArray</strong> : un tableau de données (Array), accèdez à chaque ligne grâce à<em> [monarray objectAtIndex:x]</em>, et lire le nombre de ligne avec <em>[monarray count];</em></p>
<p><strong>NSDictionnary et NSMutableDictionnary</strong> : dictionnaire de données.</p>
<p>Cet objet ressemble aux Arrays, à ceci près que les colonnes sont nommées, et qu&#8217;il ne peut y avoir qu&#8217;une seule ligne. Ex:</p>
<pre>dict = [[NSMutableDictionnary alloc] init];
[dict setObject:@"chaine" forKey:@"clef"];</pre>
<p>Récuperez ensuite cette valeur en utilisant <em>[dict objectForKey:@"clef"]</em><br />
Rien ne vous empêche d&#8217;insérer des Arrays dans un Dictionnary, ou inversement d&#8217;insérer des Dictionnary dans un Array.</p>
<p><strong>NSData </strong>et <strong>NSMutableData </strong>: stocke des données binaires (issues d&#8217;un téléchargement par exemple)</p>
<p>Autres types de données bien utiles :</p>
<p><strong>NSDate </strong>: Objet permettant la manipulation d&#8217;une date<br />
<strong>NSURL </strong>: Stock une adresse URL<br />
<strong>CGRect </strong>: définit une zone de l&#8217;espace par une origine (x et y), une largeur et une hauteur (voir les frames)<br />
<strong>CGPoint </strong>: défini un point de l&#8217;espace en 2D : x et y<br />
<strong>CGSize </strong>: définit une taille (largeur et hauteur)<br />
<strong>CGFloat </strong>: identique à float<br />
<strong>UIColor </strong>: défini une couleur Ex :<em> [UIColor redColor]</em><br />
<strong>UIImage </strong>: représente un fichier image<em> [UIImage imageNamed:@"monimage.png"];</em></p>
<p>Il en existe bien sûr d&#8217;autres, je complèterai au fur et à mesure.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.iphonedeveloppeur.fr/2011/01/17/les-types-de-donnees-en-objective-c-sur-le-sdk-iphone/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Télécharger un fichier texte sur un iPhone :  Mode d&#8217;emploi en objective C</title>
		<link>http://www.iphonedeveloppeur.fr/2011/01/17/telecharger-un-fichier-sur-un-iphone-mode-demploi-en-objective-c/</link>
		<comments>http://www.iphonedeveloppeur.fr/2011/01/17/telecharger-un-fichier-sur-un-iphone-mode-demploi-en-objective-c/#comments</comments>
		<pubDate>Mon, 17 Jan 2011 16:00:50 +0000</pubDate>
		<dc:creator>Aurélien</dc:creator>
				<category><![CDATA[Développement]]></category>
		<category><![CDATA[code]]></category>
		<category><![CDATA[delegate]]></category>
		<category><![CDATA[developpement]]></category>
		<category><![CDATA[iphone]]></category>
		<category><![CDATA[sdk]]></category>
		<category><![CDATA[téléchargement]]></category>

		<guid isPermaLink="false">http://www.iphonedeveloppeur.fr/?p=97</guid>
		<description><![CDATA[Voici la marche à suivre pour télécharger un fichier en mémoire d'un terminal sous iOS (v >= 3.1.3) en mode asynchrone. L'avantage de ce mode est que l'exécution de votre application se poursuit, le téléchargement se fait en tache de fond!]]></description>
			<content:encoded><![CDATA[<p><strong>Voici la marche à suivre pour télécharger un fichier en mémoire d&#8217;un terminal sous iOS (v &gt;= 3.1.3) en mode asynchrone.<br />
L&#8217;avantage de ce mode est que l&#8217;exécution de votre application se poursuit, le téléchargement se fait en tache de fond!</strong></p>
<p>Voici le vif du sujet :</p>
<p>Dans l&#8217;entête de votre controller de vue (le fichier .h), ajoutez un NSMutableData, qui va stocker les données en cours de téléchargement.<br />
Mutable signifie qu&#8217;il sera éditable après avoir été initialisé (comme pour NSMutableString, NSMutableArray, NSMutableDictionnary, etc)</p>
<p>le fichier ressemblera en gros à ça</p>
<pre>#import &lt;Foundation/Foundation.h&gt;

@interface monController : UIViewController {
     NSMutableData *dta;
}
@property (nonatomic,retain) NSMutableData *dta;
-(void)startdownload;
</pre>
<p>L&#8217;objet data est donc déclaré, reste à le remplir !<br />
Dans votre controller de vue (fichier .m), juste après @implementation monController</p>
<pre>@synthesize dta;
</pre>
<p>puis ajoutez les fonctions suivante :</p>
<pre>-(void)start_download { // appelez cette méthode pour lancer le téléchargement

	if(dta == nil){ // on initialise ici notre variable enregistrée dans le fichier H
		//(on exécute cette instruction uniquement une seule fois !)
		dta = [[NSMutableData alloc] init];
	}
        else{
             // dans le cas contraire, on supprime les eventuelles données restantes
             [dta setLength:0];
       }

	NSString *real_url = @"http://www.monadresse.fr/monfichier.jpg";
	// on construit ici l'url à appeler.
	// Vous pouvez la rendre dynamique avec des fonctions telles que initWithFormat
	NSURL *url = [NSURL URLWithString:real_url];
	NSURLRequest *req = [NSURLRequest requestWithURL:url];
	NSURLConnection *connect = [NSURLConnection connectionWithRequest:req delegate:self];

	// à cette étape, le point important est le delegate:self qui
	// indique que les signaux de retour seront adressés au controller de vue actuel (monController)
	// nous allons maintenant récuperer ces signaux pour déterminer où en est notre téléchargement

}

-(void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data {
	// cette fonction est appelée dès que la connection reçoit des données.
	// Le nom de cette fonction doit exactement être identique (protocole imposé par le delegate)
	[dta appendData:data]; // on ajoute le bloc de données téléchargées à notre objet dta
}

-(void)connectionDidFinishLoading:(NSURLConnection *)connection {
	// cette fonction est appelée dès que le téléchargement est terminé,
	// tout notre fichier se trouve donc dans notre objet dta;

	// pour le convertir en chaine de charactère (cas d'un fichier texte)
	NSMutableString *result = [[NSMutableString alloc] initWithData:dta encoding:NSUTF8StringEncoding];

	// traiter cette variable : votre fichier texte est dedans
	// on vide notre objet de son contenu (copié dans result, inutile de le garder deux fois en mémoire)

	[dta setLength:0];
}

-(void)connection:(NSURLconnection *)connection didFailWithError:(NSError *)error {

	// cette méthode est appelée lorqu'une erreur se produit pendant le téléchargement
	NSLog(@"Erreur !");
        [dta setLength:0]; // le telechargement a echoué, intile de garder les données recuperées (probablement incomplètes)

}</pre>
<p>Il existe d&#8217;autres méthodes appelése automatiquement par NSURLConnection sur son delegate : vous pouvez les retrouver sur le site référence d&#8217;Apple :</p>
<p><a title="NSURLConnection référence" href="http://developer.apple.com/library/mac/#documentation/Cocoa/Reference/Foundation/Classes/NSURLConnection_Class/Reference/Reference.html">http://developer.apple.com/library/mac/#documentation/Cocoa/Reference/Foundation/Classes/NSURLConnection_Class/Reference/Reference.html</a></p>
<p><strong>A retenir :</strong></p>
<p>- <strong>Pour déclarer un objet accessible dans toutes les fonctions/méthodes</strong>, ajoutez le au bloc @interface, ajoutez sa ligne @property<br />
puis dans le fichier .m la ligne @synthesize</p>
<p>Attention : il faut quand même faire une initialisation de l&#8217;objet en utilisant alloc (ou copy) ex : dta = [[NSMutableData alloc] init];,<br />
l&#8217;objet sera dans le cas contraire toujours égal à nil (on oublie facilement cette étape)<br />
il faudra aussi effacer la référence à cet objet dans la méthode dealloc de votre controller:</p>
<pre>[dta setLength:0];
[dta release];</pre>
<p><strong>A noter que dans mon exemple il s&#8217;agit d&#8217;un des deux seuls objets à release avec l&#8217;objet result</strong>, l&#8217;instruction alloc n&#8217;étant pas utilisée pour les autres (NSURLConnection, NSURL, NSString).</p>
<p>- <strong>Le protocole delegate d&#8217;un objet est un ensemble de méthodes qui seront appelées automatiquement </strong>(certaines facultatives, d&#8217;autres obligatoires) sur l&#8217;objet fourni (self = controller de vue courant, rien ne vous empêche de donner un autre controller de vue, ou même un autre objet NSObject)</p>
<p>- <strong>Je vous conseille de faire quelques contrôles supplémentaires sur les erreurs</strong>, une déconnexion est vite arrivée sur mobile !</p>
]]></content:encoded>
			<wfw:commentRss>http://www.iphonedeveloppeur.fr/2011/01/17/telecharger-un-fichier-sur-un-iphone-mode-demploi-en-objective-c/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

