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
相关产品推荐
相关产品推荐

