Objective c ipad2检测
因为我没有iPad2,所以我需要知道调用[[UIDevice currentDevice]model]时它会返回什么。我以为它只返回“iPad”,但似乎我错了 有人能告诉我吗Objective c ipad2检测,objective-c,ipad,ipad-2,ios,Objective C,Ipad,Ipad 2,Ios,因为我没有iPad2,所以我需要知道调用[[UIDevice currentDevice]model]时它会返回什么。我以为它只返回“iPad”,但似乎我错了 有人能告诉我吗 谢谢切勿将model属性用于除显示信息或诊断输出以外的任何其他用途。它不能保证被保存,如果你依赖它,你就不必要地在新设备出现时切断它们 许多iPhone应用程序无法在iPad的兼容模式下使用,只是因为它们检查了model属性,如果不是iPhone/iPod,它们什么也不做。检查是否有带摄像头的iPad BOOL isIPa
谢谢切勿将
model
属性用于除显示信息或诊断输出以外的任何其他用途。它不能保证被保存,如果你依赖它,你就不必要地在新设备出现时切断它们
许多iPhone应用程序无法在iPad的兼容模式下使用,只是因为它们检查了
model
属性,如果不是iPhone/iPod,它们什么也不做。检查是否有带摄像头的iPad
BOOL isIPad2 = (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad &&
[UIImagePickerController isSourceTypeAvailable: UIImagePickerControllerSourceTypeCamera]);
请注意,通常最好检测特定的特性,而不是基于模型/版本检测做出笼统的假设。例如,如果您需要一个摄像头,则显式测试该摄像头;如果您需要根据可用RAM的数量调整UI质量;等等。还请注意,这突出了使用模型检测的危险。首先,我应该提到,我花了很多时间才弄明白为什么ipad模拟器“说”它是iphone。对我来说,我只需要将它切换到universal: 这是我认为非常典型的检测代码。还有一些可能也有用,但是
// lifted this from the ios 4 cookbook:
- (BOOL) isiPad{
BOOL result = NO;
NSString *classAsString =
NSStringFromClass([UISplitViewController class]);
if (classAsString == nil ||
[classAsString length] == 0){
return(NO);
}
UIDevice *device = [UIDevice currentDevice];
if ([device respondsToSelector:
@selector(userInterfaceIdiom)] == NO){
return(NO);
}
NSLog(@"Device: %d", [[UIDevice currentDevice] userInterfaceIdiom]);
NSLog(@"Device: %@", [[UIDevice currentDevice] model]);
if ([device userInterfaceIdiom] != UIUserInterfaceIdiomPad){
return(NO);
}
// you can put some screen size tests here too if you'd like
result = YES;
return(result);
}
要获得精确的模型字符串,例如“iPad2,2”,您可以使用如下内容
#import "YourDeviceDetectionClass.h"
#include <sys/utsname.h>
@implementation YourDeviceDetectionClass
+(NSString*)modelAsString
{
struct utsname platform;
int rc = uname(&platform);
if(rc == -1)
{
// Error...
return nil;
}
else
{
// Convert C-string to NSString
return [NSString stringWithCString:platform.machine encoding:NSUTF8StringEncoding];
}
}
@end
#导入“YourDeviceDetectionClass.h”
#包括
@实现YourDeviceDetectionClass
+(NSString*)模型字符串
{
结构utsname平台;
int rc=解除警报(&平台);
如果(rc==-1)
{
//错误。。。
返回零;
}
其他的
{
//将C字符串转换为NSString
返回[NSString stringWithCString:platform.machine编码:NSUTF8StringEncoding];
}
}
@结束
如果您使用的是OpenGL,您可以查看GPU模型。iPad1有一个PowerVR SGX 535,iPad2有一个PowerVR SGX 543
const char * deviceStr = (const char *)glGetString(GL_RENDERER);
if (!strcmp(deviceStr, "PowerVR SGX 535")) {
// iPad 1
}
else {
// iPad 2 or later
}
应该有帮助。要获得更具体的解决方案,请尝试
至于第二个问题,测试分辨率的最佳方法是获得一个与iPad3,1的PPI数量相似的显示器。不幸的是,你可能无法做到。测试任何应用程序的最佳方法是在实际设备上。我认为您可以按比例测试它
if ([[UIScreen mainScreen] respondsToSelector:@selector(scale)]) {
if ([[[UIScreen mainScreen] scale] == 2.0) {
// retina display
}
}
屏幕+视网膜
#进口
@interface UIScreen(Retina)
// Returns YES if this is a Retina display.
- (BOOL)isRetina;
@end
UIScreen+Retina.m
#import "UIScreen+Retina.h"
@implementation UIScreen(Retina)
- (BOOL)isRetina {
return [self respondsToSelector:@selector(displayLinkWithTarget:selector:)] && (self.scale == 2.0);
}
@end
用法
//http://stackoverflow.com/questions/3294100/how-to-differentiate-between-iphone4-and-iphone-3
if ([[UIScreen mainScreen] isRetina]) {
// Retina display
}
IPAD/IPHONE高/低分辨率
#import "UIScreen+Retina.h"
if([UIDevice currentDevice].userInterfaceIdiom == UIUserInterfaceIdiomPad){
//IPAD
if ([[UIScreen mainScreen] isRetina]) {
// IPAD 3 - Retina display
bannersGetPromoServerRequest.size = kXML_API_IMAGESIZE_IPAD_HIGHRES;
}else{
//iPAD 1/2
bannersGetPromoServerRequest.size = kXML_API_IMAGESIZE_IPAD_LOWRES; }
}else{
//IPHONE
if ([[UIScreen mainScreen] isRetina]) {
// IPHONE 4/4s/5 - Retina display
bannersGetPromoServerRequest.size = kXML_API_IMAGESIZE_IPHONE_HIGHRES;
}else{
//IPHONE (3.x)
bannersGetPromoServerRequest.size = kXML_API_IMAGESIZE_IPHONE_LOWRES;
}
}
此行将打印设备版本: iPad1:平台:iPad1,1 iPad2:平台:iPad2,1 iPad3:平台:iPad3,3 iphone4s:平台:iPhone4,1 模拟器:平台:x86_64
size_t size;
sysctlbyname("hw.machine", NULL, &size, NULL, 0);
char *answer = (char*)malloc(size);
sysctlbyname("hw.machine", answer, &size, NULL, 0);
NSString *platform = [NSString stringWithCString:answer encoding: NSUTF8StringEncoding];
free(answer);
NSLog(@"Platform: %@", platform);
您可以从以下网站获得所需的所有IPad2返回型号或iOS设备型号: 您还可以使用以下代码直接检索模型:
- (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;
}
你在这里得到了很多答案,这些答案陈述了你为什么不应该这样做的观点,并且给了你其他的代码,但是你没有得到你问题的任何实际答案。如果您想准确地确定您正在运行的设备(无论出于何种目的…不要让其他开发人员假装知道您要完成的任务),您可以使用
UIDeviceHardware
第三方类。你可以在这里找到它:
您只需拨打:
NSString *platformString = [UIDeviceHardware platformString];
它将返回设备。在您的情况下,您需要将platformString
与以下任何一项匹配:
@"iPad 2 (WiFi)"
@"iPad 2 (GSM)"
@"iPad 2 (CDMA)"
不要检测iPad2,检测iPad2的功能。很可能iPad3和其他设备也会有这样的产品。购买一个型号对于避免检查AGP仍然很有用,因为AGP需要几秒钟的时间。例如,如果模型字符串中有一个iPhone,您就知道该设备有AGP。如果你得到一个未知字符串,你仍然可以使用回退。iPadN+1的一些功能(例如,更多的内存,更好的性能)最好用“不是iPadN或更低的iPad”来概括。我认为设备检测有时是可以的,只要你知道旧设备上存在内存或帧速率问题时,通过从最差的设备开始检测,而不是从(当前)最好的设备开始检测,来证明它是可行的。在web开发中,或者在为环境范围更广的其他操作系统(如Android)开发时,性能检测更可取。谢谢。我自己也没想到这么远-这是一个好黑客!但基于摄像头的检测可能会导致更多型号的ipad出现问题。不过现在我还是会用这个黑客。谢谢;)@oberthelot:这是可以想象的,但iPad的未来版本似乎不太可能排除摄像头。因此,除非OP想要排除以后的模型,否则这将很好地工作。我想这个变量可以重命名为
isIPad2OrLater
,以使它更清晰,并且在将来更可能保持为真。很好!iPad1上没有摄像头:-d在“新iPad”和“iPad mini”上都有摄像头,所以这个答案现在完全错了。正如在另一个问题中所指出的,这通常是错误的问题。效果很好!比任何其他解决方案都好。谢谢你,朋友!iPad2没有视网膜显示器。此外,我认为显示器分辨率不是检测设备的正确方法。
@"iPad 2 (WiFi)"
@"iPad 2 (GSM)"
@"iPad 2 (CDMA)"