【问题标题】:iOS - is Motion Activity Enabled in Settings > Privacy > Motion ActivityiOS - 在设置 > 隐私 > 运动活动中启用运动活动
【发布时间】:2014-01-27 03:55:57
【问题描述】:

如果应用需要访问Motion Activity 数据,它会在安装时询问用户。但是,如果用户不小心回答“否”,则应用程序将无法运行。

我正在寻找一种方法来检查 Motion Activity 是否已启用,以便在未启用时提示用户启用。

有人能指点我正确的方向吗?


根据 Doc 提供的信息(谢谢),Apple 似乎没有提供直接方法来检查隐私中 Motion Activity 的状态。我能够通过发现错误来找出答案:-

[stepCounter queryStepCountStartingFrom:[NSDate date]
                                     to:[NSDate date]
                                toQueue:[NSOperationQueue mainQueue]
                            withHandler:^(NSInteger numberOfSteps, NSError *error) {
                                if (error != nil && error.code == CMErrorMotionActivityNotAuthorized) {
                                    // The app isn't authorized to use motion activity support.
}

【问题讨论】:

    标签: ios core-motion


    【解决方案1】:

    如果您是专门寻找计步器(步数)数据,您应该使用 CMPedometer authorizationStatus() 函数,该函数从 iOS 11 开始可用。

    let authorizationStatus = CMPedometer.authorizationStatus()
    

    它将返回 4 个 CMAuthorizationStatus 值之一:

    • notDetermined:用户既没有授予也没有拒绝访问。
    • restricted:由于系统范围的限制(例如隐私设置),访问被拒绝。
    • denied:用户拒绝访问您的应用程序。
    • 已授权:您有权访问运动和健身数据。

    【讨论】:

      【解决方案2】:

      这个怎么样?

      - (void)checkMotionAuth {
          switch ([CMMotionActivityManager authorizationStatus])
          {
              case CMAuthorizationStatusNotDetermined:
              {
                  CMMotionActivityManager *manager = [[CMMotionActivityManager alloc]init];
                  [manager queryActivityStartingFromDate:[NSDate date]
                                                  toDate:[NSDate date]
                                                 toQueue:[NSOperationQueue mainQueue]
                                             withHandler:^(NSArray<CMMotionActivity *> * _Nullable activities, NSError * _Nullable error) {
      
                                                 if ([CMMotionActivityManager authorizationStatus] == CMAuthorizationStatusAuthorized)
                                                 {
                                                     NSLog(@"Authorized");
                                                 }
                                                 else
                                                 {
                                                     NSLog(@"Denied");
                                                 }
                                             }];
              }
                  break;
              case CMAuthorizationStatusRestricted:
              case CMAuthorizationStatusDenied:
              {
                  NSLog(@"Denied/Restricted");
              }
                  break;
              case CMAuthorizationStatusAuthorized:
              {
                  NSLog(@"Authorized");
              }
              default:
                  break;
          }
       }
      

      【讨论】:

      • 确实如此。由于 iOS 11+ (CMAuthorizationStatus)authorizationStatus; 是实现此目的的方法。但是,在 iOS 11 之前,无法做到这一点。
      【解决方案3】:

      在 iOS 11 中新增,CMSSensorRecorder 有一个名为 authorizationStatus 的静态方法来检索它。

      + (CMAuthorizationStatus)authorizationStatus;

      【讨论】:

      • 您也可以调用 CMMotionActivityManager.authorizationStatus() 来获取活动管理器本身的状态。
      • iOS 11,好的,但是 iOS 11 之前的版本呢,例如 iOS 10?只是尝试查询一些数据并假设如果它不起作用则该应用程序未授权有点生硬,不是吗?
      • 从 iOS 11 开始,这是实现此目的的方法。在 iOS 11 之前,无法对此进行检查。标记为正确答案,谢谢@Billy。
      【解决方案4】:

      iOS 9 中的新功能,CMSensorRecorder(doc link) 有一个类方法来检查您的应用程序是否被授权用于 Motion & Fitness:

      • 斯威夫特class func isAuthorizedForRecording() -&gt; Bool
      • 目标-c + (BOOL)isAuthorizedForRecording

      【讨论】:

      • 但是,这并不表示用户是否启用了运动和健身追踪权限。
      • 这回答了“我如何检查我的应用程序是否有权访问运动和健身数据?--”这个没有被问到的问题。所问的是如何检查是否在设备的 iOS 设置中启用了运动活动跟踪(全局)。在撰写本文时,似乎正确的答案是“没有提供的方法可以做到这一点”,这是帖子作者自己的评论。
      【解决方案5】:

      Apple 有一个sample project,它展示了如何检查和请求访问所有各种权限(包括运动活动)here。我建议您快速查看一下 - 它非常简单。

      【讨论】:

      • 嗨 - 我刚刚看了这个,它使用 [CMMotionActivityManager isActivityAvailable]。我刚刚试过这个,不管在设置中是否启用,它总是返回TRUE!很奇怪,正如他们所说,如果返回,他们会声明 UNAVILABLE。他们似乎没有提供“检查”,而只是最初的启用电话。但如果它被禁用,它不会重新请求!
      • [CMMotionActivityManager isActivityAvailable] 返回设备是否支持运动数据的布尔值,而不是用户是否已授予应用程序使用权限的布尔值。也就是说,没有办法重新请求许可。您只能查看您是否有权限,如果没有,请提醒用户进入“设置”应用并自行启用。
      • 该设置可以在“隐私”部分下的“设置”应用中找到。选择权限,然后您可以为相应的应用启用/禁用该权限。
      • 同意,但没有办法检查它是“启用”还是“禁用”。
      • 是否有任何函数调用返回有效结果?不?它可能已禁用(假设 isActivityAvailable 返回 true)。如果我没记错的话,这就是示例项目所做的 - 启动活动,尝试某事,检查尝试是否成功。
      猜你喜欢
      • 2013-12-21
      • 2012-07-11
      • 2012-05-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-02-18
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多