Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/iphone/38.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用iOS 7在后台获取步骤_Ios_Iphone_Objective C_Accelerometer - Fatal编程技术网

使用iOS 7在后台获取步骤

使用iOS 7在后台获取步骤,ios,iphone,objective-c,accelerometer,Ios,Iphone,Objective C,Accelerometer,我正在开发一个应用程序,在这个应用程序中,我应该获得我在体育活动中所做的步骤数。我发现这个代码: - (void)countSteps { [[UIAccelerometer sharedAccelerometer] setUpdateInterval:1.0 / KUPDATEFREQUENCY]; [[UIAccelerometer sharedAccelerometer] setDelegate:self]; px = py = pz = 0; numSt

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

- (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;
}
-(void)countSteps{
[[UID加速度计]设置日期间隔:1.0/KUPDATEFREQUENCY];
[[UID加速度计]setDelegate:self];
px=py=pz=0;
numSteps=0;
self.labelSteps.text=[NSString stringWithFormat:@“%d”,numSteps];
}
-(无效)加速计:(UIAccelerator*)加速计DID加速度:(UIAcceleration*)加速度{
浮动xx=加速度x;
浮点数yy=加速度y;
float zz=加速度.z;
浮点数=(px*xx)+(py*yy)+(pz*zz);
浮点数a=ABS(sqrt(px*px+py*py+pz*pz));
浮点数b=ABS(sqrt(xx*xx+yy*yy+zz*zz));
dot/=(a*b);

如果(dot当显示器关闭时,您无法访问加速计,但即使在显示器关闭时,您也可以监控位置变化,而不管iPhone型号如何。根据我的猜测,Moves应用程序使用基于地理位置的变化来计算步数。在CLLocationManager文档中,我阅读了以下内容

在iOS 6及更高版本中,您可以在 您的应用程序位于后台。建议您使用此应用程序 在应用程序稍后可以处理数据的情况下使用此功能 没有任何问题。例如,跟踪用户的 徒步旅行路线上的位置可能会推迟更新,直到用户徒步旅行 一定距离,然后一次处理所有点。延迟 更新可以让你的应用保持休眠状态,从而节省电量 更长的时间

如果您的应用程序位于后台且系统能够优化 它的电力使用,位置管理器告诉GPS硬件存储 在指定的距离或超时之前,在内部创建新位置 满足条件。当满足一个或两个条件时,位置 经理通过调用 locationManager:didFinishDeferredUpdatesWithError:its的方法 委托并将缓存的位置传递给 locationManager:didUpdateLocations:method。如果您的应用程序位于 前台,位置管理器不会延迟事件的传递 但不监视指定的条件。如果您的应用移动到 背景在满足标准之前,位置管理器可以开始 推迟事件的传递

因此,当你得到一组缓存位置时,你可以计算出发生的大概步骤数。我只是给出了我所有的疯狂想法,这取决于你

看看这个,似乎很有趣

谢谢您的回答:)!或多或少我明白你的意思。我想我应该这样做:用
LocationManager
获取从起点到终点的坐标,然后我应该计算起点到终点的距离,用这个距离,我必须用这个等式来近似步数:
步数=距离/人的中等长度步骤
。当你的应用在商店上线时,让我知道,我想试试!!现在我试过了,所以:我得到坐标,我用以下方式计算距离:
distance=[startLocation distanceFromLocation:currentLocation];
我尝试使用以下公式获得步数:
int numSteps=distance/0.8;
。我将在几分钟后(回家时)试用该应用程序所以下周我可以告诉你这个解决方案是否有效。我看到了这个,可能对你有一些帮助。我在上面的问题中尝试了你的代码,但它甚至在前台也不能计算准确的步数。你有没有更好的主意或算法可以更准确地计算用户步数?
- (void)allowDeferredLocationUpdatesUntilTraveled:(CLLocationDistance)distance timeout:(NSTimeInterval)timeout