使用iOS 7获取后台步骤

我正在开发一个应用程序,在其中我应该获得我在体育活动中所做的步骤数。 我找到了这段代码:

- (void)countSteps { [[UIAccelerometer sharedAccelerometer] setUpdateInterval:1.0 / KUPDATEFREQUENCY]; [[UIAccelerometer sharedAccelerometer] setDelegate:self]; px = py = pz = 0; numSteps = 0; self.labelSteps.text = [NSString stringWithFormat:@"%d", numSteps]; } - (void)accelerometer:(UIAccelerometer *)accelerometer didAccelerate:(UIAcceleration *)acceleration { float xx = acceleration.x; float yy = acceleration.y; float zz = acceleration.z; float dot = (px * xx) + (py * yy) + (pz * zz); float a = ABS(sqrt(px * px + py * py + pz * pz)); float b = ABS(sqrt(xx * xx + yy * yy + zz * zz)); dot /= (a * b); if (dot <= 0.82) { if (!isSleeping) { isSleeping = YES; [self performSelector:@selector(wakeUp) withObject:nil afterDelay:0.3]; numSteps += 1; self.labelSteps.text = [NSString stringWithFormat:@"%d", numSteps]; } } px = xx; py = yy; pz = zz; } - (void)wakeUp { isSleeping = NO; } 

使用此代码,当iPhone的显示器打开时,它工作得很好,但是当我关闭显示器时,它不再起作用。 为了跟踪位置,我在iOS 7中看到了一个function“后台模式”。 使用此function,我可以在iPhone显示屏关闭时获取坐标。 现在我要在显示器关闭时获取加速度计值,我该怎么做? 我在网上看到iOS不允许在后台模式下使用加速度计(只有iPhone 5s和协处理器M7可以在显示器关闭时获得加速度计值),我如何在后台模式下使用加速度计来计算步数? 我想应该有一种方法,否则我无法理解Moves app的工作原理。

当显示器关闭时,您无法访问加速度计,但即使显示屏关闭,您也可以监控位置更改,无论iPhone型号如何。 根据我的猜测,Moves应用程序使用基于地理位置的更改来计算步数。 在CLLocationManger文档中,我读到了这个

在iOS 6及更高版本中,您可以在应用程序位于后台时推迟发送位置数据。 建议您在以后应用程序可以毫无问题地处理数据的情况下使用此function。 例如,跟踪用户在远足径上的位置的应用程序可以推迟更新,直到用户徒步一定距离然后一次处理所有点。 延迟更新可让您的应用程序长时间保持睡眠状态,从而节省电量。

 - (void)allowDeferredLocationUpdatesUntilTraveled:(CLLocationDistance)distance timeout:(NSTimeInterval)timeout 

如果您的应用程序在后台并且系统能够优化其电源使用,则位置管理器会告知GPS硬件在内部存储新位置,直到满足指定的距离或超时条件。 当满足一个或两个条件时,位置管理器通过调用其委托的locationManager:didFinishDeferredUpdatesWithError:方法来结束延迟位置,并将缓存的位置传递给locationManager:didUpdateLocations:方法。 如果您的应用程序位于前台,则位置管理器不会延迟事件的传递,但会监视指定的条件。 如果您的应用在符合条件之前移至后台,则位置管理员可能会开始推迟发送事件。

因此,当您获得一组缓存位置时,您可以计算出发生的大致步骤数。 我只是给你所有狂野的想法,由你决定!

看到这个,似乎很有趣https://www.cocoacontrols.com/controls/somotiondetector