iOS开发-获取设备信息和应用信息

iOS开发-获取设备信息和应用信息_第1张图片

目录

  1. UIDevice
    1. 设备相关信息
    2. 设备电量
    3. 近距离传感器
    4. 设备性能、界面模式
  2. NSBundle
    1. 获取应用名称
    2. 应用短版本号
    3. 应用Build版本号
    4. 应用identifier
  3. NSLocale
    1. 创建本地化对象
    2. 获取系统本地化信息
    3. 获取本地标识信息和语言码信息
    4. 获取当前语言的排版方向和字符方向
    5. 获取用户的语言偏好设置列表
    6. 监听用户本地化设置的消息
    7. 以本地化方式获取国际化信息的显示名称

UIDevice

UIDevice提供了多种属性、类函数及状态通知,帮助我们全方位了解设备状况。从检测电池电量到定位设备与临近感应,UIDevice所做的工作就是为应用程序提供用户及设备的一些信息UIDevice的属性如下:

  • 设备相关信息
// 手机中关于本机中设置的名称  @"My iPhone" 
@property(nonatomic,readonly,strong) NSString    *name;     
// 设备模式  @"iPhone", @"iPod touch",@"iPad"      
@property(nonatomic,readonly,strong) NSString    *model;
// 本地设备模式,返回值与model相同,暂不清楚两者区别
@property(nonatomic,readonly,strong) NSString    *localizedModel;
// 系统名字  @"iOS"
@property(nonatomic,readonly,strong) NSString    *systemName;
// 系统版本号  @"10.2.1"
@property(nonatomic,readonly,strong) NSString    *systemVersion;
// 获取设备唯一标识,同一个开发商的APP获取到的标识是相同的
// 与UDID不同的是,在我们删除了设备上,同一个开发商的所有APP之后,下次获取到的将是不同的标识
@property(nullable, nonatomic,readonly,strong) NSUUID      *identifierForVendor NS_AVAILABLE_IOS(6_0);
// 设备方向. UIDeviceOrientation是一个枚举
typedef NS_ENUM(NSInteger, UIDeviceOrientation) {
    UIDeviceOrientationUnknown,             // 未知
    UIDeviceOrientationPortrait,            // 竖屏,home键在下方
    UIDeviceOrientationPortraitUpsideDown,  // 竖屏,home键在上方
    UIDeviceOrientationLandscapeLeft,       // 横屏,home键在右方
    UIDeviceOrientationLandscapeRight,      // 横屏,home键在左方
    UIDeviceOrientationFaceUp,              // 平放,屏幕朝上
    UIDeviceOrientationFaceDown             // 平放,屏幕朝下
} __TVOS_PROHIBITED;
@property(nonatomic,readonly) UIDeviceOrientation orientation __TVOS_PROHIBITED;

获取设备方向

UIDevice *device = [UIDevice currentDevice];
// 判断设备是否生成设备转向通知
BOOL generatesDeviceOrientationNotifications = device.isGeneratingDeviceOrientationNotifications;
// 开启设备转向通知
// 通过调用该方法通知设备:如果用户改变了设备的朝向,我们想获悉这一点
// 在注册设备方向通知时,需要先调用该方法
[device beginGeneratingDeviceOrientationNotifications];
// 注册屏幕方向变化通知
[[NSNotificationCenter defaultCenter] addObserver:self 
                                             selector:@selector(deviceOrientationDidChanged:) 
                                                 name:@"UIDeviceOrientationDidChangeNotification"
                                               object:nil];
// 获取设备方向
UIDeviceOrientation orientation = [UIDevice currentDevice].orientation;
// 停止设备转向通知
// 在移除设备方向通知后,需要调用该方法
[device endGeneratingDeviceOrientationNotifications];

获取设备硬件类型,有三种方法,如下:
1)这种是在较高层次获取设备类型,返回的是 iPhone , iPod , iPad 。适合要求不高的。

NSString *deviceType = [[UIDevice currentDevice] model];

2)这是Linux中获取设备类型的方法,主要是C语言的方法,注意引入头文件#include 。输入底层获取设备类型的方法。

size_t size;
// 获取machine name的长度
sysctlbyname("hw.machine", NULL, &size, NULL, 0);
// 获取machine name
char *machine = malloc(size);
sysctlbyname("hw.machine", machine, &size, NULL, 0);
// 设备硬件类型
NSString *platform = [NSString stringWithFormat:@"%s", machine];
free(machine);

3)这和2)一样,是Linux中获取设备类型的方法,主要是C语言的方法,注意引入头文件#import "sys/utsname.h"。输入底层获取设备类型的方法。

struct utsname systemInfo;
uname(&systemInfo);
// 设备硬件类型
NSString *platform = [NSString stringWithFormat:@"%s", systemInfo.machine];

以上2),3)方法中返回的platform(设备硬件类型)的对应关系

// Simulator
@"i386"       :  @"Simulator"
@"x86_64"     :  @"Simulator"

// iPhone
@"iPhone1,1"  :  @"iPhone 1"
@"iPhone1,2"  :  @"iPhone 3"
@"iPhone2,1"  :  @"iPhone 3S"
@"iPhone3,1" || @"iPhone3,2" || @"iPhone3,3": @"iPhone 4"
@"iPhone4,1"  :  @"iPhone 4S"
@"iPhone5,1"  :  @"iPhone 5"
@"iPhone5,2"  :  @"iPhone 5"       // iPhone 5 (GSM+CDMA)
@"iPhone5,3"  :  @"iPhone 5C"      // iPhone 5c (GSM)
@"iPhone5,4"  :  @"iPhone 5C"      // iPhone 5c (GSM+CDMA)
@"iPhone6,1"  :  @"iPhone 5S"      // iPhone 5s (GSM)
@"iPhone6,2"  :  @"iPhone 5S"      // iPhone 5s (GSM+CDMA)
@"iPhone7,1"  :  @"iPhone 6 Plus"
@"iPhone7,2"  :  @"iPhone 6"
@"iPhone8,1"  :  @"iPhone 6s"
@"iPhone8,2"  :  @"iPhone 6s Plus"
@"iPhone8,3" || @"iPhone8,4"  :  @"iPhone SE"
@"iPhone9,1"  :  @"iPhone 7"       // 国行、日版、港行iPhone 7
@"iPhone9,3"  :  @"iPhone 7"       // 美版、台版iPhone 7
@"iPhone9,2"  :  @"iPhone 7 Plus"  // 港行、国行iPhone 7 Plus
@"iPhone9,4"  :  @"iPhone 7 Plus"  // 美版、台版iPhone 7 Plus
@"iPhone10,1" :  @"iPhone 8"       // 国行(A1863)、日行(A1906)iPhone 8
@"iPhone10,4" :  @"iPhone 8"       // 美版(Global/A1905)iPhone 8
@"iPhone10,2" :  @"iPhone 8 Plus"  // 国行(A1864)、日行(A1898)iPhone 8 Plus
@"iPhone10,5" :  @"iPhone 8 Plus"  // 美版(Global/A1897)iPhone 8 Plus
@"iPhone10,3" :  @"iPhone X"       // 国行(A1865)、日行(A1902)iPhone X
@"iPhone10,6" :  @"iPhone X"       // 美版(Global/A1901)iPhone X  
@"iPhone11,2" :  @"iPhone XS" 
@"iPhone11,4" :  @"iPhone XS Max"  // 国行iPhone XS Max
@"iPhone11,6" :  @"iPhone XS Max"  // 美版iPhone XS Max
@"iPhone11,8" :  @"iPhone XR"  

// iPod Touch
@"iPod1,1"    :  @"iPod Touch 1G"
@"iPod2,1"    :  @"iPod Touch 2G"
@"iPod3,1"    :  @"iPod Touch 3G"
@"iPod4,1"    :  @"iPod Touch 4G"
@"iPod5,1"    :  @"iPod Touch (5 Gen)"
@"iPod7,1"    :  @"iPod Touch 6"

// iPad
@"iPad1,1"    :  @"iPad 1"
@"iPad1,2"    :  @"iPad 3G"
@"iPad2,1"    :  @"iPad 2"        // iPad 2 (WiFi)
@"iPad2,2"   || @"iPad2,4" : @"iPad 2"
@"iPad2,3"    :  @"iPad 2"        // iPad 2 (CDMA)
@"iPad2,5"    :  @"iPad Mini 1"   // iPad Mini (WiFi)
@"iPad2,6"    :  @"iPad Mini 1"
@"iPad2,7"    :  @"iPad Mini 1"   // iPad Mini (GSM+CDMA)
@"iPad3,1"    :  @"iPad 3"        // iPad 3 (WiFi)
@"iPad3,2"    :  @"iPad 3"        // iPad 3 (GSM+CDMA)
@"iPad3,3"    :  @"iPad 3"
@"iPad3,4"    :  @"iPad 4"        // iPad 4 (WiFi)
@"iPad3,5"    :  @"iPad 4"
@"iPad3,6"    :  @"iPad 4"        // iPad 4 (GSM+CDMA)
@"iPad4,1"    :  @"iPad air"      // iPad Air (WiFi)
@"iPad4,2"    :  @"iPad air"      // iPad Air (Cellular)
@"iPad4,3"    :  @"iPad air"
@"iPad4,4"    :  @"iPad mini 2"   // iPad Mini 2 (WiFi)
@"iPad4,5"    :  @"iPad mini 2"   // iPad Mini 2 (Cellular)
@"iPad4,6"    :  @"iPad mini 2"
@"iPad4,7"   || @"iPad4,8" || @"iPad4,9" : @"iPad mini 3"
@"iPad5,1"    :  @"iPad mini 4"   // iPad Mini 4 (WiFi)
@"iPad5,2"    :  @"iPad mini 4"   // iPad Mini 4 (LTE)
@"iPad5,3"   || @"iPad5,4" : @"iPad air 2"
@"iPad6,3"   || @"iPad6,4" : @"iPad Pro 9.7"
@"iPad6,7"   || @"iPad6,8" : @"iPad Pro 12.9";
@"iPad6,11"   :  @"iPad 5"        // iPad 5 (WiFi)
@"iPad6,12"   :  @"iPad 5"        // iPad 5 (Cellular)
@"iPad7,1"    :  @"iPad Pro 12.9 inch 2nd gen" // iPad Pro 12.9 inch 2nd gen (WiFi)
@"iPad7,2"    :  @"iPad Pro 12.9 inch 2nd gen" // iPad Pro 12.9 inch 2nd gen (Cellular)
@"iPad7,3"    :  @"iPad Pro 10.5 inch" // iPad Pro 10.5 inch (WiFi)
@"iPad7,4"    :  @"iPad Pro 10.5 inch" // iPad Pro 10.5 inch (Cellular)

// AppleTV
@"AppleTV1,1" :  @"Apple TV 1"
@"AppleTV2,1" :  @"Apple TV 2"
@"AppleTV3,1" :  @"Apple TV 3" 
@"AppleTV3,2" :  @"Apple TV 3" 
@"AppleTV5,3" :  @"Apple TV 4" 
@"AppleTV6,2" :  @"Apple TV 4K" 
  • 设备电量
// 通过UIDevice类,可以取得电池剩余量以及充电状态的信息,首先需要设置batteryMonitoringEnabled为YES  
@property(nonatomic,getter=isBatteryMonitoringEnabled) BOOL batteryMonitoringEnabled NS_AVAILABLE_IOS(3_0) __TVOS_PROHIBITED;// 默认为NO
// 电池状态, UIDeviceBatteryState是个枚举类型
typedef NS_ENUM(NSInteger, UIDeviceBatteryState) {
    UIDeviceBatteryStateUnknown,     // 无法取得充电状态情况
    UIDeviceBatteryStateUnplugged,   // 非充电状态
    UIDeviceBatteryStateCharging,    // 充电状态[电量小于100%]
    UIDeviceBatteryStateFull,        // 充满状态[连接充电器充满状态]
} __TVOS_PROHIBITED;               // available in iPhone 3.0
@property(nonatomic,readonly) UIDeviceBatteryState batteryState NS_AVAILABLE_IOS(3_0) __TVOS_PROHIBITED; 
// 电池电量,取值范围为0.0-1.0,当电池状态为UIDeviceBatteryStateUnknown时为-1.0
@property(nonatomic,readonly) float batteryLevel NS_AVAILABLE_IOS(3_0) __TVOS_PROHIBITED;

监视设备电池状态、电池电量变化情况

// 判断设备是否开启电池监控
BOOL batteryMonitoringEnabled = device.isBatteryMonitoringEnabled;
// 开启电池监控
device.batteryMonitoringEnabled = YES;
// 注册电池状态变化通知
[[NSNotificationCenter defaultCenter] addObserver:self 
                                             selector:@selector(deviceBatteryStateDidChange) 
                                                 name:@"UIDeviceBatteryStateDidChangeNotification" 
                                               object:nil];
// 获取设备电池状态
UIDeviceBatteryState batteryState = device.batteryState;
// 注册电池电量变化通知
[[NSNotificationCenter defaultCenter] addObserver:self 
                                             selector:@selector(deviceBatteryLevelDidChange) 
                                                 name:@"UIDeviceBatteryLevelDidChangeNotification" 
                                               object:nil];
// 获取电池电量
float batteryLevel = device.batteryLevel; 
  • 近距离传感器
// 设备接近状态监控开关(判断设备是否开启接近状态监控)
@property(nonatomic,getter=isProximityMonitoringEnabled) BOOL proximityMonitoringEnabled NS_AVAILABLE_IOS(3_0);// 默认为NO
// 获取接近状态(如果设备不具备接近感应器,则总是返回NO)
// 传感器已启动前提条件下,如果用户接近近距离传感器,此时属性值为YES,并且屏幕已关闭(非休眠)。
@property(nonatomic,readonly) BOOL proximityState NS_AVAILABLE_IOS(3_0);

监控设备接近状态

// 判断设备是否开启接近状态监控
BOOL proximityMonitoringEnabled = device.isProximityMonitoringEnabled;
// 开启接近状态监控
device.proximityMonitoringEnabled = YES;
// 注册接近状态变化通知
[[NSNotificationCenter defaultCenter] addObserver:self 
                                             selector:@selector(deviceProximityStateDidChange) 
                                                 name:@"UIDeviceProximityStateDidChangeNotification" 
                                               object:nil];
// 获取接近状态
BOOL proximityState = device.proximityState;
  • 设备性能、界面模式
// 判断设备是否支持多任务
@property(nonatomic,readonly,getter=isMultitaskingSupported) BOOL multitaskingSupported NS_AVAILABLE_IOS(4_0);
// 获取用户界面模式
typedef NS_ENUM(NSInteger, UIUserInterfaceIdiom) {
    UIUserInterfaceIdiomUnspecified = -1,
    UIUserInterfaceIdiomPhone NS_ENUM_AVAILABLE_IOS(3_2),  // iPhone和iPod touch界面风格
    UIUserInterfaceIdiomPad NS_ENUM_AVAILABLE_IOS(3_2),    // iPad界面风格
    UIUserInterfaceIdiomTV NS_ENUM_AVAILABLE_IOS(9_0),     // Apple TV界面风格
    UIUserInterfaceIdiomCarPlay NS_ENUM_AVAILABLE_IOS(9_0),// CarPlay界面风格
};
@property(nonatomic,readonly) UIUserInterfaceIdiom userInterfaceIdiom NS_AVAILABLE_IOS(3_2); 

NSBundle

bundle是一个目录,其中包含了程序会使用到的资源. 这些资源包含了如图像,声音,编译好的代码,nib文件(用户也会把bundle称为plug-in)。对应bundle,cocoa提供了类NSBundle。一个应用程序看上去和其他文件没有什么区别,但是实际上它是一个包含了nib文件,编译代码,以及其他资源的目录, 我们把这个目录叫做程序的main bundle(当前的可执行app在根目录下的绝对路径)。通过这个路径可以获取到应用的信息,例如应用名、版本号等。常用的信息如下:

  • 获取应用名称(显示在手机屏幕上的应用名字)。
[[[NSBundle mainBundle] infoDictionary] objectForKey:@"CFBundleDisplayName"]; 

在TARGETS下面的Info里面有以下几个属性

[这里创建一个名为CJDeviceInfo的工程为例]
// App安装到设备里的应用文件夹名(CJDeviceInfo)
Bundle Name - ${PRODUCT_NAME}
// 应用包名(com.circus.CJDeviceInfo)
Bundle Identifier - $(PRODUCT_BUNDLE_IDENTIFIER)
// 手机屏幕上的应用名字,默认为PRODUCT_NAME
Bundle Display Name - ${PRODUCT_NAME}
// 执行程序名,默认与PRODUCT_NAME一致
Executable File - ${EXECUTABLE_NAME}

想要修改显示在手机屏幕上的应用名字,可以直接修改info里的Bundle Display Name的值;但是如果要国际化应用名称,则需要创建InfoPlist.strings,步骤如下:
1)创建一个空文件,取名为InfoPlist.strings
2)对InfoPlist.strings进行本地化(Get Info -> Make Localization),然后设置需要的语言(如中文zh)
3)编辑不同的InfoPlist.strings文件,设置显示名字CFBundleDisplayName = "名字";
4)编辑Info.plist,添加一个新的属性Application has localized display name,设置其类型为boolean,并将其value设置为true
注意: 上面获取应用名称的方法,只能获取到直接在info中设置的Bundle Display Name信息,获取不到在InfoPlist.strings中设置的CFBundleDisplayName的信息。

  • 获取InfoPlist.strings设置的国际化的应用名称方法如下:
NSLocalizedStringFromTableInBundle(@"CFBundleDisplayName", @"InfoPlist", [NSBundle mainBundle], comment);
  • 获取应用短版本号,如1.0(用户看到的版本号,AppStore上的版本号)
[[[NSBundle mainBundle] infoDictionary] objectForKey:@"CFBundleShortVersionString"]; 
  • 获取应用Build版本号,如1.0.1(公司内部使用的版本号,在AppStore修改同一个版本的IPA文件时,可以通过自增Build版本号来实现上传多个)
[[[NSBundle mainBundle] infoDictionary] objectForKey:@"CFBundleVersion"];  
  • 获取应用identifier,如com.Circus.CJDeviceInfo(常用于需要同一份代码打包成不同应用,通过判断identifier来实现使用不同的第三方key)
[[[NSBundle mainBundle] infoDictionary] objectForKey:@"CFBundleIdentifier"]; 

NSLocale

本地化封装了关于语言,文化以及技术约定和规范的信息。用于提供与用户所处地域相关的定制化信息和首选项信息的设置。NSLocale类封装了本地化相关的各种信息,NSLocale可以获取用户的本地化信息设置,例如货币类型,国家,语言,数字,日期格式的格式化,提供正确的地理位置显示等等。

  • 创建本地化对象
// 根据本地标识符创建本地化对象
NSLocale *usLocale = [[NSLocale alloc] initWithLocaleIdentifier:@"en_US"];
// 获取当前用户设置的本地化对象
NSLocale *currentLocale = [NSLocale currentLocale];
  • 获取系统本地化信息
// 获取系统所有本地化标识符数组列表
[NSLocale availableLocaleIdentifiers];
// 获取所有已知合法的国家代码数组列表
[NSLocale ISOCountryCodes];
// 获取所有已知合法的ISO货币代码数组列表
[NSLocale ISOCurrencyCodes];
// 获取所有已知合法的ISO语言代码数组列表
[NSLocale ISOLanguageCodes];
  • 获取本地标识信息和语言码信息
// 本地标识,如:en_US
[[NSLocale currentLocale] localeIdentifier];
等价于
[[NSLocale currentLocale] objectForKey:NSLocaleIdentifier];
// 语言码,如:en
[[NSLocale currentLocale] objectForKey: NSLocaleLanguageCode];
  • 获取当前语言的排版方向和字符方向
// 语言的排版方向
[NSLocale lineDirectionForLanguage:[[NSLocale currentLocale] objectForKey:NSLocaleLanguageCode];
// 字符方向
[NSLocale characterDirectionForLanguage:[[NSLocale currentLocale] objectForKey:NSLocaleLanguageCode];
// 返回结果为枚举类型
typedef NS_ENUM(NSUInteger, NSLocaleLanguageDirection) {
    NSLocaleLanguageDirectionUnknown = kCFLocaleLanguageDirectionUnknown,         // 未知
    NSLocaleLanguageDirectionLeftToRight = kCFLocaleLanguageDirectionLeftToRight, // 从左向右
    NSLocaleLanguageDirectionRightToLeft = kCFLocaleLanguageDirectionRightToLeft, // 从右向左
    NSLocaleLanguageDirectionTopToBottom = kCFLocaleLanguageDirectionTopToBottom, // 从上到下
    NSLocaleLanguageDirectionBottomToTop = kCFLocaleLanguageDirectionBottomToTop  // 从下到上
};
  • 获取用户的语言偏好设置列表,该列表对应于iOS中Setting>General>Language弹出的面板中的语言列表,列表的第一个元素即为当前用户设置的语言。
[NSLocale preferredLanguages]
  • 监听用户本地化设置的消息
[[NSNotificationCenter defaultCenter] addObserver:self
                                         selector:@selector(localChangedHandler:)
                                             name:NSCurrentLocaleDidChangeNotification object:nil];
  • 以本地化方式获取国际化信息的显示名称
// 以美国地区,英文语言为本地化(en_US)
NSLocale *curLocal = [[NSLocale alloc] initWithLocaleIdentifier:@"en_US"];
NSLog(@"%@",[curLocal displayNameForKey:NSLocaleIdentifier value:@"fr_FR"] );// French (France)
// 以中国地区,简体中文语言为本地化(zh-Hans)
curLocal = [[NSLocale alloc] initWithLocaleIdentifier:@"zh-Hans"];
NSLog(@"%@",[curLocal displayNameForKey:NSLocaleIdentifier value:@"fr_FR"] );// 法文(法国)

你可能感兴趣的:(iOS开发-获取设备信息和应用信息)