iOS - Активность движения включена в «Настройки» > «Конфиденциальность» > «Активность движения»

Если приложению требуется доступ к 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.
}

person NeilMortonNet    schedule 08.01.2014    source источник


Ответы (5)



У Apple есть пример проекта который показывает, как проверять и запрашивать доступ для всех различных разрешений (включая Motion Activity) здесь. Я предлагаю вам взглянуть на это быстро - это довольно просто.

person Doc    schedule 08.01.2014
comment
Привет. Я только что посмотрел на это, и он использует [CMMotionActivityManager isActivityAvailable]. Я только что попробовал это, и независимо от того, включен он в настройках или нет, он всегда возвращает TRUE! Очень странно, как говорится, если это возвращается, они заявляют НЕДОСТУПНО. Кажется, они не предлагают «Проверить», а только начальный вызов для включения. Но если он отключен, он не перезапрашивает! - person NeilMortonNet; 09.01.2014
comment
[CMMotionActivityManager isActivityAvailable] возвращает логическое значение, указывающее, поддерживает ли устройство данные о движении, а не дал ли пользователь разрешение приложению на их использование. Тем не менее, нет возможности повторно запросить разрешение. Вы можете только увидеть, есть ли у вас разрешение, а если нет, предупредить пользователя, чтобы он зашел в приложение «Настройки» и включил его самостоятельно. - person Doc; 09.01.2014
comment
Этот параметр можно найти в приложении «Настройки» в разделе «Конфиденциальность». Выберите разрешение, после чего вы сможете включить/отключить это разрешение для соответствующих приложений. - person Doc; 09.01.2014
comment
Согласен, но нет способа проверить, включен он или отключен. - person NeilMortonNet; 09.01.2014
comment
Возвращает ли какой-либо из вызовов функций действительные результаты? Нет? Предположительно он отключен (при условии, что isActivityAvailable возвращает true). Если я не ошибаюсь, это то, что делает пример проекта — запускает активность, пытается что-то сделать, проверяет, удалась ли попытка. - person Doc; 09.01.2014
comment
Кажется, образец просто пытается получить доступ и запросит доступ в первый раз. Он также выполняет проверку isActivityAvailable, но это не относится к настройке. Однако я обнаружил, что могу обнаружить ошибку и найти CMErrorMotionActivityNotAuthorized! Так что спасибо, что указали мне правильное направление. Я обновлю описание с подробностями. - person NeilMortonNet; 09.01.2014
comment
Смотрите ответ @Raymond ниже. Если вашему приложению необходимо знать, разрешил ли пользователь движение и фитнес без запроса истории активности, CMSensorRecorder.isAuthorizedForRecording() — ваш друг. - person Nick Kuh; 05.01.2017
comment
@MrNeilM, я считаю, что ваш комментарий о том, что нет способа проверить это, технически является ответом на ваш вопрос. Какой, фу :( - person Alex Hall; 29.06.2017
comment
Хотя эта ссылка может ответить на вопрос, лучше включить сюда основные части ответа и предоставить ссылку для справки. Ответы, содержащие только ссылки, могут стать недействительными, если связанная страница изменится. – Из обзора - person Tomerikoo; 17.12.2020

Новое в iOS 9, CMSensorRecorder(ссылка на документ) имеет метод класса для проверки авторизации вашего приложения для Motion & Fitness:

  • Свитфт class func isAuthorizedForRecording() -> Bool
  • Цель-c + (BOOL)isAuthorizedForRecording
person Raymond    schedule 11.10.2015
comment
Но это не указывает, было ли разрешено отслеживание движения и фитнеса пользователем. - person Nate; 25.10.2016
comment
Это отвечает на вопрос, как проверить, разрешено ли моему приложению доступ к данным Motion & Fitness? - который не задавался. Был задан вопрос, как проверить, включено ли отслеживание активности в настройках iOS для устройства (глобально). На момент написания этой статьи кажется правильным ответом, что нет способа сделать это, о чем говорит собственный комментарий автора сообщения. - person Alex Hall; 29.06.2017

Как насчет этого?

- (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;
    }
 }
person Zaraki    schedule 23.08.2019
comment
Конечно. Поскольку iOS 11+ (CMAuthorizationStatus)authorizationStatus; — это способ добиться этого. Однако до iOS 11 такой возможности не было. - person NeilMortonNet; 25.08.2019

Если вы специально ищете данные шагомера (шага), вам следует использовать функцию CMPedometer authorStatus(), которая доступна с iOS 11.

let authorizationStatus = CMPedometer.authorizationStatus()

Он вернет одно из 4 значений CMAuthorizationStatus:

  • notDetermined: пользователь не предоставил и не запретил доступ.
  • ограниченный: Доступ запрещен из-за общесистемных ограничений (например, в настройках конфиденциальности).
  • отказал: пользователь отказал в доступе к вашему приложению.
  • авторизован: у вас есть доступ к данным о движении и фитнесе.
person Mario Hendricks    schedule 10.04.2021