Flutter app tracking transparency dialog does not appear on ios

강정우·2023년 11월 15일
0

iOS

목록 보기
3/4

app tracking transparency dialog 안 보임

  • 이 이슈를 해결하기위해 매우 피똥쌌다.

  • 우선 {프로젝트}\ios\Podfile에 들어가면 최하단에

post_install do |installer|
  installer.pods_project.targets.each do |target|
    flutter_additional_ios_build_settings(target)
   end
 end
  • 위와같은 루비코드를 볼 수 있는데 여기에
target.build_configurations.each do |config|
  config.build_settings['GCC_PREPROCESSOR_DEFINITIONS'] ||= [
  '$(inherited)',
  'PERMISSION_APP_TRACKING_TRANSPARENCY=1',
]
end

위 코드를 추가해줘야한다.

  • 간단하게 해석하자면 이 코드는 iOS 앱의 Podfile에서 사용되는 부분으로 CocoaPods를 이용한 패키지 관리 시 Post-install 단계에서 특정 작업을 수행하는 루비 스크립트이다.

  • 참고로 CocoaPods는 iOS 개발에서 외부 라이브러리를 쉽게 관리하기 위한 도구로 Podfile은 이를 위한 설정 파일이다.

  • post_install 블록은 모든 패키지 설치가 끝난 후에 실행되는 스크립트를 담당한다.
    이제 각 줄을 한 번 살펴보자.

결과코드

post_install do |installer|
  installer.pods_project.targets.each do |target|
    flutter_additional_ios_build_settings(target)
    target.build_configurations.each do |config|
          config.build_settings['GCC_PREPROCESSOR_DEFINITIONS'] ||= [
          '$(inherited)',
          'PERMISSION_APP_TRACKING_TRANSPARENCY=1',
          ]
        end
  end
end
  1. post_install do |installer|: 모든 Pod 설치가 끝난 후에 실행할 작업을 정의한다.
    installer 객체는 설치된 패키지에 대한 정보를 가지고 있다.

  2. installer.pods_project.targets.each do |target|: 설치된 각 패키지에 대해서 반복한다.
    target은 각 패키지를 의미한다.

  3. target.build_configurations.each do |config|: 각 패키지의 빌드 설정에 대해서 반복한다.
    config은 빌드 설정을 의미한다.

  4. config.build_settings['GCC_PREPROCESSOR_DEFINITIONS'] ||= [: 빌드 설정 중에서 GCC_PREPROCESSOR_DEFINITIONS 항목을 찾아서 설정한다.
    이 항목은 빌드 시에 사용할 전처리기(Preprocessor) 정의를 설정하는 것으로 여기서는 기존 값이 있으면 그대로 사용하고 없으면 새로운 배열을 생성한다.

  5. '$(inherited)', 'PERMISSION_APP_TRACKING_TRANSPARENCY=1',: GCC_PREPROCESSOR_DEFINITIONS에 설정할 값이다.
    $(inherited)는 상위 설정을 상속받는 것을 의미하고 'PERMISSION_APP_TRACKING_TRANSPARENCY=1'는 PERMISSION_APP_TRACKING_TRANSPARENCY라는 이름의 전처리기 매크로를 정의하고 그 값을 1로 설정하는 것을 의미한다.

  • 즉, 위 코드는 모든 패키지의 모든 빌드 설정에 대해 PERMISSION_APP_TRACKING_TRANSPARENCY라는 전처리기 매크로를 정의하고 그 값을 1로 설정하는 작업을 수행함으로써 앱 내에서 App Tracking Transparency 권한을 사용하려는 경우 필요한 설정이다.

main 함수 설정

void main() async {
  // 비동기 작업 수행 시 플러터가 실행 전에 작업을 수행하는 엉망이 되는 현상을 막기위한 코드
  WidgetsFlutterBinding.ensureInitialized();
  // firebase 초기화
  await Firebase.initializeApp(options: DefaultFirebaseOptions.currentPlatform);
  // ios 14이후로 필수로 들어가야하는 AppTrackingTransparency permission req
  await AppTrackingTransparency.requestTrackingAuthorization();
  // 이때 보통 자동을 deny될 때가 많은데 이때 if문을 들어가서 
  if (await AppTrackingTransparency.trackingAuthorizationStatus ==
      TrackingStatus.notDetermined) {
    // 약 0.5초 이있다가
    await Future.delayed(const Duration(milliseconds: 500));
    // 다시 물어본다.
    await AppTrackingTransparency.requestTrackingAuthorization();
  }
  // 이건 토큰이 null일 때 그냥 getToken 함수실행하는거
  _token ??= await getToken();
  // 여긴 그냥 landscape mode 막는 부분
  await SystemChrome.setPreferredOrientations(
    [
      DeviceOrientation.portraitUp,
      DeviceOrientation.portraitDown,
    ],
  );
  // 위 설정 작업들이 완료될 대 앱을 실행.
  runApp(const MyApp());
}

reference

https://stackoverflow.com/questions/74615151/apptrackingtransparency-permission-dialog-doesnt-show-up

profile
智(지)! 德(덕)! 體(체)!

0개의 댓글