Rilevare la specifica tocco modello di iPhone / iPod [duplicare]
-
12-09-2019 - |
Domanda
Eventuali duplicati:
Determinare dispositivo (iPhone, iPod Touch) con iOS
Sto facendo un gioco che utilizza le funzionalità Bluetooth peer-to-peer di iPhone (e probabilmente l'iPod touch 2a generazione). Tuttavia, per fermare gli utenti dal tentativo di riprodurre un multiplayer su un 2G iPod prima generazione e iPhone ho bisogno di controllare per il modello di dispositivo specifico.
[[UIDevice currentDevice] modello] sarà dimmi solo se il dispositivo è un "iPhone" o un "iPod touch". C'è un modo per verificare il modello di dispositivo specifico, come:. "IPhone 3GS", "iPod touch di prima generazione" o qualcosa del genere
Modifica
C'è una categoria di UIDevice (penso che sia creato da Erica Sadun, non prendo credito per esso) che utilizza il seguente codice per ottenere il modello dispositivo specifico. È possibile trovare l'intera categoria qui insieme con altre cose utili: https://github.com/erica/uidevice -Estensione
#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;
}
Questo funziona e le applicazioni che utilizzano questo sono stati di recente approvati in AppStore.
Soluzione
La maggior parte completo Categoria UIDevice (Hardware) probabilmente è http://github.com/erica/uidevice- estensione / (da Erica Sadun):
[[UIDevice currentDevice] platformType] // ex: UIDevice4GiPhone
[[UIDevice currentDevice] platformString] // ex: @"iPhone 4G"
Altri suggerimenti
È possibile ottenere il numero di modello del dispositivo utilizzando uname
da sys/utsname.h
. Ad esempio:
#import <sys/utsname.h>
NSString*
machineName()
{
struct utsname systemInfo;
uname(&systemInfo);
return [NSString stringWithCString:systemInfo.machine
encoding:NSUTF8StringEncoding];
}
Il risultato dovrebbe essere:
@"i386" on the simulator @"iPod1,1" on iPod Touch @"iPod2,1" on iPod Touch Second Generation @"iPod3,1" on iPod Touch Third Generation @"iPod4,1" on iPod Touch Fourth Generation @"iPhone1,1" on iPhone @"iPhone1,2" on iPhone 3G @"iPhone2,1" on iPhone 3GS @"iPad1,1" on iPad @"iPad2,1" on iPad 2 @"iPad3,1" on iPad 3 (aka new iPad) @"iPhone3,1" on iPhone 4 @"iPhone4,1" on iPhone 4S @"iPhone5,1" on iPhone 5 @"iPhone5,2" on iPhone 5
Che ne dite di questo codice, se la nuova versione è stata rilasciata, si Identifier con il dispositivo di ultima conoscenze
#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 è iPhone3,1 e iPhone3,2
iPhone 4S è iPhone4,1
iPad 2 è iPad2,1 iPad2,2 e iPad2,3 a seconda della versione (GSM, ecc)
iPad 3 è iPad3,1 iPad3,2 e iPad3,3 a seconda della versione (GSM, ecc)
Iphone segreti (scorrere fino a "codici prodotto interno")
Un'altra buona fonte è: everyiphone.com
NSString* valueDevice = [[UIDevice currentDevice] model];
e quindi verificare se la stringa è uguale a qualsiasi dispositivo che si sta cercando, come:
if(value==@"iPod1,1" )
{}
e si dovrebbe essere a posto