使用iOS 7获取后台步骤

时间:2014-02-28 11:57:09

标签: ios iphone objective-c accelerometer

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

- (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中看到了“背景模式”功能。使用此功能,我可以在iPhone显示屏关闭时获取坐标。现在我要在显示器关闭时获取加速度计值,我该怎么做?我在网上看到iOS不允许在后台模式下使用加速度计(只有iPhone 5s和协处理器M7可以在显示器关闭时获得加速度计值),我如何在后台模式下使用加速度计来计算步数?我想应该有办法,否则我无法理解Moves app的工作原理。

1 个答案:

答案 0 :(得分:5)

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

  

在iOS 6及更高版本中,您可以在何时推迟发送位置数据   你的应用程序在后台。建议您使用它   在您的应用可以稍后处理数据的情况下使用此功能   没有任何问题。 例如,跟踪用户的应用   远足径上的位置可以推迟更新,直到用户加息   一定的距离,然后一次处理所有点。推迟   通过允许您的应用程序保持睡眠状态,更新有助于节省电量   更长的时间。

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

如果您的应用位于后台,系统可以进行优化   它的用电量,位置管理员告诉GPS硬件存储   内部的新位置,直到指定的距离或超时   条件得到满足。满足一个或两个标准时,位置   经理通过致电来结束递延的地点   locationManager:didFinishDeferredUpdatesWithError:其方法   委托并将缓存的位置传递给   locationManager:didUpdateLocations:方法。如果你的应用程序在   前台,位置管理员不会推迟事件的传递   但是会监控指定的标准。如果您的应用移动到   在满足标准之前的背景,位置管理器可以开始   推迟举办活动。

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

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