首页 > 解决方案 > 我们可以检查允许应用程序请求跟踪切换是否打开

问题描述

在 iOS 14 中,我们有一个新功能来跟踪 IDFA。这是默认设置,仅在 iOS 14 中可用。(设置 > 隐私 > 跟踪 > 允许应用请求跟踪)。我想使用 Objective-C 检查允许应用程序请求跟踪切换是打开还是关闭。我怎样才能做到这一点?在此处输入图像描述

标签: iosobjective-cios14idfaapptrackingtransparency

解决方案


请注意,我们只能使用ATTrackingManagerAPI 访问我们自己的应用程序的授权状态。我们无法使用任何公共 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];
}

推荐阅读