UIDevice

UIDevice

UIDevice 类的单例描述了当前设备的一些设备信息,如设备名称、设备类型、系统名及版本号、电池状态、进近传感器状态、设备姿态等信息。

可以通过注册如下通知,来获取相关变化。

  • UIDeviceOrientationDidChangeNotification
  • UIDeviceBatteryStateDidChangeNotification
  • UIDeviceBatteryLevelDidChangeNotification
  • UIDeviceProximityStateDidChangeNotification

identifierForVendor

@property(nullable, nonatomic,readonly,strong) NSUUID *identifierForVendor API_AVAILABLE(ios(6.0));

该属性用来标志同一个设备上供应商提供的所有应用,即在一个设备上同一个供应商提供的不同的应用的该属性的值是相同的。

通常这个值是 App Store 提供的,但是如果应用是企业自己发布的或者是测试版本的,那么该属性值是基于 Bundle ID 计算得到的。计算时,iOS 6 是计算 ID 的前两个字段,iOS 7 之后,是计算除去 ID 最后一个字段的剩余所有字段。如果只有一个字段,那么则基于该字段进行计算。

所以对于企业级应用而言,该属性在同一个设备上的同一个供应商提供的应用中可能是不同的。

当然,在不同的设备上,应用中读取的该属性总是不同的,和供应商是否为同一个无关。

generatesDeviceOrientationNotifications

该属性用来判断当前应用中是否可以发送设备姿态变化通知,如果设备本身禁止了屏幕旋转,那么该值无论真假,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 方法并没有修改通知中心,或许系统维护了一个表,用来记录受加速计状态变化影响的应用。
beginGeneratingDeviceOrientationNotificationsendGeneratingDeviceOrientationNotifications 都是对这个标记的影响,那么 generatesDeviceOrientationNotifications 的异步变化也可以解释的通了。

除此之外,DCDeviceCheck 框架中的 DCDevice 类同样可以获取当前设备,但是其并不是用来描述当前设备的相关属性,而是提供了一个方法来生成一个 token 值来标记当前设备,该值可以作为一个唯一标志传递到应用的后台,从而后台可以同苹果的服务器进行交互,设置或获取一个 2 位的状态值。通过这个值,商家可以判断该设备的使用者的相关权益。

详细可以参考:DeviceCheck 框架详细解析

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值