IOS 获取手机设备信息

回顾一下,Android中获取手机设备相关信息:通过android.os.Build、context.getResources().getDisplayMetrics()、Settings.Secure.getString(context.getContentResolver(), Settings.Secure.ANDROID_ID)、(TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE)等等,从而获取到手机设备:手机型号、手机品牌、设备名、手机系统、屏幕宽高等等一系列信息,其中还涉及到权限问题。

相对IOS,则是从开发库中获取设备相关信息:通过UIDevice、NSLocale、UIScreen、CTTelephonyNetworkInfo等等,从而获取到手机设备:设备名称、系统名称、系统版本、屏幕宽高等等一系列信息,但需要通过指定的开发库才能获取得到。

此处需要导入部分开发库:

1#import <sys/utsname.h> 2#import <CoreTelephony/CTCarrier.h> 3#import <CoreTelephony/CTTelephonyNetworkInfo.h> 4#import <SystemConfiguration/CaptiveNetwork.h> 5#import <NetworkExtension/NetworkExtension.h>

DeviceInfo.h

1#import <UIKit/UIKit.h> 2#import <sys/utsname.h> 3#import <CoreTelephony/CTCarrier.h> 4#import <CoreTelephony/CTTelephonyNetworkInfo.h> 5#import <SystemConfiguration/CaptiveNetwork.h> 6#import <NetworkExtension/NetworkExtension.h> 7@class DeviceInfo; 8 9#define DUMMY_MAC_ADDR @"02:00:00:00:00:00" 10 11/** 12 * 设备相关信息 13 **/ 14@interface DeviceInfo : NSObject 15 16/** 17 * 设备名称 18 **/ 19@property (nonatomic, strong) NSString *deviceName; 20 21/** 22 * 系统名称 23 **/ 24@property (nonatomic, strong) NSString *systemName; 25 26/** 27 * 系统版本 28 **/ 29@property (nonatomic, strong) NSString *systemVersion; 30 31/** 32 * 设备模式 33 **/ 34@property (nonatomic, strong) NSString *model; 35 36/** 37 * 本地设备模式 38 **/ 39@property (nonatomic, strong) NSString *localizedModel; 40 41/** 42 * 系统语言 43 **/ 44@property (nonatomic, strong) NSString *language; 45 46/** 47 * 国家 48 **/ 49@property (nonatomic, strong) NSString *country; 50 51/** 52 * IDFV 53 **/ 54@property (nonatomic, strong) NSString *deviceIDFV; 55 56/** 57 * 屏幕宽度 58 **/ 59@property (nonatomic) int width; 60 61/** 62 * 屏幕高度 63 **/ 64@property (nonatomic) int height; 65 66/** 67 * 屏幕宽度分辨率 68 **/ 69@property (nonatomic) int screenWidth; 70 71/** 72 * 屏幕高度分辨率 73 **/ 74@property (nonatomic) int screenHeight; 75 76/** 77 * 运营商 78 **/ 79@property (nonatomic, strong) NSString *carrierName; 80 81/** 82 * mac 83 **/ 84@property (nonatomic, strong) NSString *mac; 85 86@end

DeviceInfo.m

1#import <Foundation/Foundation.h> 2#import "DeviceInfo.h" 3 4@implementation DeviceInfo 5 6- (NSString *)deviceName{ 7 NSString *dName = [[UIDevice currentDevice] name]; 8 if (dName) { 9 return dName; 10 } 11 return @""; 12} 13 14- (NSString *)systemName{ 15 NSString *sName = [[UIDevice currentDevice] systemName]; 16 if (sName) { 17 return sName; 18 } 19 return @""; 20} 21 22- (NSString *)systemVersion{ 23 NSString *sVersion = [[UIDevice currentDevice] systemVersion]; 24 if (sVersion) { 25 return sVersion; 26 } 27 return @""; 28} 29 30- (NSString *)model{ 31// NSString *mod = [[UIDevice currentDevice] model]; 32// if (mod) { 33// return mod; 34// } 35 36 struct utsname systemInfo; 37 uname(&systemInfo); 38 39 NSString *deviceModel = [NSString stringWithCString:systemInfo.machine encoding:NSASCIIStringEncoding]; 40 41 if (!deviceModel) { 42 return @""; 43 } 44 45 if ([deviceModel isEqualToString:@"iPhone3,1"]) return @"iPhone 4"; 46 if ([deviceModel isEqualToString:@"iPhone3,2"]) return @"iPhone 4"; 47 if ([deviceModel isEqualToString:@"iPhone3,3"]) return @"iPhone 4"; 48 if ([deviceModel isEqualToString:@"iPhone4,1"]) return @"iPhone 4S"; 49 if ([deviceModel isEqualToString:@"iPhone5,1"]) return @"iPhone 5"; 50 if ([deviceModel isEqualToString:@"iPhone5,2"]) return @"iPhone 5 (GSM+CDMA)"; 51 if ([deviceModel isEqualToString:@"iPhone5,3"]) return @"iPhone 5c (GSM)"; 52 if ([deviceModel isEqualToString:@"iPhone5,4"]) return @"iPhone 5c (GSM+CDMA)"; 53 if ([deviceModel isEqualToString:@"iPhone6,1"]) return @"iPhone 5s (GSM)"; 54 if ([deviceModel isEqualToString:@"iPhone6,2"]) return @"iPhone 5s (GSM+CDMA)"; 55 if ([deviceModel isEqualToString:@"iPhone7,1"]) return @"iPhone 6 Plus"; 56 if ([deviceModel isEqualToString:@"iPhone7,2"]) return @"iPhone 6"; 57 if ([deviceModel isEqualToString:@"iPhone8,1"]) return @"iPhone 6s"; 58 if ([deviceModel isEqualToString:@"iPhone8,2"]) return @"iPhone 6s Plus"; 59 if ([deviceModel isEqualToString:@"iPhone8,4"]) return @"iPhone SE"; 60 // 日行两款手机型号均为日本独占,可能使用索尼FeliCa支付方案而不是苹果支付 61 if ([deviceModel isEqualToString:@"iPhone9,1"]) return @"iPhone 7"; 62 if ([deviceModel isEqualToString:@"iPhone9,2"]) return @"iPhone 7 Plus"; 63 if ([deviceModel isEqualToString:@"iPhone9,3"]) return @"iPhone 7"; 64 if ([deviceModel isEqualToString:@"iPhone9,4"]) return @"iPhone 7 Plus"; 65 if ([deviceModel isEqualToString:@"iPhone10,1"]) return @"iPhone_8"; 66 if ([deviceModel isEqualToString:@"iPhone10,4"]) return @"iPhone_8"; 67 if ([deviceModel isEqualToString:@"iPhone10,2"]) return @"iPhone_8_Plus"; 68 if ([deviceModel isEqualToString:@"iPhone10,5"]) return @"iPhone_8_Plus"; 69 if ([deviceModel isEqualToString:@"iPhone10,3"]) return @"iPhone X"; 70 if ([deviceModel isEqualToString:@"iPhone10,6"]) return @"iPhone X"; 71 if ([deviceModel isEqualToString:@"iPhone11,8"]) return @"iPhone XR"; 72 if ([deviceModel isEqualToString:@"iPhone11,2"]) return @"iPhone XS"; 73 if ([deviceModel isEqualToString:@"iPhone11,6"]) return @"iPhone XS Max"; 74 if ([deviceModel isEqualToString:@"iPhone11,4"]) return @"iPhone XS Max"; 75 if ([deviceModel isEqualToString:@"iPhone12,1"]) return @"iPhone 11"; 76 if ([deviceModel isEqualToString:@"iPhone12,3"]) return @"iPhone 11 Pro"; 77 if ([deviceModel isEqualToString:@"iPhone12,5"]) return @"iPhone 11 Pro Max"; 78 if ([deviceModel isEqualToString:@"iPhone12,8"]) return @"iPhone SE2"; 79 80 if ([deviceModel isEqualToString:@"iPod1,1"]) return @"iPod Touch 1G"; 81 if ([deviceModel isEqualToString:@"iPod2,1"]) return @"iPod Touch 2G"; 82 if ([deviceModel isEqualToString:@"iPod3,1"]) return @"iPod Touch 3G"; 83 if ([deviceModel isEqualToString:@"iPod4,1"]) return @"iPod Touch 4G"; 84 if ([deviceModel isEqualToString:@"iPod5,1"]) return @"iPod Touch (5 Gen)"; 85 if ([deviceModel isEqualToString:@"iPod7,1"]) return @"iPod Touch (6 Gen)"; 86 if ([deviceModel isEqualToString:@"iPod9,1"]) return @"iPod Touch (7 Gen)"; 87 if ([deviceModel isEqualToString:@"iPad1,1"]) return @"iPad"; 88 if ([deviceModel isEqualToString:@"iPad1,2"]) return @"iPad 3G"; 89 if ([deviceModel isEqualToString:@"iPad2,1"]) return @"iPad 2 (WiFi)"; 90 if ([deviceModel isEqualToString:@"iPad2,2"]) return @"iPad 2"; 91 if ([deviceModel isEqualToString:@"iPad2,3"]) return @"iPad 2 (CDMA)"; 92 if ([deviceModel isEqualToString:@"iPad2,4"]) return @"iPad 2"; 93 if ([deviceModel isEqualToString:@"iPad2,5"]) return @"iPad Mini (WiFi)"; 94 if ([deviceModel isEqualToString:@"iPad2,6"]) return @"iPad Mini"; 95 if ([deviceModel isEqualToString:@"iPad2,7"]) return @"iPad Mini (GSM+CDMA)"; 96 if ([deviceModel isEqualToString:@"iPad3,1"]) return @"iPad 3 (WiFi)"; 97 if ([deviceModel isEqualToString:@"iPad3,2"]) return @"iPad 3 (GSM+CDMA)"; 98 if ([deviceModel isEqualToString:@"iPad3,3"]) return @"iPad 3"; 99 if ([deviceModel isEqualToString:@"iPad3,4"]) return @"iPad 4 (WiFi)"; 100 if ([deviceModel isEqualToString:@"iPad3,5"]) return @"iPad 4"; 101 if ([deviceModel isEqualToString:@"iPad3,6"]) return @"iPad 4 (GSM+CDMA)"; 102 if ([deviceModel isEqualToString:@"iPad4,1"]) return @"iPad Air (WiFi)"; 103 if ([deviceModel isEqualToString:@"iPad4,2"]) return @"iPad Air (Cellular)"; 104 if ([deviceModel isEqualToString:@"iPad4,4"]) return @"iPad Mini 2 (WiFi)"; 105 if ([deviceModel isEqualToString:@"iPad4,5"]) return @"iPad Mini 2 (Cellular)"; 106 if ([deviceModel isEqualToString:@"iPad4,6"]) return @"iPad Mini 2"; 107 if ([deviceModel isEqualToString:@"iPad4,7"]) return @"iPad Mini 3"; 108 if ([deviceModel isEqualToString:@"iPad4,8"]) return @"iPad Mini 3"; 109 if ([deviceModel isEqualToString:@"iPad4,9"]) return @"iPad Mini 3"; 110 if ([deviceModel isEqualToString:@"iPad5,1"]) return @"iPad Mini 4 (WiFi)"; 111 if ([deviceModel isEqualToString:@"iPad5,2"]) return @"iPad Mini 4 (LTE)"; 112 if ([deviceModel isEqualToString:@"iPad5,3"]) return @"iPad Air 2"; 113 if ([deviceModel isEqualToString:@"iPad5,4"]) return @"iPad Air 2"; 114 if ([deviceModel isEqualToString:@"iPad6,3"]) return @"iPad Pro 9.7"; 115 if ([deviceModel isEqualToString:@"iPad6,4"]) return @"iPad Pro 9.7"; 116 if ([deviceModel isEqualToString:@"iPad6,7"]) return @"iPad Pro 12.9"; 117 if ([deviceModel isEqualToString:@"iPad6,8"]) return @"iPad Pro 12.9"; 118 if ([deviceModel isEqualToString:@"iPad6,11"]) return @"iPad (5 Gen)"; 119 if ([deviceModel isEqualToString:@"iPad6,12"]) return @"iPad (5 Gen)"; 120 if ([deviceModel isEqualToString:@"iPad7,5"]) return @"iPad (6 Gen)"; 121 if ([deviceModel isEqualToString:@"iPad7,6"]) return @"iPad (6 Gen)"; 122 if ([deviceModel isEqualToString:@"iPad7,11"]) return @"iPad (7 Gen)"; 123 if ([deviceModel isEqualToString:@"iPad7,12"]) return @"iPad (7 Gen)"; 124 if ([deviceModel isEqualToString:@"iPad7,1"]) return @"iPad Pro 12.9 (2 Gen)"; 125 if ([deviceModel isEqualToString:@"iPad7,2"]) return @"iPad Pro 12.9 (2 Gen)"; 126 if ([deviceModel isEqualToString:@"iPad7,3"]) return @"iPad Pro 10.5"; 127 if ([deviceModel isEqualToString:@"iPad7,4"]) return @"iPad Pro 10.5"; 128 if ([deviceModel isEqualToString:@"iPad8,1"]) return @"iPad Pro 11"; 129 if ([deviceModel isEqualToString:@"iPad8,2"]) return @"iPad Pro 11"; 130 if ([deviceModel isEqualToString:@"iPad8,3"]) return @"iPad Pro 11"; 131 if ([deviceModel isEqualToString:@"iPad8,4"]) return @"iPad Pro 11"; 132 if ([deviceModel isEqualToString:@"iPad8.5"]) return @"iPad Pro 12.9 (3 Gen)"; 133 if ([deviceModel isEqualToString:@"iPad8.6"]) return @"iPad Pro 12.9 (3 Gen)"; 134 if ([deviceModel isEqualToString:@"iPad8.7"]) return @"iPad Pro 12.9 (3 Gen)"; 135 if ([deviceModel isEqualToString:@"iPad8.8"]) return @"iPad Pro 12.9 (3 Gen)"; 136 if ([deviceModel isEqualToString:@"iPad8.9"]) return @"iPad Pro 11 (2 Gen)"; 137 if ([deviceModel isEqualToString:@"iPad8.10"]) return @"iPad Pro 11 (2 Gen)"; 138 if ([deviceModel isEqualToString:@"iPad8.11"]) return @"iPad Pro 12.9 (4 Gen)"; 139 if ([deviceModel isEqualToString:@"iPad8.12"]) return @"iPad Pro 12.9 (4 Gen)"; 140 if ([deviceModel isEqualToString:@"iPad11,1"]) return @"iPad Mini (5 Gen)"; 141 if ([deviceModel isEqualToString:@"iPad11,2"]) return @"iPad Mini (5 Gen)"; 142 if ([deviceModel isEqualToString:@"iPad11,3"]) return @"iPad Air (3 Gen)"; 143 if ([deviceModel isEqualToString:@"iPad11,4"]) return @"iPad Air (3 Gen)"; 144 if ([deviceModel isEqualToString:@"iPad11,6"]) return @"iPad (8 Gen)"; 145 if ([deviceModel isEqualToString:@"iPad11,7"]) return @"iPad (8 Gen)"; 146 if ([deviceModel isEqualToString:@"iPad13,1"]) return @"iPad Air (4 Gen)"; 147 if ([deviceModel isEqualToString:@"iPad13,2"]) return @"iPad Air (4 Gen)"; 148 149 if ([deviceModel isEqualToString:@"Watch1,1"]) return @"Apple Watch 1"; 150 if ([deviceModel isEqualToString:@"Watch1,2"]) return @"Apple Watch 1"; 151 if ([deviceModel isEqualToString:@"Watch2,3"]) return @"Apple Watch Series 2"; 152 if ([deviceModel isEqualToString:@"Watch2,4"]) return @"Apple Watch Series 2"; 153 if ([deviceModel isEqualToString:@"Watch2,6"]) return @"Apple Watch Series 1"; 154 if ([deviceModel isEqualToString:@"Watch2,7"]) return @"Apple Watch Series 1"; 155 if ([deviceModel isEqualToString:@"Watch3,1"]) return @"Apple Watch Series 3"; 156 if ([deviceModel isEqualToString:@"Watch3,2"]) return @"Apple Watch Series 3"; 157 if ([deviceModel isEqualToString:@"Watch3,3"]) return @"Apple Watch Series 3"; 158 if ([deviceModel isEqualToString:@"Watch3,4"]) return @"Apple Watch Series 3"; 159 if ([deviceModel isEqualToString:@"Watch4,1"]) return @"Apple Watch Series 4"; 160 if ([deviceModel isEqualToString:@"Watch4,2"]) return @"Apple Watch Series 4"; 161 if ([deviceModel isEqualToString:@"Watch4,3"]) return @"Apple Watch Series 4"; 162 if ([deviceModel isEqualToString:@"Watch4,4"]) return @"Apple Watch Series 4"; 163 if ([deviceModel isEqualToString:@"Watch5,1"]) return @"Apple Watch Series 5"; 164 if ([deviceModel isEqualToString:@"Watch5,2"]) return @"Apple Watch Series 5"; 165 if ([deviceModel isEqualToString:@"Watch5,3"]) return @"Apple Watch Series 5"; 166 if ([deviceModel isEqualToString:@"Watch5,4"]) return @"Apple Watch Series 5"; 167 if ([deviceModel isEqualToString:@"Watch5,9"]) return @"Apple Watch SE"; 168 if ([deviceModel isEqualToString:@"Watch5,10"]) return @"Apple Watch SE"; 169 if ([deviceModel isEqualToString:@"Watch5,11"]) return @"Apple Watch SE"; 170 if ([deviceModel isEqualToString:@"Watch5,12"]) return @"Apple Watch SE"; 171 if ([deviceModel isEqualToString:@"Watch6,1"]) return @"Apple Watch Series 6"; 172 if ([deviceModel isEqualToString:@"Watch6,2"]) return @"Apple Watch Series 6"; 173 if ([deviceModel isEqualToString:@"Watch6,3"]) return @"Apple Watch Series 6"; 174 if ([deviceModel isEqualToString:@"Watch6,4"]) return @"Apple Watch Series 6"; 175 176 if ([deviceModel isEqualToString:@"AppleTV1,1"]) return @"Apple TV 1"; 177 if ([deviceModel isEqualToString:@"AppleTV2,1"]) return @"Apple TV 2"; 178 if ([deviceModel isEqualToString:@"AppleTV3,1"]) return @"Apple TV 3"; 179 if ([deviceModel isEqualToString:@"AppleTV3,2"]) return @"Apple TV 3"; 180 if ([deviceModel isEqualToString:@"AppleTV5,3"]) return @"Apple TV 4"; 181 if ([deviceModel isEqualToString:@"AppleTV6,2"]) return @"Apple TV 4K"; 182 183 if ([deviceModel isEqualToString:@"AirPods1,1"]) return @"AirPods 1"; 184 if ([deviceModel isEqualToString:@"AirPods2,1"]) return @"AirPods 2"; 185 if ([deviceModel isEqualToString:@"iProd8,1"]) return @"AirPods Pro"; 186 187 if ([deviceModel isEqualToString:@"AudioAccessory1,1"]) return @"HomePod"; 188 if ([deviceModel isEqualToString:@"AudioAccessory1,2"]) return @"HomePod"; 189 190 if ([deviceModel isEqualToString:@"i386"]) return @"Simulator"; 191 if ([deviceModel isEqualToString:@"x86_64"]) return @"Simulator"; 192 return deviceModel; 193} 194 195- (NSString *)localizedModel{ 196 NSString *localModel = [[UIDevice currentDevice] localizedModel]; 197 if (localModel) { 198 return localModel; 199 } 200 return @""; 201} 202 203- (NSString *)language{ 204 NSArray *languageArray = [NSLocale preferredLanguages]; 205 NSString *language = [languageArray objectAtIndex:0]; 206 if (language) { 207 return language; 208 } 209 return @""; 210} 211 212- (NSString *)country{ 213 NSLocale *locale = [NSLocale currentLocale]; 214 NSString *country = [locale localeIdentifier]; 215 if (country) { 216 return country; 217 } 218 return @""; 219} 220 221- (NSString *)deviceIDFV{ 222 NSUUID *idfvUUID = [[UIDevice currentDevice] identifierForVendor]; 223 if (idfvUUID) { 224 NSString *idfv = [idfvUUID UUIDString]; 225 if (idfv) { 226 return idfv; 227 } 228 } 229 return @""; 230} 231 232- (int)width{ 233 CGRect rect = [[UIScreen mainScreen] bounds]; 234 CGSize size = rect.size; 235 CGFloat width = size.width; 236 int widthInt = [[NSNumber numberWithFloat:width] intValue]; 237 if (widthInt) { 238 return widthInt; 239 } 240 return 0; 241} 242 243- (int)height{ 244 CGRect rect = [[UIScreen mainScreen] bounds]; 245 CGSize size = rect.size; 246 CGFloat height = size.height; 247 int heightInt = [[NSNumber numberWithFloat:height] intValue]; 248 if (heightInt) { 249 return heightInt; 250 } 251 return 0; 252} 253 254- (int)screenWidth{ 255 CGRect rect = [[UIScreen mainScreen] bounds]; 256 CGSize size = rect.size; 257 CGFloat scale_screen = [UIScreen mainScreen].scale; 258 int screenWidthInt = [[NSNumber numberWithFloat:size.width * scale_screen] intValue]; 259 if (screenWidthInt) { 260 return screenWidthInt; 261 } 262 return 0; 263} 264 265- (int)screenHeight{ 266 CGRect rect = [[UIScreen mainScreen] bounds]; 267 CGSize size = rect.size; 268 CGFloat scale_screen = [UIScreen mainScreen].scale; 269 int screenHeightInt = [[NSNumber numberWithFloat:size.height * scale_screen] intValue]; 270 if (screenHeightInt) { 271 return screenHeightInt; 272 } 273 return 0; 274} 275 276- (NSString *)carrierName{ 277 CTTelephonyNetworkInfo *info = [[CTTelephonyNetworkInfo alloc] init]; 278 CTCarrier *carrier = info.subscriberCellularProvider; 279 if(carrier.carrierName) { 280 return carrier.carrierName; 281 } 282 return @""; 283} 284 285- (NSString *)mac{ 286 NSArray*wfMac=CFBridgingRelease(CNCopySupportedInterfaces()); 287 id info1 = nil; 288 for (NSString *macName in wfMac) { 289 info1 = (__bridge_transfer id)CNCopyCurrentNetworkInfo((CFStringRef) macName); 290 if (info1 && [info1 count]) { 291 break; 292 } 293 } 294 NSDictionary *dic = (NSDictionary *)info1; 295 NSString *wifiMac = [dic objectForKey:@"BSSID"]; 296 if(wifiMac) { 297 return wifiMac; 298 } 299 return DUMMY_MAC_ADDR; 300} 301 302@end

注:获取设备model中systemInfo.machine设备信息获取是相对较为完善且全面的,若后续有新的设备新增,请从 Models - The iPhone Wiki 上进行续补;Apple对于获取MAC相对严格控制,一般是获取不到的。

点赞
收藏

评论区

加载中...

相关推荐

MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1

文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s

Oracle 分组与拼接字符串同时使用

SELECTT.,ROWNUMIDFROM(SELECTT.EMPLID,T.NAME,T.BU,T.REALDEPART,T.FORMATDATE,SUM(T.S0)S0,MAX(UPDATETIME)CREATETIME,LISTAGG(TOCHAR(

MySQL部分从库上面因为大量的临时表tmp_table造成慢查询

背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_

皕杰报表之UUID

​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为

手写Java HashMap源码

HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22

2020年前端实用代码段,为你的工作保驾护航

有空的时候,自己总结了几个代码段,在开发中也经常使用,谢谢。1、使用解构获取json数据let jsonData  id: 1,status: "OK",data: 'a', 'b';let  id, status, data: number   jsonData;console.log(id, status, number )

IOS 获取手机设备信息 - HelloWorld