Можем ли мы проверить, включен ли переключатель «Разрешить приложениям запрашивать отслеживание»?

В iOS 14 у нас есть новая функция для отслеживания IDFA. Он используется по умолчанию и доступен только в iOS 14. («Настройки» > «Конфиденциальность» > «Отслеживание» > «Разрешить приложениям запрашивать отслеживание»). Я хочу проверить, включен или выключен переключатель Разрешить приложениям запрашивать отслеживание, используя target-C. Как мне это сделать?введите здесь описание изображения


person Phạm Ân    schedule 29.01.2021    source источник


Ответы (2)


Обратите внимание, что мы можем получить доступ к статусу авторизации только для наших собственных приложений, используя ATTrackingManager API. Мы не можем прочитать глобальные настройки с помощью какого-либо общедоступного API.

Вы можете проверить статус своего приложения, проверив значение [ATTrackingManager trackingAuthorizationStatus]:

ATTrackingManagerAuthorizationStatus status = [ATTrackingManager trackingAuthorizationStatus];
switch (status) {
    case ATTrackingManagerAuthorizationStatusNotDetermined:
        // The user has not yet received an authorization request to authorize access to app-related data that can be used for tracking the user or the device.
        break;
    case ATTrackingManagerAuthorizationStatusAuthorized:
        // The user authorizes access to app-related data that can be used for tracking the user or the device.
        break;
    case ATTrackingManagerAuthorizationStatusDenied:
        // The user denies authorization to access app-related data that can be used for tracking the user or the device.
        break;
    case ATTrackingManagerAuthorizationStatusRestricted:
        // The authorization to access app-related data that can be used for tracking the user or the device is restricted.
        break;
}

Вы также можете прочитать этот же статус после того, как запросите авторизацию у пользователя:

[ATTrackingManager requestTrackingAuthorizationWithCompletionHandler:^(ATTrackingManagerAuthorizationStatus status) {
    // Check for status after request
}];

Также обратите внимание, что мы можем запросить авторизацию только один раз. Не рекомендуется постоянно спрашивать пользователя о запросе.
Но если это действительно необходимо для вашего приложения, решение для этого будет состоять в том, чтобы направить пользователя в Настройки и указать ему включить авторизацию для приложения:

- (void)viewDidAppear:(BOOL)animated {
    [super viewDidAppear:animated];
    
    [self checkTrackingAuthorization:ATTrackingManager.trackingAuthorizationStatus];
}

- (void)checkTrackingAuthorization:(ATTrackingManagerAuthorizationStatus) status {
    switch (status) {
        case ATTrackingManagerAuthorizationStatusAuthorized:
            // The user authorizes access to app-related data that can be used for tracking the user or the device.
            break;
        case ATTrackingManagerAuthorizationStatusNotDetermined:
            // The user has not yet received an authorization request to authorize access to app-related data that can be used for tracking the user or the device.
            [self requestTrackingAccess];
            break;
        case ATTrackingManagerAuthorizationStatusDenied:
            // The user denies authorization to access app-related data that can be used for tracking the user or the device.
        case ATTrackingManagerAuthorizationStatusRestricted:
            // The authorization to access app-related data that can be used for tracking the user or the device is restricted.
            [self displayTrackingAccessAlert];
            break;
    }
}

- (void)requestTrackingAccess {
    [ATTrackingManager requestTrackingAuthorizationWithCompletionHandler:^(ATTrackingManagerAuthorizationStatus status) {
        [self checkTrackingAuthorization:status];
    }];
}

- (void)displayTrackingAccessAlert {
    UIAlertController *alert = [UIAlertController alertControllerWithTitle:@"Tracking access is required" message:@"Please turn on access to tracking on the settings" preferredStyle:UIAlertControllerStyleAlert];
    UIAlertAction *settingsAction = [UIAlertAction actionWithTitle:@"Settings" style:UIAlertActionStyleDefault handler:^(UIAlertAction * _Nonnull action) {
        // Open the Settings app
        [[UIApplication sharedApplication] openURL:[NSURL URLWithString:UIApplicationOpenSettingsURLString] options:@{} completionHandler:nil];
    }];
    UIAlertAction *cancelAction = [UIAlertAction actionWithTitle:@"Cancel" style:UIAlertActionStyleDefault handler:nil];
    
    [alert addAction:settingsAction];
    [alert addAction:cancelAction];
    [alert setPreferredAction:settingsAction];
    
    UIWindow *alertWindow = [[UIWindow alloc] initWithFrame:[UIScreen mainScreen].bounds];
    alertWindow.rootViewController = [[UIViewController alloc] init];
    alertWindow.windowLevel = UIWindowLevelAlert + 1;
    [alertWindow makeKeyAndVisible];
    [alertWindow.rootViewController presentViewController:alert animated:YES completion:nil];
}
person Jobert    schedule 29.01.2021
comment
когда срабатывает ATTrackingManagerAuthorizationStatusRestricted? Я отключаю Разрешить приложениям запрашивать отслеживание, и он немедленно переключает ATTrackingManagerAuthorizationStatusDenied. - person Phạm Ân; 03.02.2021
comment
@PhạmÂn Ограниченный статус распространяется на устройства, находящиеся под управлением (MDM). - person Jobert; 03.02.2021

Вам нужно будет отслеживать, запрашивало ли ваше приложение разрешение на отслеживание (скажем, сохраните bool в NSUserDefaults.

Затем вы можете проверить [ATTrackingManager trackingAuthorizationStatus]. Если статус равен ATTrackingManagerAuthorizationStatusDenied, но вы никогда не запрашивали разрешение на отслеживание (и, следовательно, пользователь не может явно отказать вашему приложению в разрешении на отслеживание), вы знаете, что переключатель Разрешить приложениям запрашивать отслеживание отключен.

После того, как вы запросили разрешение, вы больше не можете определить, выключен ли переключатель или пользователь только что явно запретил отслеживание вашего приложения. В любом случае вы мало что можете сделать, и постоянное приставание пользователя к включению отслеживания не вызовет у него симпатии к вашему приложению.

person Paulw11    schedule 29.01.2021