ユーザーがiPhoneを顔に上げたときに通知を受け取りたい。siriのように。出来ますか?
より具体的な要件を追加: ユーザーが電話を耳に近づけたときに画面を暗くしたい。これを実装するために近接センサーを有効にできることは知っています。ただし、ユーザーがセンサー上で指を動かすと、画面が時々暗くなるのは面倒です。では、このケースを回避し、ユーザーが iPhone を上げて話すときにのみ画面を暗くする方法を知りたいですか?
UIDeviceクラスリファレンスの近接センサーの使用を参照してください。だから、あなた:
有効にする:
UIDevice *device = [UIDevice currentDevice];
device.proximityMonitoringEnabled = YES;
正常に有効になっているかどうかを確認します。成功した場合はUIDeviceProximityStateDidChangeNotification
通知を確認してください。そうでない場合、デバイスは機能しない可能性があります。
if (device.proximityMonitoringEnabled)
{
[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(handleProximityChange:)
name:UIDeviceProximityStateDidChangeNotification
object:nil];
}
else
{
// device not capable
}
そしてセレクターを書いてください:
- (void)handleProximityChange:(NSNotification *)notification
{
NSLog(@"%s proximityState=%d", __FUNCTION__, [[UIDevice currentDevice] proximityState]);
}
ユーザーがそれを顔にかざしているかどうかを検出するために、近接センサーをと結婚させてCMMotionManager
、プロパティを調べて、ユーザーがgravity
電話をほぼ垂直に持っているかどうかを確認する場合があります。したがって、いくつかのクラスプロパティを定義します。
@property (nonatomic, strong) CMMotionManager *motionManager;
@property (nonatomic, strong) NSOperationQueue *deviceQueue;
次に、を開始してCMMotionManager
、デバイスが垂直位置に保持されているかどうかを確認できます。
self.deviceQueue = [[NSOperationQueue alloc] init];
self.motionManager = [[CMMotionManager alloc] init];
self.motionManager.deviceMotionUpdateInterval = 5.0 / 60.0;
UIDevice *device = [UIDevice currentDevice];
[self.motionManager startDeviceMotionUpdatesUsingReferenceFrame:CMAttitudeReferenceFrameXArbitraryZVertical
toQueue:self.deviceQueue
withHandler:^(CMDeviceMotion *motion, NSError *error)
{
BOOL vertical = (motion.gravity.z > -0.4 && motion.gravity.z < 0.4 & motion.gravity.y < -0.7);
if ((vertical && !device.proximityMonitoringEnabled) || (!vertical && device.proximityMonitoringEnabled))
{
device.proximityMonitoringEnabled = vertical;
}
}];
これらのgravity
しきい値が意味をなすかどうかは少し主観的です。また、電話がほぼ垂直に保持されているかどうかを確認するだけでなく、他の加速度計データを確認することもできます(たとえば、オブジェクトが持ち上げられたかどうか)。猫の皮を剥ぐ方法はたくさんあるようです。