關于判斷手機型號及相關內容

在實際的開發過程中,如何適配不同的機型,是一個比較困難的點,尤其是安卓開發,市面上的手機型號太多,屏幕尺寸更是錯綜復雜,所以,蘋果設備的統一性讓我們iOS開發者感恩不已。除了有比較簡單的通過獲取屏幕尺寸做適配,有的情況下還需要根據手機屏幕大小,包括手機機型,iOS系統版本等不同的情況作適配,因此,本片重點描寫關于如何獲取上述的幾種特性。

1.獲取設備的相關信息

OC版:

NSString *deviceName = [[UIDevice currentDevice] name];  //獲取設備名稱 例如:梓辰的手機
NSString *sysVersion = [[UIDevice currentDevice] systemName]; //獲取系統名稱 例如:iPhone OS
NSString *sysVersion = [[UIDevice currentDevice] systemVersion]; //獲取系統版本 例如:9.2
NSString *deviceUUID = [[[UIDevice currentDevice] identifierForVendor] UUIDString]; //獲取設備唯一標識符 例如:FBF2306E-A0D8-4F4B-BDED-9333B627D3E6
NSString *deviceModel = [[UIDevice currentDevice] model]; //獲取設備的型號 例如:iPhone

Swift版:

let deviceName = UIDevice.currentDevice().name  //獲取設備名稱 例如:梓辰的手機
let sysName = UIDevice.currentDevice().systemName //獲取系統名稱 例如:iPhone OS
let sysVersion = UIDevice.currentDevice().systemVersion //獲取系統版本 例如:9.2
let deviceUUID = UIDevice.currentDevice().identifierForVendor?.UUIDString  //獲取設備唯一標識符 例如:FBF2306E-A0D8-4F4B-BDED-9333B627D3E6
let deviceModel = UIDevice.currentDevice().model //獲取設備的型號 例如:iPhone

2.獲取App相關信息

OC版:

 NSDictionary *infoDic = [[NSBundle mainBundle] infoDictionary];
 NSString *appVersion = [infoDicobjectForKey:@"CFBundleShortVersionString"]; // 獲取App的版本
 NSString *appBuildVersion = [infoDic objectForKey:@"CFBundleVersion"]; // 獲取App的build版本
 NSString *appName = [infoDic objectForKey:@"CFBundleDisplayName"]; // 獲取App的名稱

Swift版:

 let infoDic = NSBundle.mainBundle().infoDictionary
 let appVersion = infoDic?["CFBundleShortVersionString"] // 獲取App的版本
 let appBuildVersion = infoDic?["CFBundleVersion"] // 獲取App的build版本
 let appName = infoDic?["CFBundleDisplayName"] // 獲取App的名稱

3.獲取iOS設備的具體型號

OC版:

 //需要#import <sys/utsname.h>
+ (NSString*)deviceModelName
{
  struct utsname systemInfo;
  uname(&systemInfo);
  NSString *deviceModel = [NSString stringWithCString:systemInfo.machine encoding:NSUTF8StringEncoding];

  //iPhone 系列
  if ([deviceModel isEqualToString:@"iPhone1,1"])    return @"iPhone 1G";
  if ([deviceModel isEqualToString:@"iPhone1,2"])    return @"iPhone 3G";
  if ([deviceModel isEqualToString:@"iPhone2,1"])    return @"iPhone 3GS";
  if ([deviceModel isEqualToString:@"iPhone3,1"])    return @"iPhone 4";
  if ([deviceModel isEqualToString:@"iPhone3,2"])    return @"Verizon iPhone 4";
  if ([deviceModel isEqualToString:@"iPhone4,1"])    return @"iPhone 4S";
  if ([deviceModel isEqualToString:@"iPhone5,1"])    return @"iPhone 5";
  if ([deviceModel isEqualToString:@"iPhone5,2"])    return @"iPhone 5";
  if ([deviceModel isEqualToString:@"iPhone5,3"])    return @"iPhone 5C";
  if ([deviceModel isEqualToString:@"iPhone5,4"])    return @"iPhone 5C";
  if ([deviceModel isEqualToString:@"iPhone6,1"])    return @"iPhone 5S";
  if ([deviceModel isEqualToString:@"iPhone6,2"])    return @"iPhone 5S";
  if ([deviceModel isEqualToString:@"iPhone7,1"])    return @"iPhone 6 Plus";
  if ([deviceModel isEqualToString:@"iPhone7,2"])    return @"iPhone 6";
  if ([deviceModel isEqualToString:@"iPhone8,1"])    return @"iPhone 6s";
  if ([deviceModel isEqualToString:@"iPhone8,2"])    return @"iPhone 6s Plus";

  //iPod 系列
  if ([deviceModel isEqualToString:@"iPod1,1"])      return @"iPod Touch 1G";
  if ([deviceModel isEqualToString:@"iPod2,1"])      return @"iPod Touch 2G";
  if ([deviceModel isEqualToString:@"iPod3,1"])      return @"iPod Touch 3G";
  if ([deviceModel isEqualToString:@"iPod4,1"])      return @"iPod Touch 4G";
  if ([deviceModel isEqualToString:@"iPod5,1"])      return @"iPod Touch 5G";

  //iPad 系列
  if ([deviceModel isEqualToString:@"iPad1,1"])      return @"iPad";
  if ([deviceModel isEqualToString:@"iPad2,1"])      return @"iPad 2 (WiFi)";
  if ([deviceModel isEqualToString:@"iPad2,2"])      return @"iPad 2 (GSM)";
  if ([deviceModel isEqualToString:@"iPad2,3"])      return @"iPad 2 (CDMA)";
  if ([deviceModel isEqualToString:@"iPad2,4"])      return @"iPad 2 (32nm)";
  if ([deviceModel isEqualToString:@"iPad2,5"])      return @"iPad mini (WiFi)";
  if ([deviceModel isEqualToString:@"iPad2,6"])      return @"iPad mini (GSM)";
  if ([deviceModel isEqualToString:@"iPad2,7"])      return @"iPad mini (CDMA)";

  if ([deviceModel isEqualToString:@"iPad3,1"])      return @"iPad 3(WiFi)";
  if ([deviceModel isEqualToString:@"iPad3,2"])      return @"iPad 3(CDMA)";
  if ([deviceModel isEqualToString:@"iPad3,3"])      return @"iPad 3(4G)";
  if ([deviceModel isEqualToString:@"iPad3,4"])      return @"iPad 4 (WiFi)";
  if ([deviceModel isEqualToString:@"iPad3,5"])      return @"iPad 4 (4G)";
  if ([deviceModel isEqualToString:@"iPad3,6"])      return @"iPad 4 (CDMA)";

  if ([deviceModel isEqualToString:@"iPad4,1"])      return @"iPad Air";
  if ([deviceModel isEqualToString:@"iPad4,2"])      return @"iPad Air";
  if ([deviceModel isEqualToString:@"iPad4,3"])      return @"iPad Air";
  if ([deviceModel isEqualToString:@"iPad5,3"])      return @"iPad Air 2";
  if ([deviceModel isEqualToString:@"iPad5,4"])      return @"iPad Air 2";
  if ([deviceModel isEqualToString:@"i386"])         return @"Simulator";
  if ([deviceModel isEqualToString:@"x86_64"])       return @"Simulator";

  if ([deviceModel isEqualToString:@"iPad4,4"]
          ||[deviceModel isEqualToString:@"iPad4,5"]
          ||[deviceModel isEqualToString:@"iPad4,6"])      return @"iPad mini 2";

  if ([deviceModel isEqualToString:@"iPad4,7"]
          ||[deviceModel isEqualToString:@"iPad4,8"]
          ||[deviceModel isEqualToString:@"iPad4,9"])      return @"iPad mini 3";

  return deviceModel;
 }

Swift版:

//MARK: - UIDevice延展
public extension UIDevice {

var modelName: String {
var systemInfo = utsname()
uname(&systemInfo)
let machineMirror = Mirror(reflecting: systemInfo.machine)
let identifier = machineMirror.children.reduce("") { identifier, element in
    guard let value = element.value as? Int8 where value != 0 else { return identifier }
    return identifier + String(UnicodeScalar(UInt8(value)))
}

switch identifier {
case "iPod5,1":                                 return "iPod Touch 5"
case "iPod7,1":                                 return "iPod Touch 6"
case "iPhone3,1", "iPhone3,2", "iPhone3,3":     return "iPhone 4"
case "iPhone4,1":                               return "iPhone 4s"
case "iPhone5,1", "iPhone5,2":                  return "iPhone 5"
case "iPhone5,3", "iPhone5,4":                  return "iPhone 5c"
case "iPhone6,1", "iPhone6,2":                  return "iPhone 5s"
case "iPhone7,2":                               return "iPhone 6"
case "iPhone7,1":                               return "iPhone 6 Plus"
case "iPhone8,1":                               return "iPhone 6s"
case "iPhone8,2":                               return "iPhone 6s Plus"
case "iPhone9,1":                               return "iPhone 6"
case "iPhone9,2":                               return "iPhone 6 Plus"
case "iPad2,1", "iPad2,2", "iPad2,3", "iPad2,4":return "iPad 2"
case "iPad3,1", "iPad3,2", "iPad3,3":           return "iPad 3"
case "iPad3,4", "iPad3,5", "iPad3,6":           return "iPad 4"
case "iPad4,1", "iPad4,2", "iPad4,3":           return "iPad Air"
case "iPad5,3", "iPad5,4":                      return "iPad Air 2"
case "iPad2,5", "iPad2,6", "iPad2,7":           return "iPad Mini"
case "iPad4,4", "iPad4,5", "iPad4,6":           return "iPad Mini 2"
case "iPad4,7", "iPad4,8", "iPad4,9":           return "iPad Mini 3"
case "iPad5,1", "iPad5,2":                      return "iPad Mini 4"
case "iPad6,7", "iPad6,8":                      return "iPad Pro"
case "AppleTV5,3":                              return "Apple TV"
case "i386", "x86_64":                          return "Simulator"
default:                                        return identifier
       }
   }
}

注:關于獲取iOS設備的具體型號,只有真機測試才能夠得出結果,如果是在模擬器上運行,打印結果只會是“ Simulator”。

4.關于獲取屏幕尺寸

這個之前沒有做過,但是有兩個想法,一個是通過獲取iOS設備型號,然后根據具體型號,判斷設備的尺寸;或者也可以直接根據屏幕寬度或者高度,判斷設備尺寸,以后如果遇到,再把代碼補全。

5.判斷手機型號,用于檢測API的可用性

if #available(iOS 10, macOS 10.12, *) {
  // 在 iOS 使用 iOS 10 的 API, 在 macOS 使用 macOS 10.12 的 API
} else {
  // 使用先前版本的 iOS 和 macOS 的 API
}

最近看了一個項目,大神適配的方法很不錯的,把代碼寫過來,方便以后查看:

///基于iPhone6垂直方向上的適配
/// - Parameter size: iPhone6垂直方向尺寸
/// - Returns: 其他型號尺寸
func layoutVertical(iPhone6:CGFloat)->CGFloat{
    var newHeight:CGFloat = 0
    switch iPhoneModel.getCurrentModel() {
    case .iPhone5:
        newHeight = iPhone6*(568.0/667.0)
    case .iPhone6:
        newHeight = iPhone6
    case .iPhone6p:
        newHeight = iPhone6*(736.0/667.0)
    default:
        newHeight = iPhone6*(1024.0/667.0*0.9)
    }
    return newHeight
}

///基于iPhone6水平方向上的適配
/// - Parameter size: iPhone6水平方向尺寸
/// - Returns: 其他型號尺寸
func layoutHorizontal(iPhone6:CGFloat)->CGFloat{
    var newWidth:CGFloat = 0
    switch iPhoneModel.getCurrentModel() {
    case .iPhone5:
        newWidth = iPhone6*(320.0/375.0)
    case .iPhone6:
        newWidth = iPhone6
    case .iPhone6p:
        newWidth = iPhone6*(414.0/375.0)
    default:
        newWidth = iPhone6*(768.0/375.0*0.9)
    }
    return newWidth
}

///基于iPhone6字體的屏幕適配
/// - Parameter size: iPhone6字體大小
/// - Returns: 其他型號字體
func layoutFont(iPhone6:CGFloat)->CGFloat{
    var newFont:CGFloat = 0
    switch iPhoneModel.getCurrentModel() {
    case .iPhone5:
        newFont = iPhone6 * (320.0 / 375.0)
    case .iPhone6:
        newFont = iPhone6
    case .iPhone6p:
        newFont = iPhone6 * (414.0 / 375.0)
    default:
        newFont = iPhone6*1.2
    }
    return newFont
}

///手機類型枚舉
enum iPhoneModel{
    
    case iPhone4
    case iPhone5
    case iPhone6
    case iPhone6p
    case iPad
    
    ///獲取當前手機型號
    ///return - 當前手機類型
    static func getCurrentModel()->iPhoneModel{
        switch Sheight {
        case 480:
            return .iPhone4
        case 568:
            return .iPhone5
        case 667:
            return .iPhone6
        case 736:
            return .iPhone6p
        default:
            return .iPad
        }
    }
}

圖片發自簡書App
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 229,885評論 6 541
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 99,312評論 3 429
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 177,993評論 0 383
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,667評論 1 317
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 72,410評論 6 411
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,778評論 1 328
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,775評論 3 446
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,955評論 0 289
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 49,521評論 1 335
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 41,266評論 3 358
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,468評論 1 374
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,998評論 5 363
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,696評論 3 348
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 35,095評論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,385評論 1 294
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 52,193評論 3 398
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 48,431評論 2 378

推薦閱讀更多精彩內容

  • 昨天聽了萌薇老師手帳課的第二節《形象頁和打卡頁的制作》,聽完后仿佛有新鮮血液輸送到了身體里。想到了一句話,“讀萬卷...
    吳小鯉兒閱讀 1,495評論 10 21
  • 早上6點半被突然的視頻通話聲給吵醒,我知道是我姐,昨天晚上跟我約定好要視頻,可是感覺好早,結果網也不好,我...
    會偷懶的魚閱讀 177評論 0 0
  • 2016-11-20 作者:阿濤 人的一生有多長?樂觀點算,100歲,也就是1200個月。減去我們現在的年齡,大概...
    AA阮濤閱讀 544評論 0 1