目录
- UIDevice
- 设备相关信息
- 设备电量
- 近距离传感器
- 设备性能、界面模式
- NSBundle
- 获取应用名称
- 应用短版本号
- 应用Build版本号
- 应用identifier
- NSLocale
- 创建本地化对象
- 获取系统本地化信息
- 获取本地标识信息和语言码信息
- 获取当前语言的排版方向和字符方向
- 获取用户的语言偏好设置列表
- 监听用户本地化设置的消息
- 以本地化方式获取国际化信息的显示名称
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 <sys/sysctl.h>
。输入底层获取设备类型的方法。
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(设备硬件类型)的对应关系如下:
(官方参数表链接:https://www.theiphonewiki.com/wiki/Models)
// 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",
@"iPhone12,1":@"iPhone 11",
@"iPhone12,3":@"iPhone 11 Pro",
@"iPhone12,5":@"iPhone 11 Pro Max",
@"iPhone12,8":@"iPhone SE 2",
@"iPhone13,1":@"iPhone 12 mini",
@"iPhone13,2":@"iPhone 12",
@"iPhone13,3":@"iPhone 12 Pro",
@"iPhone13,4":@"iPhone 12 Pro Max",
@"iPhone14,2":@"iPhone 13 Pro",
@"iPhone14,3":@"iPhone 13 Pro Max",
@"iPhone14,4":@"iPhone 13 mini",
@"iPhone14,5":@"iPhone 13",
@"iPhone14,6":@"iPhone SE 3",
@"iPhone14,7":@"iPhone 14",
@"iPhone14,8":@"iPhone 14 Plus",
@"iPhone15,2":@"iPhone 14 Pro",
@"iPhone15,3":@"iPhone 14 Pro Max",
// 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)
@"iPad7,5":@"iPad 6th gen",
@"iPad7,6":@"iPad 6th gen",
@"iPad7,11":@"iPad 7th gen",
@"iPad7,12":@"iPad 7th gen",
@"iPad11,6":@"iPad 8th gen",
@"iPad11,7":@"iPad 8th gen",
@"iPad12,1":@"iPad 9th gen",
@"iPad12,2":@"iPad 9th gen",
@"iPad13,18":@"iPad 10th gen",
@"iPad13,19":@"iPad 10th gen",
@"iPad11,3":@"iPad Air 3rd gen",
@"iPad11,4":@"iPad Air 3rd gen",
@"iPad13,1":@"iPad Air 4th gen",
@"iPad13,2":@"iPad Air 4th gen",
@"iPad13,16":@"iPad Air 5th gen",
@"iPad13,17":@"iPad Air 5th gen",
@"iPad8,1":@"iPad Pro 11 inch",
@"iPad8,2":@"iPad Pro 11 inch",
@"iPad8,3":@"iPad Pro 11 inch",
@"iPad8,4":@"iPad Pro 11 inch",
@"iPad8,5":@"iPad Pro 12.9 inch 3rd gen",
@"iPad8,6":@"iPad Pro 12.9 inch 3rd gen",
@"iPad8,7":@"iPad Pro 12.9 inch 3rd gen",
@"iPad8,8":@"iPad Pro 12.9 inch 3rd gen",
@"iPad8,9":@"iPad Pro 11 inch 2nd gen",
@"iPad8,10":@"iPad Pro 11 inch 2nd gen",
@"iPad8,11":@"iPad Pro 12.9 inch 4th gen",
@"iPad8,12":@"iPad Pro 12.9 inch 4th gen",
@"iPad13,4":@"iPad Pro 11 inch 3rd gen",
@"iPad13,5":@"iPad Pro 11 inch 3rd gen",
@"iPad13,6":@"iPad Pro 11 inch 3rd gen",
@"iPad13,7":@"iPad Pro 11 inch 3rd gen",
@"iPad13,8":@"iPad Pro 12.9 inch 5th gen",
@"iPad13,9":@"iPad Pro 12.9 inch 5th gen",
@"iPad13,10":@"iPad Pro 12.9 inch 5th gen",
@"iPad13,11":@"iPad Pro 12.9 inch 5th gen",
@"iPad11,1":@"iPad mini 5th gen",
@"iPad11,2":@"iPad mini 5th gen",
@"iPad14,1":@"iPad mini 6th gen",
@"iPad14,2":@"iPad mini 6th gen"
// 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"] );// 法文(法国)