
Sleep Cycle、ちょうどいい時間に起こしてくれるので便利です。
ただ、アラーム音が私にとっては小さいので本当に疲れているときは起きれないことがあるんですけど。
どうやって眠っているサイクルを取得しているのか、そのロジックが気になったので調べてみました。

使い方の写真に上のようにiphoneを裏側にして枕の横に置くように説明しているため、近接センサーで何かやっているのかと思っていました。近接センサーは電話のときの画面を顔に近づけると、画面が切り替わって入力ができないようにするなどの処理で利用されています。
しかし、ネットを調べてみるとAccelerometerを使っているという記述を発見!
そこで、Sleep Cycleの説明をよく読んでみると

上記の赤枠のようにAccelerometerすなわち加速度センサーを利用しているそうです。寝ているときの寝返りの動きを加速度センサーで取得して睡眠サイクルを計算しているようです。
加速度センサーを利用するためのサンプルコードは以下です。
UIAccelerometerDelegateメソッドを宣言する必要があります。
AccelerometerViewController.h
interface AccelerometerViewController : UIViewController
< UIAccelerometerDelegate // 加速度センサ
>
{
UIAccelerationValue accelX, accelY, accelZ; // ノイズ除去済の各軸座標
//その他の処理
}
AccelerometerViewController.m
- (void)accelerometer:(UIAccelerometer *)accelerometer didAccelerate:(UIAcceleration *)acceleratio {
CGFloat saY = prevAcceleratioY - acceleratio.y; //前回のY軸の重力との差
if (acceleratio.y > power || acceleratio.y < -1*power){ //if ( prevAcceleratioX - acceleratio.x > 2 || prevAcceleratioX - acceleratio.x < 1 ) {
if ( saY < 0 ) {
NSLog(@"重力 Y 現:%f, 差:%f",acceleratio.y,saY);
varStep++;
NSString *dateStr = [NSString stringWithFormat:@"%d", varStep];
[aLabel setText:dateStr];
}
}