得到裝置是何種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"]; //這裡我用了一張預設圖片 }}
三、結語
如果大家有什麼疑問或者我說的不對的地方儘管提出來。