Archive for the ‘Développement’ Category

Mondial de l’automobile 2012 : Les applications RSV et CEA présentées !

janvier 28th, 2013    Posted in Développement
 

A l’occasion du mondial de l’automobile, Boréal a fourni deux applications : « Réviser sa voiture » (RSV) et « Carnet d’entretien Automobile » (CEA).
Liées, elles permettent de mieux gérer l’entretien de sa voiture, et de bénéficier de promotions près de chez soi grâce à la fonction GPS de votre smartphone.

application cea

Bookmark and Share
No Comments

IOS / Objective C : Gérer les requêtes REST

avril 6th, 2012    Posted in Développement
 

Voici un exemple de classe permettant d’envoyer des requêtes pour l’architecture REST vers un serveur

Les requêtes REST utilisent le protocole HTTP pour le transport des données

restRequest.h

#import <Foundation/Foundation.h>

@interface restRequest : NSObject <NSURLConnectionDelegate, NSURLConnectionDataDelegate> {
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

restRequest.m

#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] > 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 && [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 && [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

Pour l’utiliser :

-(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
    }

}

 

Bookmark and Share
No Comments

Offre d’emploi développeur web et applications mobiles

février 8th, 2012    Posted in Développement
 

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’articule autour de 3 domaines d’activité stratégiques :

  • Développement d’applications mobiles (smartphones et tablettes tactiles) sur plateformes iPhone / iPad / Android
  • Développement de boutiques en ligne et d’outils e-commerce
  • Développement de solutions web annexes (sites de présentation, back-offices …)

Nous recherchons un développeur web junior, avec intérêt fort ou première expérience autonome dans le développement d’applications mobiles (smartphones et/ou tablettes tactiles). Une culture en e-commerce / e-marketing sera un + appréciable.
Nous sommes intéressés par une personne disponible immédiatement, capable d’intégrer notre équipe jeune (moyenne 25 ans) et motivée pour accompagner l’é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’état d’esprit et la motivation sont prépondérants par rapport à l’expérience et la formation.

Profil recherché :

  • Formation : niveau BTS / Licence ou Autodidacte
  • Environnement LAMP : Linux / Apache / MySql / Php
  • C/C++ et/ou Java
  • Merci de fournir 1 ou plusieurs références de projets consultables.

Modalités :

  • Lieu : Bourges (18)
  • Temps plein 35 heures / semaine
  • CDD 3 mois puis CDI si résultats satisfaisants.
  • Prétentions salariales à préciser.

Pour postuler merci d’envoyer votre CV + lettre de motivation par email à contact@boreal-business.net ou de nous consulter pour un 1er entretien au 01.75.43.03.82
Votre interlocuteur : Romain FROMENTEAU

Bookmark and Share
No Comments

Installer une application «non-Market» sur Android

mai 3rd, 2011    Posted in Développement
 

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.

Comment installer l’application ?

Les applications ont l’extension .apk.

Pour les installer, il faut d’abord autoriser les applications ne provenant pas du Market pour cela, il faut aller dans Menu > Paramètre > Applications puis cocher « Sources inconnues ».

Si l’application se trouve sur votre ordinateur, copiez la sur la carte SD de votre téléphone.

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.

Si celle ci se trouve sur internet, entrez l’adresse dans le navigateur et l’application se téléchargera automatiquement. Une fois le téléchargement terminé, sélectionnez la notification du téléchargement (Menu > Notification), Android vous proposera alors d’installer l’application.

Bookmark and Share
1 Comment

Application iPhone et vie privée : la réalité

avril 5th, 2011    Posted in Développement, Veille technologique
 

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 :

Le numéro UDID

Il s’agit d’un code d’identification de 40 caractères, unique et associé au téléphone.
On pourrait comparer ce numéro à une adresse IP, à la différence que celui ci ne change jamais.

Ce numéro est collecté et transmis par beaucoup d’applications à l’heure actuelle : il permet de faire des stats d’utilisation, d’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’être frauduleuse.

Seul, ce numéro n’a aucune signification, il s’agit d’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’ 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.

Les fonctions de téléphonie

Appel : une application peut lancer un appel téléphonique distant, mais celui ci s’affiche immédiatement à l’écran et vous laisse la possibilité de raccrocher, impossible donc d’appeler en arrière plan. Pas de soucis à se faire du coté des numéros surtaxé et de votre forfait.

SMS : une application peut ouvrir l’application SMS et pré-saisir un numéro, en aucun cas envoyer le SMS de manière autonome.

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’ailleurs). Un des seuls moyens à mon sens est d’inciter à appeler un numéro précis à partir de l’appli et de transmettre une requête à un serveur. Le serveur recoupe alors l’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’appel et la requête viennent du même appareil. Tordu, mais faisable techniquement.

Le carnet d’adresse

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’est à mon sens le plus gros problème à l’heure actuelle sur iPhone. Rien n’empêche (si ce n’est un peu d’honnêteté) une application de lire l’ensemble de vos contacts et les transmettre vers un serveur distant. Le spam ciblé par SMS peut commencer tranquillement. Aussi combien d’entre nous ont dans leurs contacts une entrée « Moi » avec leur numéro enregistré ?

Le GPS

La première activation de la fonction GPS d’une application déclenche systématiquement l’apparition d’une boite de dialogue vous demandant d’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’accès au GPS à une application, ou même couper le service de localisation pour tout le téléphone.

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.

Au niveau localisation, une appli peut aussi obtenir une position approximative en analysant l’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’avez peut-être constatés). Aucune parade mais finalement peu de risques pour votre vie privée.

Les informations nominatives

Une application n’a pas accès à votre nom, prénom, adresse ou numéro de sécu, sauf évidemment si vous la lui donnez !

Les autres applications

Sauf en recoupant les UDID, impossible pour une application de savoir quelles autres applis vous utilisez, ni d’accèder aux données stockées par ces applications.

Quelles infos transmet réellement une application précise ?

Il y a des moyens techniques pour savoir que transmet une application, mais rien de simple et rapide malheureusement.

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.
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).
Autre solution : modifier la table DNS locale du routeur pour faire pointer le domaine vers un serveur en lan.

En résumé, les concepteurs d’applications ont la possibilité d’accéder à un certain nombre d’infos. Le risque arrive quand ces données sont recoupées, exactement comme pour le web.
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é.

NB : il ne s’agit ici que de pistes, pas forcément toutes exploitées à l’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’applis. Évidemment si vous voulez être tranquille, ressortez votre 3310 :p

Bookmark and Share
No Comments

Fonctionnement d’une application mobile : les différentes possibilités

avril 5th, 2011    Posted in Développement
 

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’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 :

- L’application en elle même, codée en Objective C sur iPhone, JAVA pour Android et Blackberry
- Un Serveur Web type Apache/PHP
- Un serveur de base de données (pour nous MySQL)

La lecture des données se fait de manière suivante :

Une fois lancée, l’application se connecte au serveur web et vient télécharger un fichier, en général au format XML (RSS ou WebServices).
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.

Reste à l’appli à interpréter ces données (libxml2 fait le travail) et de le placer dans l’interface !

En utilisant cette technique, les différentes versions de vos applis (iPhone, Android, …)
viennent toutes se connecter à la même source de données, et simplifient la maintenance et les mises à jours.

Il est aussi possible de connecter la base de données existante de votre site web, les données sur votre iPhone ou sur un navigateur classique sont donc toujours identiques.

Avantages :

- Une synchronisation parfaite entre toutes vos supports pour votre service.
- Possibilité de donner des infos en temps réels
- Facilité de mise à jour du contenu (couplé avec un BackOffice par exemple)
- Application légère et rapide à télécharger sur le Store
- 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’image ou de vidéo par exemple)
- Toutes les possibilités du téléphone sont exploitables (GPS, Push …)

Inconvénients :

- La connexion Internet est indispensable
- Pour peu que l’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)
- Plein de petits chargements qui peuvent être gênants à la longue.

Ce type d’application est parfait pour des services connectés à un site web, pour l’utilisation de réseau sociaux, ou généralement quand les informations doivent être obtenus rapidement.

Exemples : Dépanne Moi, Astuces FB, b2pweb …


Les applications embarquées

Pour ce type d’application, toutes les fonctions, données média sont embarquées dans le téléphone ou la tablette.
Un seul élément dans ce cas de figure : le téléphone avec son logiciel embarqué.

Le téléphone lit tous les fichiers qu’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)
sur le même modèle qu’un ordinateur qui ouvre un fichier.

Avantages :

- L’appli est toujours disponible, que l’on soit en plein Paris ou au beau milieu de la pampa.
- L’accès aux données est très rapide, d’autant plus que les téléphones disposent d’une mémoire de type SSD, avec des débit de lecture assez élevés.
- Les fonctions radio du téléphone ne sont pas sollicitées, la batterie perd donc la charge moins vite.
- Lors du téléchargement de l’appli, tout son contenu est immédiatement disponible.

Inconvénients :

- La moindre correction orthographique demande une mise à jour de l’appli. Quand on sait que cela peut prendre plusieurs jours avec Apple, mieux vaut bien tout valider à chaque étape
- L’application peut vite devenir extrêmement lourde. Au delà de 20 Mo (pour l’iPhone en tout cas), une connexion Wifi est exigée par Apple.
- Pas de réactivité du contenu
- L’utilisation de Google Maps, du GPS, des notifications devient plus problématique

En résumé ce type d’appli est adapté pour des utilitaires avec une fonction bien précise, pas vraiment voués à évoluer dans le temps par leur contenu.

Exemples : Tecknodent, Planet Solaire


Les applications synchronisables

Il s’agit d’une version hybride des deux autres modèles. Elles reposent à la fois :

- Sur un serveur web/php alimenté par une base SQL
- le système de stockage Interne du téléphone
- L’application en elle même

L’application en utilisation simple vient lire les données sur son disque de stockage, ou sa base de données interne, mais dispose d’une fonction qui permet de synchroniser son contenu.

En détail cela fonctionne de cette manière :

- L’appli vérifie sa connectivité
- Une requête avec la date de dernière mise à jour est envoyée vers le serveur
- 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, …). Toute cette liste est envoyée via un flux XML
- L’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.
- Une fois toute la séquence terminée, on recharge l’interface.

Avantages :

- Un bon compromis entre la disponibilité et la flexibilité du contenu
- La radio du téléphone n’est sollicité que lors des mises à jour
- Application légère à télécharger
- Seules les nouvelles informations sont téléchargées (ou celles mises à jours évidemment), les autres sont stockées dans le téléphone

Inconvénients :

- Les données peuvent ne plus être valables si l’on oublie de faire la mise à jour
- 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.

Exemple : CNRI, iAstreinte, Concorde Hotels & Resorts

Ce type d’appli se prêtent bien aux applications métier, ou à usage professionnel, quand la fiabilité est importante, tout en gardant la possibilité d’échanger des informations rapidement.

Il est évidemment possible d’utiliser un mélange de ces techniques en fonctions des services proposés par l’application, ou de passer en mode « dégradé » si la connexion Internet n’est pas disponible.

Des questions sur la faisabilité technique de votre projet d’appli ? Contactez nous au 01.75.43.03.82 pour en discuter

Bookmark and Share
No Comments