Ios5 Nike+;iPhone上的GPS在后台接收加速计更新?

Ios5 Nike+;iPhone上的GPS在后台接收加速计更新?,ios5,accelerometer,background-process,Ios5,Accelerometer,Background Process,iOS 5的新Nike+GPS应用程序能够在后台处理加速计事件(从而允许室内跑步机跟踪)。这怎么可能?当我将应用程序放在后台时,它停止接收事件。我使用标准的UIAcceleratorAPI。是为了提供这个问题的答案,尽管它已经自我回答了 如果使用较新的Core Motion API,则可以在后台接收更新 以下是一个例子: - (void)startAccelerationCollection { [self.motionManager startAccelerometerUpdatesT

iOS 5的新Nike+GPS应用程序能够在后台处理加速计事件(从而允许室内跑步机跟踪)。这怎么可能?当我将应用程序放在后台时,它停止接收事件。我使用标准的UIAcceleratorAPI。

是为了提供这个问题的答案,尽管它已经自我回答了

如果使用较新的Core Motion API,则可以在后台接收更新

以下是一个例子:

- (void)startAccelerationCollection {
    [self.motionManager startAccelerometerUpdatesToQueue:[[NSOperationQueue alloc] init]
                                             withHandler:^(CMAccelerometerData *data, NSError *error) {
        dispatch_async(dispatch_get_main_queue(), ^{
            [self.accelerometerReadings addObject:data];
        });
    }];
}

当该模块更新计步器时,我调用该方法来关闭和打开GPS。对我来说,它解决了用户按home键并在spotify上听音乐一小时的问题

不要忘记启用项目设置->功能->后台模式->位置更新

    import CoreLocation
    import CoreMotion


    //turn Off and turn On GPS
    private func apelacaoRenovarGPSLigado() {

    LocationManager.sharedInstance.stopUpdatingLocation()
    let locationManager = LocationManager.sharedInstance
    locationManager.autoUpdate = true
    locationManager.startUpdatingLocationWithCompletionHandler { (location, status, verboseMessage, error) -> () in

    }
}

private func startPedometer()
{
    if CMPedometer.isDistanceAvailable()
    {
        if self.pedometer == nil
        {
            self.pedometer = CMPedometer()
        }

        self.pedometer!.startPedometerUpdatesFromDate(NSDate()) { (data, error) in

            dispatch_async(dispatch_get_main_queue(), {

                print("DISTANCIA PARCIAL \(data!.distance!)")

                print("DIFERENCA \(data!.distance!.doubleValue - (self.totalDistance + self.subtotalDistance))")
                self.delegate!.trackerDistanceDidChanged((data!.distance!.doubleValue - (self.totalDistance + self.subtotalDistance)) / 1000.0)
                self.subtotalDistance = data!.distance!.doubleValue

                self.apelacaoRenovarGPSLigado()

            })

        }
    }
    else
    {
        self.delegate!.trackerDeviceNotSupported()
    }
}

请,其他人可以确认吗?看起来太棒了,AppleI可以确认它是有效的!你唯一需要满足的就是——使用任何后台模式让你的应用程序在后台运行(位置更新、播放、VoIP或BT4 central)。嘿,伙计们,感谢你们迄今为止所做的工作!我试过你的计步器应用程序。这几乎对我有用。我使用位置后台模式,每9分钟更新一次用户位置,以防止应用程序变为非活动状态-此机制有效,但在前9分钟后更新队列不包含任何数据。你知道哪里出了问题吗?或者你可以为我的问题提供更详细的提示/解决方案吗?再次感谢你!Hannesfyi,您可以为自己的问题提供答案,请使用此选项。@kyrpoff如何在应用程序处于后台的前10分钟后获取加速计数据。按“主页”按钮后,此选项不起作用。我们怎样才能解决这个问题?@Sumoanand-是的。当应用程序被挂起时(当用户按下HOME按钮或切换应用程序等时),这不起作用。如果用户按下HOME按钮,我会看到关于这不起作用的评论。这些评论是否意味着这在所有其他情况下都有效?例如,如果用户让手机闲置直到屏幕变暗,那么屏幕将变为空白,它工作吗?如果用户按下电源按钮关闭屏幕怎么办?在我的两个例子中,我的意思是用户在应用程序打开后没有按下home按钮,因此,在屏幕变为空白之前,它一直是前台应用程序。这对某些人不起作用的原因是,它不是完整的解决方案-如果你只是将其复制到一个其他空项目中,当应用程序位于后台时,你将无法获得任何数据。您需要启用某种类型的后台模式(音频、位置或其他对应用程序有意义的模式),并且需要运行后台任务。见此答复: