lundi 5 mars 2012

Détection de périphérique Redux

Un temps, j'ai posté un peu de code par Max Hor'ath pour détecter le périphérique de votre programme a été exécuté. Ce script date du jour pré-3Gs, ne sera donc pas d'identifier ce modèle. Je ne sais pas si Max a mis à jour son script, mais j'ai trouvé cette classe on Stack Overflow by Jason Goldberg. En plus d'ajouter du matériel plus récent, il utilise une approche vraiment efficace mis en œuvre dans relativement peu de lignes de code. J'aime que beaucoup de choses.

La seule chose que je n'aime pas, c'est la façon dont la classe est mis en œuvre. Il n'y a aucune raison d'utiliser les méthodes d'instance comme celle-ci et d'engager les frais généraux de création d'objets à. L'objet n'a pas d'état, juste un comportement, alors une de ces méthodes auraient pu être écrits soit en tant que fonctions C ou en tant que méthodes de classe, évitant ainsi la nécessité de créer un objet et de gérer sa mémoire. Au moins, cette classe doit avoir été mis en œuvre comme un singleton.

Quiconque a lu mon blog sans doute sait où je vais ici. Dans ma toujours aussi humble avis, la meilleure approche pour cette fonctionnalité ont été de l'écrire comme une catégorie sur UIDevice, comme ceci:

UIDevice-Platform.h
#import <Foundation/Foundation.h>

@interface UIDevice (platform)

- (NSString *) platform;
- (NSString *) platformString;

@end

UIDevice-Platform.m
#import "UIDevice-Platform.h"
#include <sys/types.h>
#include <sys/sysctl.h>

@implementation UIDevice (platform)

- (NSString *) platform{
size_t size;
sysctlbyname("hw.machine", NULL, &size, NULL, 0);
char *machine = malloc(size);
sysctlbyname("hw.machine", machine, &size, NULL, 0);
NSString *platform = [NSString stringWithCString:machine];
free(machine);
return platform;
}

- (NSString *) platformString{
NSString *platform = [self platform];
if ([platform isEqualToString:@"iPhone1,1"]) return @"iPhone 1G";
if ([platform isEqualToString:@"iPhone1,2"]) return @"iPhone 3G";
if ([platform isEqualToString:@"iPhone2,1"]) return @"iPhone 3GS";
if ([platform isEqualToString:@"iPod1,1"]) return @"iPod Touch 1G";
if ([platform isEqualToString:@"iPod2,1"]) return @"iPod Touch 2G";
if ([platform isEqualToString:@"i386"]) return @"iPhone Simulator";
return platform;
}

- (BOOL)supportsBluetoothNetworking {
NSString *platform = [self platform];
return !([platform isEqualToString:@"iPhone1,1"] || platform isEqualToString:@"iPod1,1"]);
}

@end


Aucun commentaire: