32 votes

API pour déterminer si vous utilisez un iPhone ou un iPad

Est-il une API pour la vérification à l'exécution si vous êtes en cours d'exécution sur un iPhone ou un iPad?

Une façon, je pense, serait d'utiliser:

[[UIDevice currentDevice] model];

Et de détecter l'existence de la chaîne @"iPad" - ce qui semble un peu fragile.

Dans le SDK 3.2, je vois qu' UIDevice a également une propriété qui est vraiment ce que je cherche, mais ne fonctionne pas pour les pré-3.2 (évidemment):

[[UIDevice currentDevice] userInterfaceIdiom]; 

Il existe d'autres moyens de vérifier l'existence d' @"iPad" pour une app universelle?

41voto

Andiih Points 7331

Checkout UI_USER_INTERFACE_IDIOM.

Renvoie l'interface de langage pris en charge par l'appareil.

Valeur De Retour
UIUserInterfaceIdiomPhone si l'appareil est un iPhone ou d'un iPod touch ou d' UIUserInterfaceIdiomPad si l'appareil est un iPad.

UIUserInterfaceIdiom

Le type de l'interface qui doit être utilisé sur l'appareil

typedef enum {
   UIUserInterfaceIdiomPhone,
   UIUserInterfaceIdiomPad,
} UIUserInterfaceIdiom;

15voto

Yar Points 25421

Juste pour ma référence:

@property (nonatomic, readonly) BOOL isPhone;

-(BOOL)isPhone {
    return (UI_USER_INTERFACE_IDIOM()==UIUserInterfaceIdiomPhone);
}

ou utiliser un #define

#define IS_PHONE  (UI_USER_INTERFACE_IDIOM()==UIUserInterfaceIdiomPhone)

Toutefois, si vous utilisez isPhone partout dans votre code, c'est généralement une mauvaise pratique. Utiliser le modèle de fabrique et le polymorphisme de garder votre if déclarations contenues, de sorte que vous obtenez les objets créés pour le téléphone ou pour l'iPad, puis de travailler avec ceux-ci.

Ajouté

Je suis l'aide de cette solution sur mon code maintenant. Il ajoute un standard d'usine de motif dans les alloc.

#define ALLOC_PER_DEVICE()  id retVal = nil; \
                        NSString *className = NSStringFromClass(self);\
                        if (IS_PHONE && ![className hasSuffix:@"Phone"]) {\
                            className = [NSString stringWithFormat:@"%@Phone", className];\
                            Class newClass = NSClassFromString(className);\
                            retVal = [newClass alloc];\
                        }\
                        if (!retVal)\
                            retVal = [super alloc];\
                        assert(retVal != nil);\
                        return retVal\

Alors mes allocations ressembler à ceci:

+alloc { ALLOC_PER_DEVICE(); }

Et j'ajoute une sous-classe appelée TheClassPhone pour la version de téléphone.

Remarque: comme il n'y a pas d'héritage multiple en Objective-C, l'utilisation de l'héritage pour résoudre vos problèmes est un peu surfait (c'est à dire, il ne fonctionne pas si vous avez des sous-classes de sous-classes). Rien de tel qu'un bon if quand vous en avez besoin.

1voto

Jakob Borg Points 10869
  1. Vérifiez la présence de la propriété userInterfaceIdiom, utilisez le paramètre respondsToSelector :. S'il n'existe pas, nous sommes sur un appareil pré-3.2, donc pas sur un iPad.
  2. Si userInterfaceIdiom existe, utilisez-le.

Edit: ... ce qui est évidemment exactement ce que la macro UI_USER_INTERFACE_IDIOM () fait, utilisez donc plutôt cela. :)

1voto

Aragon Points 252

Vous pouvez vérifier si vous exécutez l'application sur iPhone ou iPad en utilisant le code suivant:

 - (NSString *)deviceModel
{
    struct utsname systemInfo;
    uname(&systemInfo);
    return [NSString stringWithCString:systemInfo.machine encoding:NSUTF8StringEncoding];
}

- (NSString *) platformString
{
    NSString *platform = [self deviceModel];
    if ([platform isEqualToString:@"iPhone1,1"])    return @"iPhone_2G";
    else if ([platform isEqualToString:@"iPhone1,2"])    return @"iPhone_3G";
    else if ([platform isEqualToString:@"iPhone2,1"])    return @"iPhone_3GS";
    else if ([platform isEqualToString:@"iPhone3,1"])    return @"iPhone_4";
    else if ([platform isEqualToString:@"iPhone3,3"])    return @"Verizon_iPhone_4";
    else if ([platform isEqualToString:@"iPhone4,1"])    return @"iPhone_4S";
    else if ([platform isEqualToString:@"iPhone5,1"])    return @"iPhone_5";
    else if ([platform isEqualToString:@"iPhone5,2"])    return @"iPhone_5";
    else if ([platform isEqualToString:@"iPod1,1"])      return @"iPod_Touch 1G";
    else if ([platform isEqualToString:@"iPod2,1"])      return @"iPod_Touch 2G";
    else if ([platform isEqualToString:@"iPod3,1"])      return @"iPod_Touch 3G";
    else if ([platform isEqualToString:@"iPod4,1"])      return @"iPod_Touch 4G";
    else if ([platform isEqualToString:@"iPad1,1"])           return @"iPad_1G";
    else if ([platform isEqualToString:@"iPad2,1"])      return @"iPad_2(WiFi)";
    else if ([platform isEqualToString:@"iPad2,2"])      return @"iPad_2(GSM)";
    else if ([platform isEqualToString:@"iPad2,3"])      return @"iPad_2(CDMA)";
    else if ([platform isEqualToString:@"iPad3,1"])      return @"iPad_3";
    else if ([platform isEqualToString:@"iPad3,2"])      return @"iPad_3(GSM/CDMA)";
    else if ([platform isEqualToString:@"iPad3,3"])      return @"iPad_3(GSM)";
    else if ([platform isEqualToString:@"iPad3,4"])      return @"iPad_3(GSM)";
    else if ([platform isEqualToString:@"iPad2,5"])      return @"iPad_mini_1G";
    else if ([platform isEqualToString:@"i386"])         return @"Simulator";
    else if ([platform isEqualToString:@"x86_64"])       return @"Simulator";
    return platform;
}
 

1voto

Jeff Kelley Points 12893

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X