You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

React Native iOS端如何申请App Tracking Transparency权限?

React Native 中 ATTrackingManager 的替代封装方案

方案一:手写轻量原生模块(无依赖冲突,兼容Flipper)

自己封装ATTrackingManager的核心功能是最可靠的方式,完全规避第三方库带来的构建冲突问题,步骤如下:

1. iOS 原生模块实现

在你的React Native项目的iOS目录下,创建两个文件:ATTrackingManagerModule.h 和 ATTrackingManagerModule.m

ATTrackingManagerModule.h

#import <React/RCTBridgeModule.h>
#import <AppTrackingTransparency/AppTrackingTransparency.h>

@interface ATTrackingManagerModule : NSObject <RCTBridgeModule>
@end

ATTrackingManagerModule.m

#import "ATTrackingManagerModule.h"

@implementation ATTrackingManagerModule

// 注册模块
RCT_EXPORT_MODULE();

// 封装请求追踪授权的方法
RCT_EXPORT_METHOD(requestTrackingAuthorization:(RCTPromiseResolveBlock)resolve rejecter:(RCTPromiseRejectBlock)reject) {
  if (@available(iOS 14, *)) {
    [ATTrackingManager requestTrackingAuthorizationWithCompletionHandler:^(ATTrackingManagerAuthorizationStatus status) {
      resolve(@(status));
    }];
  } else {
    // iOS 13及以下系统默认允许追踪,直接返回对应状态
    resolve(@(ATTrackingManagerAuthorizationStatusAuthorized));
  }
}

// 封装获取当前授权状态的方法
RCT_EXPORT_METHOD(getTrackingAuthorizationStatus:(RCTPromiseResolveBlock)resolve rejecter:(RCTPromiseRejectBlock)reject) {
  if (@available(iOS 14, *)) {
    resolve(@(ATTrackingManager.trackingAuthorizationStatus));
  } else {
    resolve(@(ATTrackingManagerAuthorizationStatusAuthorized));
  }
}

@end

2. React Native JS 层封装

在项目的JS目录下创建ATTrackingManager.js:

import { NativeModules } from 'react-native';

const { ATTrackingManagerModule } = NativeModules;

// 请求追踪授权
export const requestTrackingAuthorization = async () => {
  try {
    const status = await ATTrackingManagerModule.requestTrackingAuthorization();
    return status;
  } catch (error) {
    console.error('请求追踪授权失败:', error);
    throw error;
  }
};

// 获取当前授权状态
export const getTrackingAuthorizationStatus = async () => {
  try {
    const status = await ATTrackingManagerModule.getTrackingAuthorizationStatus();
    return status;
  } catch (error) {
    console.error('获取授权状态失败:', error);
    throw error;
  }
};

// 对应iOS的授权状态枚举
export const TrackingAuthorizationStatus = {
  NotDetermined: 0,
  Restricted: 1,
  Denied: 2,
  Authorized: 3,
};

3. 配置Info.plist

在iOS项目的Info.plist中添加追踪权限描述,否则请求会被拒绝:

<key>NSUserTrackingUsageDescription</key>
<string>我们需要获取追踪权限以提供个性化内容</string>

4. 验证兼容性

这个手写模块完全遵循React Native的原生模块规范,不会出现Undefined symbols _RCTRegisterModule这类冲突,且和use_flipper!完全兼容,无需修改Podfile配置。

方案二:尝试替代第三方库

如果不想手写模块,可以尝试react-native-app-tracking-transparency(注意和你之前用的包名称不同),该库针对Flipper兼容性做了优化,建议先查看最新版本的issues确认是否存在类似问题。


内容的提问来源于stack exchange,提问作者Shep Sims

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.23 20:22:31