SNS 로그인 연동과 firebase notication 설정을 다루면서 AppDelegate.mm 를 만져야하는 상황이 있었다. SceneDelegate와 나란히 봤던 파일명이라 어렵게 생각하지않고 열였는데,코드의 형태가 생소했다. 찾아보니 Objective-C 코드였다.
프로젝트 진행상 내가 사용하고자 하는 라이브러리의 셋팅을 위해서는 AppDelegate.mm의 변경이 필요했다. 낯선 파일을 다루는 일임에도 불구하고, Docs 설명이 충분하지 않다 .코드를 추가하라는 말은 있지만, 어디에 넣어야한다는 말이없고 .. 이쯤인가 하고 코드를 넣으면 $pod install이 안되고, 그럼 결국 iOS 빌드가 안된다.
그 에러를 해결하기위해서 여기저기서 제안하는 코드를 가지고 오니, 전체 코드가 어떻게 변해가는건지 알수 없게 되버렸다. 그래서 알아야겠다고 생각했다.. AppDelegate 라는 녀석을 ..
이 글을 시작하는 내가 AppDelegate.mm 에 대해서 아는건 아래와 같다.
아, 그래서 didFinishLaunchingWithOptions 키워드가 있었구나
@implementation, @interface, #import와 같은 구문을 사용하는게 Objective-C의 특징이라고 한다. 그리고 파일 확장자가 .mm 인 경우는 Objective-C++를 사용해 C++ 코드를 포함할 수 있다는 것을 의미한다
(해석이 안되는 이유가 있었....)
#import "AppDelegate.h"
#import <Firebase.h>
#import <React/RCTBundleURLProvider.h>
임포트 구문 - 형태가 생소하다. .
①"" 와 <> 의 차이
""- 현재 프로젝트의 디렉토리에 있는 파일을 불러오는 경우에 사용
<>- 외부 라이브러리나 프레임워크를 불러올때 사용
@implementation AppDelegate // AppDelegate class 구문을 시작하는 키워드
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
//didFinishLaunchingWithOptions 은 앱이 처음 실행될때 호출됨
{
[FIRApp configure];
self.moduleName = @"dream_appeal_app";//초기 설정
self.initialProps = @{}; //초기 설정
[super application:application didFinishLaunchingWithOptions:launchOptions];
return YES;
}
상위 클래스의 동일한 메서드를 호출한다는 의미
Yes가 반환되면 초기화를 성공했음을 전달한다고 한다.
② 그럼 No를 반환하면 어떤의미가 되는걸까
초기화에 성공하지 못했다는 의미가 됨.
return 에 ture/false를 사용하듯
yes = true / No = false 의미로 사용된다.
즉 앱의 초기화 과정에서 성공 여부를 return 으로 넘기는 곳
- (NSURL *)sourceURLForBridge:(RCTBridge *)bridge //RN에서 사용할 번들 URL을 반환
{
return [self getBundleURL]; //self getBundleURL을 return하므로, 실제 URL을 가져옴
}
- (NSURL *)getBundleURL // app의 디버그 모드에 따라 BundleURL을 switch 하는 구문
{
#if DEBUG // 디버그 모드에서는 index.js를 사용
return [[RCTBundleURLProvider sharedSettings] jsBundleURLForBundleRoot:@"index"];
#else //릴리즈 모드에서는 main.jsbundle
return [[NSBundle mainBundle] URLForResource:@"main" withExtension:@"jsbundle"];
#endif
}
@end // 를 끝으로 클래스의 구현 완료
③ end 밖에 쓴 코드 어떻게 되는걸까?
return 아래 쓴 코드처럼 클래스 메서드 내의 코드처럼 동작하지 않음
small Q&A 형태로 AppDelegate의 Objective-C 코드를 간략하게 훑어봤다. 생소하게만 생각했던것들을 내가 사용하는 코드와 비교하면서 해석해보니 조금은 친근해진 느낌이다. 혹시라도 또 Objective-C를 마주하게 된다면 그때는 조금 덜 두려워 할수 있었으면 좋겠다.
저도 언젠가 옵젝씨 코드를 봐야하는 상황이 생길 수 있을테니...
겁먹지 않을 준비를 미리 미리 해두는 것이 좋겠네요..ㅜ
좋은 글 잘 봤습니다 🐯