一、前言

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

二、正文  

  常规来说,我们直接判断是何种设备,然后通过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==) {
// return nil;
return @"iPhone4/iPhone4s";
}else if (screenHeight==) {
return @"iPhone5/iPhone5s/iPhone5c";
}else if (screenHeight==) {
return @"iPhone6/iPhone6s";
}else if (screenHeight==) {
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,

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

  

//模拟器

@"i386"      on -bit Simulator
@"x86_64" on -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 (GSM)
@"iPhone3,2" on iPhone
@"iPhone3,3" on iPhone (CDMA/Verizon/Sprint)
@"iPhone4,1" on iPhone 4S
@"iPhone5,1" on iPhone (model A1428, AT&T/Canada)
@"iPhone5,2" on iPhone (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 Plus
@"iPhone7,2" on iPhone
@"iPhone8,1" on iPhone 6S
@"iPhone8,2" on iPhone 6S Plus //iPad --不全面 @"iPad1,1" on iPad
@"iPad2,1" on iPad
@"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==) {
// return nil;
return [UIImage imageNamed: @"LaunchImage-700"];
}else if (screenHeight==) {
return [UIImage imageNamed: @"LaunchImage-700-568h"];
}else if (screenHeight==) {
return [UIImage imageNamed: @"LaunchImage-800-667h"];
}else if (screenHeight==) {
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"]; //这里我用了一张默认图片
}
}

  

三、结语

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

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

  1. 关于iPhone设备不同显示尺寸适配的一些方法

    关于iPhone设备不同显示尺寸适配的一些方法   ------关于适配的理解------ 1.什么是适配? 适配是对不同硬件和系统软件的适应,硬件包括屏幕显示,处理器,内存等等(目前主要是屏幕适配, ...

  2. ios5和ios6横竖屏支持及ipad和iphone设备的判断

    ios5和ios6横竖屏支持及ipad和iphone设备的判断 判断是ipad还是iphone设备.此定义在PayViewControllerDemo-Prefix.pch 定义如下: #define ...

  3. ios7 以后准确获取iphone设备的MAC(物理地址)

    通过参考 钉钉 项目,知道是通过wifi拿到路由的MAC地址.那么可不可以拿到iphone 设备的MAC 地址呢? 经过一番搜索,发现所有文章都是针对 ios 7 以前 可以拿到. 而且方法也都是同一 ...

  4. iPhone设备及屏幕适配

    // // Common.h // 微信 // // #ifndef Common_h #define Common_h // iPhone设备及屏幕适配 //4的设备 #define KDevice ...

  5. windows核心编程---第九章 同步设备IO与异步设备IO之同步IO

    同步设备IO 所谓同步IO是指线程在发起IO请求后会被挂起,IO完成后继续执行. 异步IO是指:线程发起IO请求后并不会挂起而是继续执行.IO完毕后会得到设备的通知.而IO完成端口就是实现这种通知的很 ...

  6. 使用device.js检测设备并实现不同设备展示不同网页

    现在很多时候会用@media来控制页面在不同分辨率的设备商展示不同效果,但是有些时候想在直接在PC上展示一个做好的页面,在mobile展示另一个页面.这个时候可以借助device.js来检测设备,然后 ...

  7. 《Windows核心编程系列》九谈谈同步设备IO与异步设备IO之同步设备IO

    同步设备IO 所谓同步IO是指线程在发起IO请求后会被挂起,IO完成后继续执行. 异步IO是指:线程发起IO请求后并不会挂起而是继续执行.IO完毕后会得到设备的通知.而IO完成端口就是实现这种通知的很 ...

  8. adb devices 不识别设备(或者偶尔识别设备) -破解

    问题:当在CMD中输入adb devices时,没有设备信息显示,居然显示下面的信息 问题是有时候可以识别,有时候不可以识别.当被别人连接后,自己在连接是好的,过了一会以后又不好了

  9. CSS布局基础之一设备像素,设备独立像素,设备像素比,css像素之间的关系

    设备像素dp(device pixels) ppi(pixels per inch)表示每英寸所拥有的像素(pixel)数目,数值越高,代表屏幕能以更高的密度显示图像. 计算公式:ppi=像素数量/物 ...

随机推荐

  1. Dbvisualizer9.0.6 解决中文乱码

    一.设置编辑器的编码 Tools->Tools Properties ->General->File Encoding 设置为UTF-8 二.如果数据库为UTF-8,则要在连接时做以 ...

  2. MyBatis知多少(3)

    解决存储过程固有限制的方法之一就是将SQL嵌入到更加通用的语言中去.与存储过程将业务逻辑移入数据库相反,内联SQL将SQL从数据库移入了应用程序代码.这就使得SQL语句可以直接与语言进行交互.从某种意 ...

  3. PE渲染引擎 一

    PE是我业余时间做的一个纯dx11的渲染框架.主要就是练手.如果有时间,会把它“扩展”成真正的引擎(标配至少要有个对应的编辑器吧 -_!!). 目前实现的有: obj文件加载,binormal计算. ...

  4. 栈的图文解析 和 对应3种语言的实现(C/C++/Java)

    概要 本章会先对栈的原理进行介绍,然后分别通过C/C++/Java三种语言来演示栈的实现示例.注意:本文所说的栈是数据结构中的栈,而不是内存模型中栈.内容包括:1. 栈的介绍2. 栈的C实现3. 栈的 ...

  5. Fiddler进行手机抓包

    测试设备:Windows8.1,Android 4.0.4山寨Android手机 网络环境:电信校园网,Wifi环境 测试工具:Fiddler4 完全参考了:http://www.jb51.net/s ...

  6. ExtJs创建环境搭建

    开发工具Eclipse/MyEclipse. 工具下载:http://pan.baidu.com/s/1sjmiFMH(提供spket和sdk.jsb3,   extjs-4.1.1需自己下载) 1. ...

  7. 让 ASP.NET JS验证和服务端的 双验证 更简单

    只用JavaScript验证安全不安全谁都知道,答案是不安全,非常的不安全.因为在客户端进行的验证相当于“让用户自己验证自己”,很明显是不靠谱的.你不能避免一些恶意用户人为的修改自己的表单进行欺骗,也 ...

  8. css优先级和层叠

    css优先级和层叠 1.优先级    计算方法:        a.行内样式        b.id选择器的数量        c.类,伪类和属性选择器的数量        d.标签选择器和伪元素选择 ...

  9. Week4 结对编程

    1.照片 1.1  结对编程参与者:李文涛.黎柏文 1.2  展示照片 2.结对编程的优点&缺点 2.1 优点 2.1.1.两人分工合作,减少了工作量 2.1.2.结对编程的伙伴往往能提供不同 ...

  10. 2015 Multi-University Training Contest 1 - 10010 Y sequence

    Y sequence Problem's Link: http://acm.hdu.edu.cn/showproblem.php?pid=5297 Mean: 有连续数列A={1,2,3,4,5,6, ...