이 이슈를 해결하기위해 매우 피똥쌌다.
우선 {프로젝트}\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
post_install do |installer|
: 모든 Pod 설치가 끝난 후에 실행할 작업을 정의한다.
installer 객체는 설치된 패키지에 대한 정보를 가지고 있다.
installer.pods_project.targets.each do |target|
: 설치된 각 패키지에 대해서 반복한다.
target은 각 패키지를 의미한다.
target.build_configurations.each do |config|
: 각 패키지의 빌드 설정에 대해서 반복한다.
config은 빌드 설정을 의미한다.
config.build_settings['GCC_PREPROCESSOR_DEFINITIONS'] ||= [
: 빌드 설정 중에서 GCC_PREPROCESSOR_DEFINITIONS
항목을 찾아서 설정한다.
이 항목은 빌드 시에 사용할 전처리기(Preprocessor) 정의를 설정하는 것으로 여기서는 기존 값이 있으면 그대로 사용하고 없으면 새로운 배열을 생성한다.
'$(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 권한을 사용하려는 경우 필요한 설정이다.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());
}