Archives de la catégorie: Développement

Développement iPad iPhone Mac OS X

La sécurité réseau des apps iOS

Vous concevez des applications ou utilisez régulièrement des applications à usage sécurisé. Que ce soit sur iPhone ou sur iPad.

Celles-ci utilisent en général un nom d’utilisateur et un mot de passe pour accéder à des données sensibles.

Dans l’intérêt de tous, mieux vaut contrôler ce qui passe sur le réseau.

Pré-requis et installation

Tout d’abord, vous aurez besoin de :

  • un iPhone / iPad
  • un Mac
  • XCode 4.2 ou supérieur
  • un compte développeur iOS

Vérifiez bien que vous avez tout installé, y compris les outils en ligne de commande de XCode.

Faire transiter les informations réseau de l’iPhone vers le Mac

Branchez votre appareil sur le Mac.

Ouvrez les Terminal.

Lister les interfaces réseaux via ifconfig -l afin de pouvoir vérifier ultérieurement la création de la nouvelle interface.

Lancer, dans XCode, l’Organizer. (Window -> Organizer)

Allez sur l’onglet Devices.

Dans la liste de gauche, sélectionnez votre appareil.

Dans la fenêtre principale, vous pouvez copier l’identifiant de l’appareil (UDID) dans le champs identifier.

Revenez au Terminal.

Saisissez la commande suivante avec votre propre identifiant à la place des xxxx : rvictl -s xxxx

Saisissez de nouveau ifconfig -l. Une nouvelle interface (rvi0) est apparue.

Analyser les données

Plusieurs outils permettent d’analyser les données d’une interface réseau.

Pour l’exemple, nous utiliserons tcpdump, qui est simple d’usage et suffisamment efficace.

Placez-vous dans un répertoire vide.

Pour analyser les données transitant via rvi0 sur le port 80 (HTTP), la commande est sudo tcpflow -i rvi0 port 80.

Tout ce qui passe en clair sur le réseau internet sera alors stocké dans des fichiers du répertoire courant. Le format de fichier est adresse d’émission vers adresse de destination.

Arrêtez l’analyse via la combinaison Ctrl + c.

Je vous conseille des tester tout ceci avec vos applications les plus courantes : réseaux sociaux, cinéma,… vous aurez quelques surprises.

Et, bien sûr, utilisez-le pour vos propres applications !

Couper la liaison avec le Mac

Saisissez la commande suivante avec votre propre identifiant à la place des xxxx : rvictl -x xxxx

Share
Développement iPad iPhone

XCode 4 et libxml2

Beaucoup de développeurs aiment libxml2 car c’est l’outil XML le plus performant sur iOS.

Un petit rappel est toujours bon. Voici comment, en quelques étapes, avoir un libxml2 intégré à un projet iOS sous XCode 4.

Lier la bibliothèque

Sélectionnez votre projet.

Choisissez la cible (target) de destination dans le projet, sous Targets.

Allez sur build phases.

Dépliez Link Binary With Libraries.

Appuyez sur le bouton + en base de la liste.

Dans la liste, cherchez libxml2.dylib et sélectionnez-le. (vérifiez que le dossier iOS xxx est bien déplié)

Dans la liste de gauche, pour la forme, placez libxml2.dylib dans un dossier Frameworks.

Ajouter les en-têtes

Sélectionnez de nouveau votre projet.

Choisissez la cible (target) de destination dans le projet, sous Targets.

Allez dans Build Settings.

Cherchez Header Search Paths.

Insérez la valeur $SDKROOT/usr/include/libxml2.

En cas de problème, utilisez simplement /usr/include/libxml2.

Utiliser libxml2

La partie la plus facile maintenant.

Importez l’en-tête libxml2 souhaité.

#import <libxml/tree.h>

Vous aurez ensuite droit à l’auto-complétion à volonté et le débogage du code.

Il ne manque plus que l’intégration de la documentation complète. (si quelqu’un a une solution fiable, je suis preneur)

Share
Développement iPad iPhone

Quelques statistiques iOS

Un petit article sur l’état des mises à jour du matériel et du logiciel des utilisateurs d’apps iOS peut toujours être utile pour bien cibler ses développements.

J’utilise un système me permettant de remonter de manière anonyme les informations techniques concernant les utilisatrices (oui, je considère que ce sont des femmes) de l’application Ma Pilule. Cette dernière permet, comme son nom l’indique, de ne pas oublier de prendre sa pilule.

Voici un petit résumé qui permettra, je l’espère, de mieux cibler les attentes des utilisateurs iOS en général.

Pour information, l’application Ma Pilule nécessite iOS 4.0 au minimum.

L’échantillon étant récent, il ne concerne que 12 050 appareils.

Les familles de matériel

  • 0,3 % d’iPad (l’application est optimisée iPhone uniquement)
  • 94,7 % d’iPhone
  • 5 % d’iPod Touch

Les générations de matériel

  • 3,5 % de 2ème génération (iPhone 3G + iPod Touch 2)
  • 33,5 % de 3 ème génération (iPad + iPhone 3GS + iPod Touch 3)
  • 63 % de 4 ème génération (iPad 2 + iPhone 4 + iPod Touch 4)

Quelques rappels sur iOS

En termes de compatibilité, le matériel de 2ème génération est compatible jusqu’à iOS 4.2.1 uniquement.

Les nouveautés principales de iOS :

  • 4.0 : multi-tâches, FaceTime, etc
  • 4.1 : Game Center, HDR, etc
  • 4.2 : compatible iPad, AirPrint, AirPlay, etc
  • 4.3 : non-compatible 2ème génération, améliorations diverses, mode hot-spot pour l’iPhone 4
En clair, les versions jusqu’à 4.2 sont intéressantes pour tout le monde.
La 4.3 est plus spécifique et offre en principale nouveauté le support du mode hot-spot  (partage de connexion) pour l’iPhone 4. Cette dernière version est plus anecdotique donc.

Les versions principales de iOS

  • 4.0 : 2,6 %
  • 4.1 : 7,7 %
  • 4.2 : 24,2 %
  • 4.3 : 65,4 %
  • 5.0 : 0,02 %

Les versions maximales en fonction du matériel

  • matériel de 2ème génération - jusqu’à iOS 4.2.1 : 85 %
  • matériel de 3ème génération – jusqu’à iOS 4.3.4 : 63 % – jusqu’à iOS 4.2.1 : 86 %
  • matériel de 4ème génération – jusqu’à iOS 4.3.4 : 71 % – jusqu’à iOS 4.2.1 : 92 %

Conclusion

En conclusion, on peut retenir essentiellement ceci :

  • les mises à jour iOS sont fréquentes, du moment qu’elles apportent de réelles nouveautés
  • les appareils de 2ème génération ne sont quasiment plus présents
  • la très grande majorité des appareils du marché pourra aisément passer à iOS 5.0.
Share
Développement

Le Singleton facile (XCode 3 et 4)

Le singleton est très utilisé en Objective-C afin d’accéder à un objet partagé.
Seulement, cela peut-être fastidieux à intégrer.

Pour éviter le code à rallonge, voici un fichier qui pourra vous être utile.

KSSingleton.h

Son usage est relativement simple.

MySingleton.h

#import    #import "KSSingleton.h"   @interface MySingleton : NSObject {         NSInteger integerValue; }   @property (assign) NSInteger integerValue;   KS_SINGLETON_INTERFACE(MySingleton)   @end

MySingleton.m

#import "MySingleton.h"   @interface MySingleton (hidden)   - (void)initialization;   @end   @implementation MySingleton (hidden)   - (void)initialization {         integerValue = 12; }   @end   @implementation MySingleton   @synthesize integerValue;   KS_SINGLETON_IMPLEMENTATION(MySingleton)   @end

Notez que l’implémentation de - (void)initialization; est facultative. Elle peut cependant être utile à l’initialisation du singleton.

Ensuite, l’utilisation dans le code se fait ainsi :

MySingleton *s = [MySingleton sharedSingleton];

L’appel au singleton se fait toujours via [MaClasse sharedMaClasse].

Vous pouvez utiliser cette fonctionnalité à titre personnel et/ou professionnel, du moment que vous conservez son en-tête intacte.

Vous pouvez également télécharger le Projet d’exemple ici.

Le modèle de fichier (XCode 3)

Si vraiment vous souhaitez gagner du temps, utilisez directement notre modèle de fichier.

La procédure d’installation est simple.

Placez vous, dans votre répertoire « Bibliothèque » (Library). Allez donc à l’emplacement /Users/utilisateur/Library/Application Support/Developer/Shared/XCode.

S’il n’existe pas, créez le répertoire File Templates. Placez vous dans ce répertoire. Créez le répertoire Kaeli Soft.

Téléchargez l’archive Kaeli Soft. Décompressez son contenu dans Kaeli Soft.

Relancez XCode.

Pour l’utiliser : File -> New File… puis sélectionnez, dans User Templates, Kaeli Soft.

Vous aurez alors la possibilité de créer un Singleton. Appuyez sur Next. Définissez le nom du fichier (qui sera le nom de la classe) et appuyez sur Finish.

Votre singleton est prêt !

Le modèle de fichier (XCode 4)

Si vraiment vous souhaitez gagner du temps, utilisez directement notre modèle de fichier.

La procédure d’installation est simple.

Placez vous, dans votre répertoire « Bibliothèque » (Library). Allez donc à l’emplacement /Users/utilisateur/Library/Developer/XCode.

S’il n’existe pas, créez le répertoire File Templates. Placez vous dans ce répertoire.

Téléchargez l’archive Kaeli Soft. Décompressez son contenu dans File Templates : on doit avoir un nouveau répertoire Kaeli Soft contenant Objective-C Singleton.xctemplate.

Relancez XCode.

Pour l’utiliser : File -> New File… puis sélectionnez, dans iOS ou Mac OS XKaeli Soft.

Vous aurez alors la possibilité de créer un Singleton. Appuyez sur Next. Définissez le nom du fichier (qui sera le nom de la classe) et appuyez sur Finish.

Votre singleton est prêt !

 

Share
Développement iPhone

Formations vidéos au développement iOS sur iPhone

Un petit billet rapide pour vous informer que j’ai réalisé une formation complète au développement iOS.

Bien entendu, tous les sujets n’ont pas pu être traités. C’est pourquoi je me suis appuyé sur l’expérience de Kaeli Soft afin de proposer les réponses les plus complètes aux questions les plus courantes.

Grâce à cette formation proposée par video2brain, vous aurez toutes les bases nécessaires au développement iOS (et un peu plus encore)

Vous pouvez visualiser gratuitement quelques extraits et voir le détail de la formation à l’adresse suivante : http://www.video2brain.com/fr/products-241.htm

Share
Développement iPhone

iPhone : le mono-tâche avenir du multi-tâches sur smartphone ?

Un des sujets épineux de ces derniers temps fût le support du multi-tâches sur iPhone OS. On ne peut pas faire tourner 4 programmes à la fois sur un iPhone alors que c’est possible sur un ordinateur de bureau.

  • Limite technique ? Pas vraiment. Sans être multi-coeurs, le processeur de l’iPhone sait faire plusieurs choses à la fois. (on peut écouter de la musique en surfant par exemple)
  • Limite de l’OS ? Non plus. iPhone OS repose sur Mac OS X qui est tout à fait à l’aise avec ce procédé.

Mais alors, pourquoi ?

(très) rapide historique du développement sur smartphone

Les premiers smartphones orientés grand public furent, entre autres, les Windows CE.

Et comme chez Microsoft (et d’autres) on n’a pas spécialement cherché a se compliquer la tâche, on a donc fait en sorte que ça fonctionne comme sur un ordinateur de bureau, mais en plus petit.

Ca fonctionne, oui mais…

La farandole des programmes « maison »

Forcément, les développeurs ont rapidement voulu concevoir leurs applications « maison », tournant pour certaines en tâche de fond.

Ensuite, on a forcément pu lancer plein d’applications dans tous les sens : des applications de qualité excellente à médiocre. (à savoir, gourmande en mémoire, mais restant en tâche de fond)

Sans compter que certaines lancent elles-même des sous-tâches (appelées threads) qui s’exécutent avec une emprunte mémoire certes mince (autour d’1 Mo) et qui s’arrêtent ensuite (ou pas).

Sauf que cette gourmandise mémoire fait que le smartphone devient très vite horriblement lent. Le smartphone n’a pas le quart de la mémoire d’un ordinateur. Il arrive donc vite à saturation.

Mais que faire alors ?

C’est très certainement la question que ce sont posés les ingénieurs d’Apple en lançant l’iPhone.

Le principe est simple :

  • lancer une application
  • sauvegarder son état à la fermeture
  • restaurer son état à l’ouverture

Du coup :

  • les applications se lancent rapidement, car elles ont un maximum de mémoire disponible,
  • leur état est enregistré, donc pas de soucis de reprise d’activité,
  • la batterie est économisée car aucun processus ne consomme inutilement des ressources.

Bien entendu, au début, tout le monde s’est plein de cette « limitation ». Mais aujourd’hui, l’iPhone reste l’un des smartphones les plus appréciés.

Un exemple suivi ?

Alors que les Windows Mobile étaient jusqu’ici multi-tâches, la version Windows Mobile 7 en cours de développement s’oriente elle vers le mono-tâche, à la manière de l’iPhone.

Share
Développement

Utilisation optimale de UIImagePickerController

Quand vous utilisez UIImagePickerController pour prendre une photo avec l’iPhone depuis la bibliothèque ou bien l’appareil photo, il vous est possible d’éditer cette dernière grâce à l’option setAllowsEditing.

Cela se présente donc comme ceci :

if (imagePickerController == nil) { 		imagePickerController = [[UIImagePickerController alloc] init]; 		[imagePickerController setDelegate:self]; 		[imagePickerController setSourceType:UIImagePickerControllerSourceTypeCamera]; 		[imagePickerController setAllowsEditing:YES]; 	}   	[self presentModalViewController:imagePickerController animated:YES];

Jusqu’ici, pas de problème.

Seulement, c’est après que les problèmes arrives. Vous récupérez votre image via

- (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info { [...] }

Et vous vous rendez compte que l’image originale correspond à la capacité de l’appareil (3Mpx pour le 3GS) mais pas l‘image éditée qui est elle en 320×320 !!!

La méthode à utiliser est donc la suivante :

  • récupérer l’image originale
  • la mettre à l’endroit, car c’est à l’endroit qu’est créé le repère de découpe
  • utiliser le repère pour découper l’image
  • redimensionner l’image découpée aux dimensions souhaitées

Et voilà, vous avez votre belle image bien découpée et de bonne qualité !

Et si vous voulez annuler, voici le code (merci Laurent) :

- (void)imagePickerControllerDidCancel:(UIImagePickerController *)picker {     //Cancel     [[picker parentViewController] dismissModalViewControllerAnimated:YES]; }

Vous trouverez un projet d’exemple ci-dessous.

Télécharger le projet XCode d’exemple

Share
Développement iPhone

Utilisation de la sortie TV de l’iPhone

Dans ce bref article, vous allez découvrir comment utiliser la sortie TV de l’iPhone.

Développement

Avertissement : Les API utilisées dans le code suivant sont privées. Ce code ne pourra donc pas être validé sur l’AppStore.

Tout d’abord, pensez à utiliser le framework MediaPlayer.

Ensuite, il suffit d’utiliser MPTVOutWindow et MPVideoView afin d’afficher le contenu sur la sortie TV. Il y a donc 2 fenêtres à gérer : une pour la TV et une pour l’iPhone.

Voici un exemple de code.

L’interface :

#import #import    @interface MPTVOutWindow : UIWindow - (id)initWithVideoView:(id)view; @end     @interface MPVideoView : UIView - (id)initWithFrame:(struct CGRect)rect; @end     @interface TVOutTestAppDelegate : NSObject  {     UIWindow *window;   	IBOutlet UIView *iphoneView; }   @property (nonatomic, retain) IBOutlet UIWindow *window;   @end

L’implémentation :

#import "TVOutTestAppDelegate.h"   @implementation MPVideoView (extended) - (void) addSubview: (UIView *)view {     [super addSubview:view]; } @end   @implementation TVOutTestAppDelegate   @synthesize window;   - (void)applicationDidFinishLaunching:(UIApplication *)application { 	// TV Out 	MPVideoView *videoView = [[MPVideoView alloc] initWithFrame:[[UIScreen mainScreen] bounds]];   	UIView *backgroundView = [[UIView alloc] initWithFrame:CGRectMake(40.0f, 40.0f, 250.0f, 250.0f)]; 	[backgroundView setBackgroundColor:[UIColor yellowColor]];   	UILabel *videoLabel = [[UILabel alloc] initWithFrame:CGRectMake(10.0f,10.0f, 150.0f, 20.0f)]; 	[videoLabel setText:@"TV Out"];   	[backgroundView addSubview:videoLabel]; 	[videoLabel release];   	[videoView addSubview:backgroundView]; 	[backgroundView release];   	MPTVOutWindow *tvoutWindow = [[MPTVOutWindow alloc] initWithVideoView:videoView]; 	[videoView release];   	[tvoutWindow makeKeyAndVisible];   	// iPhone 	[window addSubview:iphoneView];     [window makeKeyAndVisible]; }   - (void)dealloc {     [window release];     [super dealloc]; }   @end

Cet exemple a été testé sur un iPod Touch également.

Pourquoi Apple ne l’autorise-t-elle pas ?

Les performances de la sortie TV sont malheureusement trop limitées pour être exploitable pleinement.

Par mesure de sécurité et par gage de qualité, Apple préfère donc restreindre son usage à la seule application iPod.

Intérêt à l’heure actuelle

La future tablette tactile d’Apple fonctionnerait, selon les rumeurs, sur iPhone OS.

La sortie TV est donc un bon moyen de tester une application en multiples résolutions.

Une ouverture potentielle…

Peut-être serait-il intéressant de permettre l’utilisation de la sortie TV dans un cadre spécifique, comme par exemple pour visionner la TV (SFR, Orange) ou les vidéos YouTube.

Cette décision n’appartient aujourd’hui qu’à Apple, qui reste maître du jeu. Un jour, peut-être…

Share
Développement iPhone

Activer le clavier Emoji de l’iPhone / iPod Touch

Emoji : kézako ?

Clavier Emoji iPhone OS

Tout d’abord, que sont les caractères Emoji ? Ce sont des émoticônes utilisés pour les SMS par diverses sociétés japonaises, dont Softbank.

Ces caractères sont des caractères Unicode standards.

Ils sont directement affichables dans vos applications iPhone. Testez donc le code suivant dans un UILabel par exemple :

label.text = @"\ue402 youpi !";

Tada !!

Et oui, vous voyez apparaître une icône dans le texte. Il n’est pas nécessaire d’activer le clavier Emoji pour afficher des émoticônes !

Passons à la pratique

Nous allons maintenant voir comment activer cette option.

Partie 1: Déblocage du clavier

Pour les développeurs

Voici le code nécessaire à l’activation du clavier.

Emoji.h

@interface Emoji : NSObject { }   + (id)emoji;   @property (nonatomic,getter=isEnabled) BOOL enabled;   @end

Emoji.m

#import "Emoji.h"   static NSString *const kPreferencesFilePath	= @"/private/var/mobile/Library/Preferences/com.apple.Preferences.plist"; static NSString *const kEmoji				= @"KeyboardEmojiEverywhere";   static NSMutableDictionary	*prefDict		= nil; static Emoji				*sharedEmoji	= nil;   @interface Emoji (hidden)   - (void)initialization;   @end   @implementation Emoji (hidden)   - (void)initialization { 	prefDict = [[NSMutableDictionary alloc] 				initWithContentsOfFile:kPreferencesFilePath]; }   @end   @implementation Emoji   @synthesize enabled;   #pragma mark - #pragma mark Keyboard enabled / disabled   - (void)setEnabled:(BOOL)value { 	if (prefDict == nil) { 		return; 	}   	if ([self isEnabled] == value) { 		return; 	}   	[prefDict setObject:[NSNumber numberWithBool:value] forKey:kEmoji]; 	[prefDict writeToFile:kPreferencesFilePath 			   atomically:NO]; }   - (BOOL)isEnabled { 	if (prefDict == nil) { 		return NO; 	}   	return [[prefDict objectForKey:kEmoji] boolValue]; }   #pragma mark - #pragma mark Singleton   + (id)emoji { 	@synchronized(self) { 		if (sharedEmoji == nil) { 			[[self alloc] init]; 		} 	}   	return sharedEmoji; }   + (id)allocWithZone:(NSZone *)zone { 	@synchronized(self) { 		if (sharedEmoji == nil) { 			sharedEmoji = [super allocWithZone:zone]; 			[sharedEmoji initialization]; 			return sharedEmoji; 		} 	} 	return nil; }   - (id)copyWithZone:(NSZone *)zone { 	return self; }   - (id)retain { 	return self; }   - (unsigned)retainCount { 	return UINT_MAX; }   - (void)release { }   - (id)autorelease { 	return self; }   @end

Le fonctionnement :

Emoji *emoji = [Emoji emoji];   // activation du clavier emoji.enabled = YES;   // désactivation du clavier emoji.enabled = NO;

Et voilà !

Pour les non développeurs

Kaeli Soft est actuellement en train de développer une application gratuite permettant d’activer ce clavier. Vous en saurez plus prochainement.

Partie 2: Activation du clavier

Lancez l’application Réglages.

Allez dans Général.

Puis Clavier.

Ensuite Clavier internationaux.

Sélectionnez le menu Japonais.

Enfin, activez l’option icônes Emoji.

Partie 3: Utilisation

Vous pouvez dès à présent utiliser votre clavier dans n’importe quelle application.

Attention : un redémarrage est nécessaire si vous désirez l’utiliser dans l’application Mail.

Share