是否有方法确定正在运行应用程序的设备。如果可能的话,我想区分iPhone和iPod Touch。
当前回答
要识别iPhone 4S,只需检查以下内容:
var isIphone4S: Bool {
let width = UIScreen.main.bounds.size.width
let height = UIScreen.main.bounds.size.height
let proportions = width > height ? width / height : height / width
return proportions == 1.5 && UIDevice.current.model == "iPhone"
}
其他回答
更有用
#include <sys/types.h>
#include <sys/sysctl.h>
@interface UIDevice(Hardware)
- (NSString *) platform;
- (BOOL)hasRetinaDisplay;
- (BOOL)hasMultitasking;
- (BOOL)hasCamera;
@end
@implementation UIDevice(Hardware)
- (NSString *) platform{
int mib[2];
size_t len;
char *machine;
mib[0] = CTL_HW;
mib[1] = HW_MACHINE;
sysctl(mib, 2, NULL, &len, NULL, 0);
machine = malloc(len);
sysctl(mib, 2, machine, &len, NULL, 0);
NSString *platform = [NSString stringWithCString:machine encoding:NSASCIIStringEncoding];
free(machine);
return platform;
}
- (BOOL)hasRetinaDisplay {
NSString *platform = [self platform];
BOOL ret = YES;
if ([platform isEqualToString:@"iPhone1,1"]) {
ret = NO;
}
else
if ([platform isEqualToString:@"iPhone1,2"]) ret = NO;
else
if ([platform isEqualToString:@"iPhone2,1"]) ret = NO;
else
if ([platform isEqualToString:@"iPod1,1"]) ret = NO;
else
if ([platform isEqualToString:@"iPod2,1"]) ret = NO;
else
if ([platform isEqualToString:@"iPod3,1"]) ret = NO;
return ret;
}
- (BOOL)hasMultitasking {
if ([self respondsToSelector:@selector(isMultitaskingSupported)]) {
return [self isMultitaskingSupported];
}
return NO;
}
- (BOOL)hasCamera {
BOOL ret = NO;
// check camera availability
return ret;
}
@end
您可以读取属性
NSLog(@"platform %@, retita %@, multitasking %@", [[UIDevice currentDevice] platform], [[UIDevice currentDevice] hasRetinaDisplay] ? @"YES" : @"NO" , [[UIDevice currentDevice] hasMultitasking] ? @"YES" : @"NO");
下面提到的代码片段应该有帮助:
if ([[UIDevice currentDevice] userInterfaceIdiom] == UIUserInterfaceIdiomPhone) {
// iPhone device
}
else if ([[UIDevice currentDevice] userInterfaceIdiom] == UIUserInterfaceIdiomPad) {
// iPad device
}
else {
// Other device i.e. iPod
}
这个代码怎么样,如果新版本发布,你将标识与最后知道的设备
- (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 @"iPhone3GS"; //iPhone 4 - AT&T
if ([sDeviceModel isEqual:@"iPhone3,2"]) return @"iPhone3GS"; //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:@"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;
}
if([UIDevice currentDevice].userInterfaceIdiom==UIUserInterfaceIdiomPad) {
//Device is ipad
}else{
//Device is iphone
}
我进一步将大的“isEqualToString”块转换为设备类型、生成和逗号后的其他限定符(我称之为子生成)的位掩码分类。它被包装在一个类中,带有一个单例调用SGPlatform,避免了大量重复的字符串操作。代码可用https://github.com/danloughney/spookyGroup
这个类允许你做这样的事情:
if ([SGPlatform iPad] && [SGPlatform generation] > 3) {
// set for high performance
}
and
switch ([SGPlatform deviceMask]) {
case DEVICE_IPHONE:
break;
case DEVICE_IPAD:
break;
case DEVICE_IPAD_MINI:
break;
}
设备的分类在platformBits方法中。这个方法对于本文的读者来说应该非常熟悉。我根据设备的类型和年代对其进行了分类,因为我最感兴趣的是整体性能,但源代码可以调整以提供您感兴趣的任何分类,如视网膜屏幕、网络功能等。
推荐文章
- Xcode构建失败“架构x86_64未定义的符号”
- 如何使用Xcode创建。ipa文件?
- 动态改变UILabel的字体大小
- registerForRemoteNotificationTypes: iOS 8.0及以上版本不支持
- Xcode 4 -在新的Macintosh安装上的配置文件上“没有找到有效的签名标识”错误
- 新的自动引用计数机制是如何工作的?
- 如何测试对象在Objective-C中的类?
- 在iPhone上确定用户是否启用了推送通知
- 是否有可能禁用浮动头在UITableView与UITableViewStylePlain?
- 从Cocoa应用程序执行一个终端命令
- 错误ITMS-9000:“冗余二进制文件上传。火车1.0版本已经有一个二进制版本上传。
- Swift -转换为绝对值
- Swift编译器错误:“框架模块内的非模块化头”
- 从父iOS访问容器视图控制器
- 自定义dealloc和ARC (Objective-C)