iPhone-请求运动活动



我正在开发一个iOS应用程序,在该应用程序中我使用运动活动管理器(更详细地说是计步器)。当应用程序启动时,我需要检查用户是否允许运动活动。我通过做来做到这一点

_motionActivityManager = [[CMMotionActivityManager alloc] init];
_pedometer = [[CMPedometer alloc] init];
[_pedometer queryPedometerDataFromDate : [NSDate date]
                                toDate : [NSDate date]
                           withHandler : ^(CMPedometerData *pedometerData, NSError *error) {
                                   // BP1
                                    if (error != nil) {
                                        // BP2
                                    }
                                    else {
                                        // BP3
                                    }
                                }];

如本文所述☛iOS-是否在设置中启用运动活动>隐私>运动活动

据我所知,此代码将触发"警报窗口",要求用户选择加入/退出。

在我的情况下,当我第一次运行应用程序时(也就是说,所有警告都被重置),应用程序在"BP1"之前挂起(回调从未执行),然后如果我用xCode停止应用程序或按下主页按钮,就会出现"警报窗口"。如果我选择加入,一切都很好,在第二次运行时达到"BP3"(如果我选择退出,则达到"BP2")。

我尝试做的事:

  • 我使用异步执行实现了另一种检查方式

    [_pedometer queryPedometerDataFromDate : [NSDate date]
                                    toDate : [NSDate date]
                               withHandler : ^(CMPedometerData *pedometerData, NSError *error) {
                                // Because CMPedometer dispatches to an arbitrary queue, it's very important
                                // to dispatch any handler block that modifies the UI back to the main queue.
                                dispatch_async(dispatch_get_main_queue(), ^{
                                    authorizationCheckCompletedHandler(!error || error.code != CMErrorMotionActivityNotAuthorized);
                                });
    }];
    

这不会挂起应用程序,但"警报窗口"从未显示

  • 我稍后在代码中执行了这个"检查片段",但应用程序再次挂起

本质上,当第一个视图出现时,即在onViewDidPear中,使用可以首先确保警报视图不会阻止您的应用程序。

例如do:

-(void) viewDidAppear:(BOOL)animated {
    if ([MyActivityManager checkAvailability]) { // motion and activity availability checks
        [myDataManager checkAuthorization:^(BOOL authorized) { // is authorized
            dispatch_async(dispatch_get_main_queue(), ^{
                if (authorized) {
                    // do your UI update etc...
                }
                else {
                    // maybe tell the user that this App requires motion and tell him about activating it in settings...
                }
            });
        }];
    }
}

这是我自己做的。我的应用程序也基于苹果的示例代码,并注意到该示例也存在您所描述的问题。

最新更新