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.
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"
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
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;
}
BOOL hasHighResScreen = NO;
if ([UIScreen instancesRespondToSelector:@selector(scale)]) {
CGFloat scale = [[UIScreen mainScreen] scale];
if (scale > 1.0) {
hasHighResScreen = YES;
}
}
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