iPhone - 请求动议 activity
iPhone - requesting Motion activity
我正在开发一个 iOS 应用程序,我在其中使用了 Motion Activity 管理器(更详细地说 - 计步器)。当应用程序启动时,我需要检查用户是否允许 Motion Activity。我通过
来做到这一点
_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 - is Motion Activity Enabled in Settings > Privacy > Motion Activity
据我了解,此代码将触发 "alert window" 要求用户 opt-in/out。
我的情况是,当我 运行 应用程序 第一次 (也就是所有警告都已重置)时,应用程序在 'BP1' 之前挂起(永远不会执行回调),然后如果我使用 xCode 停止应用程序或按主页按钮 "alert window" 出现。如果我选择加入,一切都很好,第二个 运行 '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);
});
}];
这不会挂起应用程序,但 "alert window" 永远不会显示
- 我稍后在代码中执行了此 "checking snippet" - 但再次 - 应用程序挂起
本质上,当第一个视图出现时,首先可以确保警报视图不会阻止您的应用程序,即。在 onViewDidAppear.
例如:
-(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...
}
});
}];
}
}
这是我自己做的。我的应用程序也基于 Apple 示例代码并注意到,该示例也存在您描述的问题。
我正在开发一个 iOS 应用程序,我在其中使用了 Motion Activity 管理器(更详细地说 - 计步器)。当应用程序启动时,我需要检查用户是否允许 Motion Activity。我通过
来做到这一点_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 - is Motion Activity Enabled in Settings > Privacy > Motion Activity
据我了解,此代码将触发 "alert window" 要求用户 opt-in/out。
我的情况是,当我 运行 应用程序 第一次 (也就是所有警告都已重置)时,应用程序在 'BP1' 之前挂起(永远不会执行回调),然后如果我使用 xCode 停止应用程序或按主页按钮 "alert window" 出现。如果我选择加入,一切都很好,第二个 运行 '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); }); }];
这不会挂起应用程序,但 "alert window" 永远不会显示
- 我稍后在代码中执行了此 "checking snippet" - 但再次 - 应用程序挂起
本质上,当第一个视图出现时,首先可以确保警报视图不会阻止您的应用程序,即。在 onViewDidAppear.
例如:
-(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...
}
});
}];
}
}
这是我自己做的。我的应用程序也基于 Apple 示例代码并注意到,该示例也存在您描述的问题。