web-dev-qa-db-fra.com

Détecter le modèle spécifique d'iPhone / iPod touch

Duplicate possible:
Déterminez le périphérique (iPhone, iPod Touch) avec iOS

Je suis en train de créer un jeu qui utilise les fonctionnalités Bluetooth Bluetooth entre homologues de l'iPhone (et probablement de l'iPod touch de 2e génération). Cependant, pour empêcher les utilisateurs d'essayer de jouer en multijoueur sur un iPod 1ère génération et un iPhone 2G, je dois vérifier le modèle de périphérique spécifique.

[[UIDevice currentDevice] modèle] ne me dira que si l'appareil est un "iPhone" ou un "iPod touch". Existe-t-il un moyen de vérifier le modèle de périphérique spécifique, tel que: "iPhone 3GS", "iPod touch 1ère génération" ou quelque chose du genre.

EDIT:

Il y a une catégorie à UIDevice (je pense qu'elle a été créée par Erica Sadun, je n'en prends pas le crédit) qui utilise le code suivant pour obtenir le modèle de périphérique spécifique. Vous pouvez trouver la catégorie entière ici avec d'autres trucs utiles: https://github.com/erica/uidevice-extension

#include <sys/types.h>
#include <sys/sysctl.h>

@implementation UIDevice (Hardware)

/*
 Platforms
 iPhone1,1 -> iPhone 1G
 iPhone1,2 -> iPhone 3G 
 iPod1,1   -> iPod touch 1G 
 iPod2,1   -> iPod touch 2G 
*/

- (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 encoding:NSUTF8StringEncoding];
  free(machine);
  return platform;
}

Cela fonctionne et les applications utilisant cela ont été récemment approuvées dans l'AppStore.

106
Dimitris

La catégorie la plus complète de UIDevice (Hardware) est probablement http://github.com/erica/uidevice-extension/ (par Erica Sadun):

[[UIDevice currentDevice] platformType]   // ex: UIDevice4GiPhone
[[UIDevice currentDevice] platformString] // ex: @"iPhone 4G"
65
djromero

Vous pouvez obtenir le numéro de modèle du périphérique en utilisant uname de sys/utsname.h. Par exemple:

#import <sys/utsname.h>

NSString*
machineName()
{
    struct utsname systemInfo;
    uname(&systemInfo);

    return [NSString stringWithCString:systemInfo.machine
                              encoding:NSUTF8StringEncoding];
}

Le résultat devrait être:

 @ "i386" sur le simulateur 
 @ "iPod1,1" sur iPod Touch 
 @ "iPod2,1" sur iPod Touch deuxième génération 
 @ "iPod3 , 1 "sur iPod Touch troisième génération 
 @" IPod4,1 "sur iPod Touch quatrième génération 
 @" IPhone1,1 "sur iPhone 
 @" IPhone1,2 "sur iPhone 3G 
 @ "IPhone2,1" sur iPhone 3GS 
 @ "IPad1,1" sur iPad 
 @ "IPad2,1" sur iPad 2 
 @ "IPad3 , 1 "sur iPad 3 (alias nouvel iPad) 
 @" IPhone3,1 "sur iPhone 4 
 @" IPhone4,1 "sur iPhone 4S 
 @" IPhone5,1 " sur iPhone 5 
 @ "iPhone5,2" sur iPhone 5 
152
Will Harris

Que diriez-vous de ce code, si la nouvelle version a été publiée, vous identifierez avec le dernier périphérique connu

#include <sys/types.h>
#include <sys/sysctl.h>

- (NSString *)getModel {
    size_t size;
    sysctlbyname("hw.machine", NULL, &size, NULL, 0);
    char *model = malloc(size);
    sysctlbyname("hw.machine", model, &size, NULL, 0);
    NSString *sDeviceModel = [NSString stringWithCString:model encoding:NSUTF8StringEncoding];
    free(model);                              
    if ([sDeviceModel isEqual:@"i386"])      return @"Simulator";  //iPhone Simulator
    if ([sDeviceModel isEqual:@"iPhone1,1"]) return @"iPhone1G";   //iPhone 1G
    if ([sDeviceModel isEqual:@"iPhone1,2"]) return @"iPhone3G";   //iPhone 3G
    if ([sDeviceModel isEqual:@"iPhone2,1"]) return @"iPhone3GS";  //iPhone 3GS
    if ([sDeviceModel isEqual:@"iPhone3,1"]) return @"iPhone4 AT&T";  //iPhone 4 - AT&T
    if ([sDeviceModel isEqual:@"iPhone3,2"]) return @"iPhone4 Other";  //iPhone 4 - Other carrier
    if ([sDeviceModel isEqual:@"iPhone3,3"]) return @"iPhone4";    //iPhone 4 - Other carrier
    if ([sDeviceModel isEqual:@"iPhone4,1"]) return @"iPhone4S";   //iPhone 4S
    if ([sDeviceModel isEqual:@"iPhone5,1"]) return @"iPhone5";    //iPhone 5 (GSM)
    if ([sDeviceModel isEqual:@"iPod1,1"])   return @"iPod1stGen"; //iPod Touch 1G
    if ([sDeviceModel isEqual:@"iPod2,1"])   return @"iPod2ndGen"; //iPod Touch 2G
    if ([sDeviceModel isEqual:@"iPod3,1"])   return @"iPod3rdGen"; //iPod Touch 3G
    if ([sDeviceModel isEqual:@"iPod4,1"])   return @"iPod4thGen"; //iPod Touch 4G
    if ([sDeviceModel isEqual:@"iPad1,1"])   return @"iPadWiFi";   //iPad Wifi
    if ([sDeviceModel isEqual:@"iPad1,2"])   return @"iPad3G";     //iPad 3G
    if ([sDeviceModel isEqual:@"iPad2,1"])   return @"iPad2";      //iPad 2 (WiFi)
    if ([sDeviceModel isEqual:@"iPad2,2"])   return @"iPad2";      //iPad 2 (GSM)
    if ([sDeviceModel isEqual:@"iPad2,3"])   return @"iPad2";      //iPad 2 (CDMA)

    NSString *aux = [[sDeviceModel componentsSeparatedByString:@","] objectAtIndex:0];

//If a newer version exist
    if ([aux rangeOfString:@"iPhone"].location!=NSNotFound) {
        int version = [[aux stringByReplacingOccurrencesOfString:@"iPhone" withString:@""] intValue];
        if (version == 3) return @"iPhone4"
        if (version >= 4) return @"iPhone4s";

    }
    if ([aux rangeOfString:@"iPod"].location!=NSNotFound) {
        int version = [[aux stringByReplacingOccurrencesOfString:@"iPod" withString:@""] intValue];
        if (version >=4) return @"iPod4thGen";
    }
    if ([aux rangeOfString:@"iPad"].location!=NSNotFound) {
        int version = [[aux stringByReplacingOccurrencesOfString:@"iPad" withString:@""] intValue];
        if (version ==1) return @"iPad3G";
        if (version >=2) return @"iPad2";
    }
    //If none was found, send the original string
    return sDeviceModel;
}
23
Rodrigo
BOOL hasHighResScreen = NO;
if ([UIScreen instancesRespondToSelector:@selector(scale)]) {
    CGFloat scale = [[UIScreen mainScreen] scale];
    if (scale > 1.0) {
        hasHighResScreen = YES;
    }
}
4
fuzz

iPhone 4 est iPhone3,1 et iPhone3,2
iPhone 4S est iPhone4,1
iPad 2 est iPad2,1 iPad2,2 et iPad2,3 selon la version (GSM, etc.)
iPad 3 est iPad3,1 iPad3,2 et iPad3,3 selon la version (GSM, etc.)

Voir secrets Iphone (faites défiler jusqu'à "codes de produit internes")

Une autre bonne source est: everyiphone.com

4
Sten