由于我没有 iPad 2,我需要知道调用 [[UIDevice currentDevice] model] 时它返回什么。我以为它只返回“iPad”,但似乎我错了。
有人可以告诉我吗?
谢谢
由于我没有 iPad 2,我需要知道调用 [[UIDevice currentDevice] model] 时它返回什么。我以为它只返回“iPad”,但似乎我错了。
有人可以告诉我吗?
谢谢
检查带摄像头的 iPad。
BOOL isIPad2 = (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad &&
[UIImagePickerController isSourceTypeAvailable: UIImagePickerControllerSourceTypeCamera]);
请注意,检测特定特征通常比基于模型/版本检测做出全面假设要好。例如,如果您需要相机,则明确测试相机;如果您需要根据可用 RAM 量调整 UI 质量,请测试物理 RAM;等等。还要注意我写的一条评论,它强调了使用模型检测的危险。
切勿将该model
属性用于任何其他用途,除非将其显示为信息目的或诊断输出。它不能保证被保存,如果你依赖它,你会在新设备出现时不必要地切断它们。
很多 iPhone 应用程序无法在 iPad 的兼容模式下使用,因为他们检查了model
属性,如果不是 iPhone / iPod,他们什么也没做。
要获得精确的模型字符串,例如“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
UIScreen+Retina.h #import
@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
用法
#import "UIScreen+Retina.h"
//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;
}
}
我认为你可以测试它的规模
if ([[UIScreen mainScreen] respondsToSelector:@selector(scale)]) {
if ([[[UIScreen mainScreen] scale] == 2.0) {
// retina display
}
}
如果您使用的是 OpenGL,则可以查看 GPU 模型。iPad 1 有一个 PowerVR SGX 535,而 iPad 2 有一个 PowerVR SGX 543。
const char * deviceStr = (const char *)glGetString(GL_RENDERER);
if (!strcmp(deviceStr, "PowerVR SGX 535")) {
// iPad 1
}
else {
// iPad 2 or later
}
此行将打印设备版本:
Ipad 1:平台:iPad1,1
Ipad 2:平台:iPad2,1
Ipad 3:平台:iPad3,3
iPhone 4S:平台: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);
UIDevice 类参考应该会有所帮助。有关更具体的解决方案,请尝试这个 SO question。
至于你的第二个问题,测试分辨率的最佳方法是获得一个类似于 iPad3,1 的 PPI 数量的显示器。不幸的是,您可能无法做到。测试任何应用程序的最佳方法是在实际设备上。
首先我应该提到,我花了很多时间来弄清楚为什么 ipad 模拟器“说”它是 iphone。对我来说,事实证明我只需要将它切换到通用:
这是我认为是相当典型的检测代码的代码。还有其他可能也可以工作,但是...
// 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 返回型号或您想要的 iOS 设备型号: 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
第三方类。你可以在这里找到它:
https://github.com/fahrulazmi/UIDeviceHardware
您只需调用:
NSString *platformString = [UIDeviceHardware platformString];
它将返回设备。在您的情况下,您希望与以下platformString
任何一项相匹配:
@"iPad 2 (WiFi)"
@"iPad 2 (GSM)"
@"iPad 2 (CDMA)"