得到设备是何种iPhone设备 + 怎么获得启动页面图片

一、前言

  今天做一个功能,需要动态的获得启动页,然后根据不同设备去使用不用的启动页图片。

二、正文  

  常规来说,我们直接判断是何种设备,然后通过name去获得图片选择性加载即可。但是实际上遇到的两个问题。

  第一:如何判断各种设备。

  第二:怎么去拿到启动页图片。

  先看第一个问题,怎么去判断各种设备。原来习惯性的是直接判断设备高度。闲着没事就通过

[UIScreen mainScreen].bounds.size.height

  这个方法去获得各种设备的高度,如下:

//iPhone4s 480
//iPhone 5 568
//iPhone 5s 568
//iPhone 6 667
//iPhone 6p 736
//iPhone 6s 667
//iPhone 6sp 736

 

  因此做了一个判断方法一:

- (NSString *)getCurrentDeviceVersion {
    CGFloat screenHeight = [UIScreen mainScreen].bounds.size.height;
    if (screenHeight==480) {
        //        return nil;
        return @"iPhone4/iPhone4s";
    }else if (screenHeight==568) {
        return @"iPhone5/iPhone5s/iPhone5c";
    }else if (screenHeight==667) {
        return  @"iPhone6/iPhone6s";
    }else if (screenHeight==736) {
        return @"iPhone6 plus/iPhone6s plus";
    }else {
        return @"another";
    }

}

 

  其实这是一个很low的方法,只是根据高度去判断,不过这样也可以去判断。

  下面来看看方法二:

  首先,我们需要在使用的类里面导入:

#import <sys/utsname.h> 
- (NSString *)getDeviceVersion {
    struct utsname systemInfo;
    uname(&systemInfo);
    NSString *deviceName = [NSString stringWithCString:systemInfo.machine encoding:NSUTF8StringEncoding];
    if ([deviceName isEqualToString:@"iPhone3,1"] || [deviceName isEqualToString:@"iPhone3,3"]|| [deviceName isEqualToString:@"iPhone4,1"]) { //判断是否是iPhone4,iPhone4s
        return @"iPhone4/iPhone4s";
    }else if ([deviceName isEqualToString:@"iPhone5,1"]|| [deviceName isEqualToString:@"iPhone5,2"]||[deviceName isEqualToString:@"iPhone5,3"] || [deviceName isEqualToString:@"iPhone5,4"] || [deviceName isEqualToString:@"iPhone6,1"] || [deviceName isEqualToString:@"iPhone6,2"]) {
        return @"iPhone5/iPhone5s/iPhone5c";
    }else if ([deviceName isEqualToString:@"iPhone7,1"] || [deviceName isEqualToString:@"iPhone8,2"]) {
        return @"iPhone6 plus/iPhone6s plus";
    }else if ([deviceName isEqualToString:@"iPhone7,2"] || [deviceName isEqualToString:@"iPhone8,1"]) {
        return @"iPhone6/iPhone6s";
    }else {   //真机上边不会走到
        return @"another";
    }
}

 

  方法二主要用到了一个类utsname.h。打开之后,我们可以发现他就是一个结构体:

struct    utsname {
    char    sysname[_SYS_NAMELEN];    /* [XSI] Name of OS */
    char    nodename[_SYS_NAMELEN];    /* [XSI] Name of this network node */
    char    release[_SYS_NAMELEN];    /* [XSI] Release level */
    char    version[_SYS_NAMELEN];    /* [XSI] Version level */
    char    machine[_SYS_NAMELEN];    /* [XSI] Hardware type */
};

先来看看怎么去取到

 struct utsname systemInfo;
    uname(&systemInfo);
    NSString *deviceName = [NSString stringWithCString:systemInfo.machine encoding:NSUTF8StringEncoding];

 

  当输出deviceName的时候,你就会发现不同的设备将会输出不同的内容,但是当我们使用模拟器的时候,会输出:

x86_64

  其实这个是在64-bit Simulator下输出的。如果我们使用的是32-bit Simulator,那么输出的结果就是

i386

  然后我使用iPhone5s进行测试,输出结果是:

iPhone6,2

  当时比较疑惑,这是什么情况呢?然后就google了一下。原来这个是设备的类型。而且不同的设备类型也不一样。然后就在这里发现了下面的内容:(其实这个结果就是设备类型)

  

//模拟器

@"i386"      on 32-bit Simulator
@"x86_64"    on 64-bit Simulator

//iPod--可能不全面

@"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
@"iPod5,1"   on iPod Touch 5th Generation
@"iPod7,1"   on iPod Touch 6th Generation

//iPhone  --全面了

@"iPhone1,1" on iPhone
@"iPhone1,2" on iPhone 3G
@"iPhone2,1" on iPhone 3GS
@"iPhone3,1" on iPhone 4 (GSM)
@"iPhone3,2" on iPhone 4
@"iPhone3,3" on iPhone 4 (CDMA/Verizon/Sprint)
@"iPhone4,1" on iPhone 4S
@"iPhone5,1" on iPhone 5 (model A1428, AT&T/Canada)
@"iPhone5,2" on iPhone 5 (model A1429, everything else)
@"iPhone5,3" on iPhone 5c (model A1456, A1532 | GSM)
@"iPhone5,4" on iPhone 5c (model A1507, A1516, A1526 (China), A1529 | Global)
@"iPhone6,1" on iPhone 5s (model A1433, A1533 | GSM)
@"iPhone6,2" on iPhone 5s (model A1457, A1518, A1528 (China), A1530 | Global)
@"iPhone7,1" on iPhone 6 Plus
@"iPhone7,2" on iPhone 6
@"iPhone8,1" on iPhone 6S
@"iPhone8,2" on iPhone 6S Plus

//iPad  --不全面

@"iPad1,1"   on iPad
@"iPad2,1"   on iPad 2
@"iPad3,1"   on 3rd Generation iPad
@"iPad3,4" on 4th Generation iPad
@"iPad2,5" on iPad Mini
@"iPad4,1" on 5th Generation iPad (iPad Air) - Wifi
@"iPad4,2" on 5th Generation iPad (iPad Air) - Cellular
@"iPad4,4" on 2nd Generation iPad Mini - Wifi
@"iPad4,5" on 2nd Generation iPad Mini - Cellular
@"iPad4,7" on 3rd Generation iPad Mini - Wifi (model A1599)

 

  这里几乎包括了所有的iOS移动设备。

然后就根据这个去判断了一下

- (NSString *)getDeviceModel {
    struct utsname systemInfo;
    uname(&systemInfo);
    NSString *deviceName = [NSString stringWithCString:systemInfo.machine encoding:NSUTF8StringEncoding];
    if ([deviceName isEqualToString:@"iPhone3,1"] || [deviceName isEqualToString:@"iPhone3,3"]|| [deviceName isEqualToString:@"iPhone4,1"]) { //判断是否是iPhone4,iPhone4s
        return @"iPhone4/iPhone4s";
    }else if ([deviceName isEqualToString:@"iPhone5,1"]|| [deviceName isEqualToString:@"iPhone5,2"]||[deviceName isEqualToString:@"iPhone5,3"] || [deviceName isEqualToString:@"iPhone5,4"] || [deviceName isEqualToString:@"iPhone6,1"] || [deviceName isEqualToString:@"iPhone6,2"]) {
        return @"iPhone5/iPhone5s/iPhone5c";
    }else if ([deviceName isEqualToString:@"iPhone7,1"] || [deviceName isEqualToString:@"iPhone8,2"]) {
        return @"iPhone6 plus/iPhone6s plus";
    }else if ([deviceName isEqualToString:@"iPhone7,2"] || [deviceName isEqualToString:@"iPhone8,1"]) {
        return @"iPhone6/iPhone6s";
    }else {   //真机上边不会走到
        return @"another";
    }
}

 

  这样就得到了不同版本的设备。有兴趣的话还可以点这里(可能需要越狱)

  这样,第一个问题就结局了。第二个问题是如何获得当前project的启动页面。(不要妄想去通过名字拿,试了,拿不到。)

  后来google了一下:得到如下

//iPhone4/4s:[UIImage imageNamed: @"LaunchImage-700"];
//
//iPhone5/5s/5c: [UIImage imageNamed: @"LaunchImage-700-568h"];
//
//iPhone6: [UIImage imageNamed: @"LaunchImage-800-667h"];
//
//iPhone6 plus 竖屏:[UIImage imageNamed: @"LaunchImage-800-Portrait-736h"];
//
//iPhone6 plus 横屏:[UIImage imageNamed: @"LaunchImage-800-Portrait-736h"];

 

  意思就是当你是iPhone4/4s的时候,就通过

[UIImage imageNamed: @"LaunchImage-700"];

  来拿到启动页面。其他的一样。

  这样就拿到了启动页面。

  综合起来解决前言问题的方法就是:

//方法一
- (UIImage *)getLaunchImage {
    CGFloat screenHeight = [UIScreen mainScreen].bounds.size.height;
    if (screenHeight==480) {
//        return nil;
        return [UIImage imageNamed: @"LaunchImage-700"];
    }else if (screenHeight==568) {
        return [UIImage imageNamed: @"LaunchImage-700-568h"];
    }else if (screenHeight==667) {
        return  [UIImage imageNamed: @"LaunchImage-800-667h"];
    }else if (screenHeight==736) {
        return [UIImage imageNamed: @"LaunchImage-800-Portrait-736h"];
    }else {
        return [UIImage imageNamed:@"placeH"];
    }
}

/**
 *  通过系统信息得到版本
 *方法二
 *  @return 指定的LaunchImage
 */
- (UIImage *)getLaunchImageByiPhoneType {
    struct utsname systemInfo;
    uname(&systemInfo);
    NSString *deviceName = [NSString stringWithCString:systemInfo.machine encoding:NSUTF8StringEncoding];
    if ([deviceName isEqualToString:@"iPhone3,1"] || [deviceName isEqualToString:@"3,2"] ||[deviceName isEqualToString:@"iPhone3,3"]|| [deviceName isEqualToString:@"iPhone4,1"]) { //判断是否是iPhone4,iPhone4s
        return [UIImage imageNamed:@"LaunchImage-700"];
    }else if ([deviceName isEqualToString:@"iPhone5,1"]|| [deviceName isEqualToString:@"iPhone5,2"]||[deviceName isEqualToString:@"iPhone5,3"] || [deviceName isEqualToString:@"iPhone5,4"] || [deviceName isEqualToString:@"iPhone6,1"] || [deviceName isEqualToString:@"iPhone6,2"]) {
        return [UIImage imageNamed: @"LaunchImage-700-568h"];
    }else if ([deviceName isEqualToString:@"iPhone7,1"] || [deviceName isEqualToString:@"iPhone8,2"]) {
        return [UIImage imageNamed: @"LaunchImage-800-Portrait-736h"];
    }else if ([deviceName isEqualToString:@"iPhone7,2"] || [deviceName isEqualToString:@"iPhone8,1"]) {
        return [UIImage imageNamed: @"LaunchImage-800-667h"];
    }else {   //真机上边不会走到
        return [UIImage imageNamed:@"placeH"];  //这里我用了一张默认图片
    }
}

 

  

三、结语

  如果大家有什么疑问或者我说的不对的地方尽管提出来。  

时间: 2025-01-20 17:15:06

得到设备是何种iPhone设备 + 怎么获得启动页面图片的相关文章

《响应式Web设计实践》一1.2 设备来了,设备来了

1.2 设备来了,设备来了 响应式Web设计实践 我是一名近乎疯狂的旅行者,我不害怕坐飞机,但我担心误机.于是我会常常发现自己坐在拥挤的候机厅里总想找点什么事做,以便用来打发时间. 于是我开始观察身边的人们,更多的时候我会去观察他们使用的是什么样的设备.在最近的一次旅途中,我飞到了一个非常小.非常偏远的机场,小到你只需要五分钟就能办完所有的登机手续.虽然候机厅里只有大概二十五个人,但是Android手机.iPhone以及一些老款的手机都能在那里见到.有人在用Nook读着什么,而我旁边一位头发花白

《unix设备驱动》块设备驱动程序(加示例代码)

块设备驱动程序 一个块设备驱动程序主要通过传输固定大小的随机数据来访问设备. 块驱动程序是在核心内存和其他存储介质之间的管道,因此他们可以认为是虚拟内存子系统的组成部分.   一些概念 一个数据块指的是固定大小的数据,而大小的值有内核决定  与数据块对应的是扇区,它是由底层硬件决定大小的一个块.  无论何时内核向用户提供一个扇区编号,该扇区的大小就是512字节. 注册 注册的目的:使内核知道设备的存在 注册块设备驱动程序 注册到内核 int register_blkdev(unsigned in

设备不可用或设备未连接:无线上网的常见问题

问:我现在用无线上网卡联网,可是在联网一段时间后老自动断网,再点击连接就显示"设备不可用或设备未连接"只能把它拔下来然后再按上就好了,很是苦恼啊! 答: 也不知道有线连接是否稳定,所以先从路由开始 1.先检查线路质量,包括电话线和电源线,看有否接触不良的现象!电线质量也要尽量选择质量好些的. 2.电压是否稳定,附近是否有平繁启动.负荷比较大.辐射比较强的用电设备. 3.电源适配器质量和电压是否符合要求,有条件换个看看. 4.断线是否发生容易发生在接听电话的时候就可判断电话分配器质量和接

USB设备无法停止通用卷设备怎么办

  USB设备无法停止通用卷设备解决方法: 方法一:释放清空掉剪切板 造成"无法停止通用卷设备",一般都是有原因的,比如上面介绍原因是最常见的,解决办法可以释放清空掉剪切板,您可以随便复制一下硬盘里的任何东西,以释放掉U盘中的复制操作.之后你会发现可以正常删除USB驱动设备了. 方法二:使用任务管理器结束进程 如果觉得上面那种方法还无效的话,可以使用下面这个方法,同时按下键盘的"Ctrl"+"Alt"+"Del"组合键,进入任

USB设备无法停止通用卷设备怎么办?

  USB设备无法停止通用卷设备怎么办? 方法一:释放清空掉剪切板 造成"无法停止通用卷设备",一般都是有原因的,比如上面介绍原因是最常见的,解决办法可以释放清空掉剪切板,您可以随便复制一下硬盘里的任何东西,以释放掉U盘中的复制操作.之后你会发现可以正常删除USB驱动设备了. 方法二:使用任务管理器结束进程 如果觉得上面那种方法还无效的话,可以使用下面这个方法,同时按下键盘的"Ctrl"+"Alt"+"Del"组合键,进入任务

linux驱动开发--字符设备:自动创建设备节点

自动创建设备文件 定义在<linux/device.h>中 class结构:该结构体类型变量对应一个设备类,被创建的类存放在/sys目录下面 device结构:该结构体类型变量对应设备,被创建的设备存放于/sys目录下面 在加载驱动模块时,用户空间中的udev会自动响应device_create()函数,在/sys下寻找对应的类,从而为这个设备在/dev目录下创建设备文件 内核版本问题: 在内核2.4版本中使用devfs_register 在内核2.6早起版本中使用class_device_r

linux驱动开发--字符设备:静态分配设备号

字符设备(char device)         采用字节流方式访问的设备称为字符设备,通常智能采用顺序访问方式,也有极少数可以前后移动访问指针的设备(如:帧捕捉卡等设备).系统标准字符设备,例如:字符中断.串口等设备.常见待开发设备驱动的字符设备,例如:触摸屏.键盘.视频捕捉设备.音频设备等. 设备号 主设备号     用于标识设备类型,内核代码根据该号码对应设备文件和对应的设备驱动程序 次设备号     用于标识通类型的不同设备个体,驱动程序根据该号码辨别具体操作的是哪个设备个体. 设备号

linux驱动-linux字符设备驱动求助:设备号无法释放

问题描述 linux字符设备驱动求助:设备号无法释放 我在驱动中,资源释放时调用了unregister_chrdev_region函数,为什么用rmmod卸载驱动模块之后,/proc/devices里边仍能够显示我的驱动设备啊? lsmod中已经没有我写的驱动模块了. 是因为设备号没能正确释放么? 解决方案 当应用程序打开设备节点时,内核调用相应驱动程序的open()函数.可以在shell中执行以下代码来触发cmos_open()的执行: bash> cat /dev/cmos/0 当应用程序关

【AIX 命令学习】lsattr 显示一个给定设备或一种设备的属性

  在配置了系统中所有设备之后,你可以使用 lsattr 命令显示一个给定设备或一种设备的属性信息.如果你不指定设备的逻辑名字(-l Name),则你必需使用-c Class,-s Subclass,及 -t Type 标记中的一个或全部的组合来唯一标识预定义的设备.lsattr 命令常用语法如下: lsattr {-D [ -O ] | -E [ -O ] | -F Format } -l Name [ -a Attribute ]... [ -f File ] [ -h ] [ -H ] l