UIDevice 类的单例描述了当前设备的一些设备信息,如设备名称、设备类型、系统名及版本号、电池状态、进近传感器状态、设备姿态等信息。
可以通过注册如下通知,来获取相关变化。
UIDeviceOrientationDidChangeNotification
UIDeviceBatteryStateDidChangeNotification
UIDeviceBatteryLevelDidChangeNotification
UIDeviceProximityStateDidChangeNotification
@property(nullable, nonatomic,readonly,strong) NSUUID *identifierForVendor API_AVAILABLE(ios(6.0));
该属性用来标志同一个设备上供应商提供的所有应用,即在一个设备上同一个供应商提供的不同的应用的该属性的值是相同的。
通常这个值是 App Store
提供的,但是如果应用是企业自己发布的或者是测试版本的,那么该属性值是基于 Bundle ID
计算得到的。计算时,iOS 6
是计算 ID 的前两个字段,iOS 7
之后,是计算除去 ID 最后一个字段的剩余所有字段。如果只有一个字段,那么则基于该字段进行计算。
所以对于企业级应用而言,该属性在同一个设备上的同一个供应商提供的应用中可能是不同的。
当然,在不同的设备上,应用中读取的该属性总是不同的,和供应商是否为同一个无关。
该属性用来判断当前应用中是否可以发送设备姿态变化通知,如果设备本身禁止了屏幕旋转,那么该值无论真假,UIDeviceOrientationDidChangeNotification
通知都不会发出。而如果设备是允许旋转的,那么该值为假时,该通知同样不会发出。
@property(nonatomic,readonly,getter=isGeneratingDeviceOrientationNotifications) BOOL generatesDeviceOrientationNotifications API_UNAVAILABLE(tvos);
如果需要根据某些条件来决定是否发送设备姿态变化通知,可以使用下面的两个方法来修改上面的属性值,使用时应成对使用,有始有终。
- (void)beginGeneratingDeviceOrientationNotifications API_UNAVAILABLE(tvos); // nestable
- (void)endGeneratingDeviceOrientationNotifications API_UNAVAILABLE(tvos);
同样的,如果要获取设备的姿态信息,如下写法更加保险。
UIDevice *device = [UIDevice currentDevice];
if (!device.isGeneratingDeviceOrientationNotifications) {
[device beginGeneratingDeviceOrientationNotifications];
}
NSLog(@"%ld",device.orientation);
如果确定不再需要接收设备姿态通知,那么可以调用下面的方法,调用后,设备 orientation
的值为 UIDeviceOrientationUnknown
。
[[UIDevice currentDevice] endGeneratingDeviceOrientationNotifications];
endGeneratingDeviceOrientationNotifications
方法的调用并没有影响其他应用对相关通知的接收,并且 generatesDeviceOrientationNotifications
的值也不是立即就变为 NO
了,说明这个修改是异步的,且重启应用后,该值仍为 YES
。
根据官方文档的描述,该方法调用后,即告知系统可以停止加速计并断电,由此猜测
generatesDeviceOrientationNotifications
的初始值是由加速计的状态来确定的。
虽然在 endGeneratingDeviceOrientationNotifications
方法调用后,设备旋转并不触发监听事件,但是在应用进入后台或由后台进入前台时,仍能够监听到相应的 UIDeviceOrientationDidChangeNotification
通知,并触发相关方法。
由此猜测,
endGeneratingDeviceOrientationNotifications
方法并没有修改通知中心,或许系统维护了一个表,用来记录受加速计状态变化影响的应用。
而beginGeneratingDeviceOrientationNotifications
和endGeneratingDeviceOrientationNotifications
都是对这个标记的影响,那么generatesDeviceOrientationNotifications
的异步变化也可以解释的通了。
除此之外,DCDeviceCheck
框架中的 DCDevice
类同样可以获取当前设备,但是其并不是用来描述当前设备的相关属性,而是提供了一个方法来生成一个 token
值来标记当前设备,该值可以作为一个唯一标志传递到应用的后台,从而后台可以同苹果的服务器进行交互,设置或获取一个 2 位的状态值。通过这个值,商家可以判断该设备的使用者的相关权益。
详细可以参考:DeviceCheck 框架详细解析