[RN/iOS] 리젝 리포트 – App Tracking Transparency 팝업 필요

10:55 pm

이슈

App Tracking Transparency 권한 요청 팝업이 존재하지 않음.

발견하지 못한 이유

앱스토어 정보에 따라서 해당 권한 요청 팝업이 필요한지 모르고 있었음.

원인

앱스토어 정보에는 추적 데이터를 사용한다고 나와있으나, App Tracking Transparency 권한 요청 팝업이 존재하지 않음.

처리

1) 권한 요청 및 플래그 업데이트

const requestAppTrackingPermission = async () => {
    if (Platform.OS === 'ios') {
      const permissionStatus = await request(
        PERMISSIONS.IOS.APP_TRACKING_TRANSPARENCY,
      );
      if (permissionStatus === RESULTS.GRANTED) {
        console.log('App Tracking Transparency permission granted');
        admob()
          .setRequestConfiguration({
            maxAdContentRating: MaxAdContentRating.PG,
            tagForChildDirectedTreatment: true,
            tagForUnderAgeOfConsent: true,
          })
          .then(() => {
            console.log('AdMob initialized');
            mmkv.setATT(true);
          })
          .catch(error => {
            console.error('AdMob initialization failed', error);
          });
      } else {
        console.log('App Tracking Transparency permission denied');
        mmkv.setATT(false);
      }
    }
  };

2) Admob 컴포넌트에 개인화 옵션과 플래그 연결

import mmkv from '@/controllers/mmkv';
import {isTester} from '@/stores/auth.store';
import React from 'react';
import {Platform, StyleSheet, View} from 'react-native';
import {BannerAd, BannerAdSize, TestIds} from 'react-native-google-mobile-ads';

const unitID =
  Platform.select({
    ios: '...',
    android: '...',
  }) ?? '';

const adUnitId = __DEV__ ? TestIds.BANNER : unitID;

interface AdmobProps {
  type: string;
}

const Admob = ({type}: AdmobProps) => {
  const grantedATT = mmkv.getATT();
  if (isTester(mmkv.getUser()?.email || '')) {
    return <></>;
  }
  return (
    <View style={[styles.admob]}>
      <BannerAd
        unitId={adUnitId}
        size={type}
        requestOptions={{
          requestNonPersonalizedAdsOnly: grantedATT,
        }}
      />
    </View>
  );
};
const styles = StyleSheet.create({
  admob: {
    flexDirection: 'row',
    justifyContent: 'center',
    alignItems: 'center',
  },
});
export default Admob;

리포트