(iOS) Firebase Remote Config , Realtime DataBase 적용

BK·2022년 3월 30일
0

ios

목록 보기
1/2

목적 : Firebase Remote Config와 Firebase Realtime Database를 이용해 보기

Firebase 에서는 앱 개발에 있어서 정말 유용한 기능들을 많이 제공하고 있습니다.
Firebase 문서 개요 이동

저는 이 중에서 실시간 데이터베이스(Real-time Database)나 원격 구성(Remote Config)를 이용하는 기능을 만들어보려고 합니다.
(기존 레퍼런스문서에서도 너무 잘 설명되어 있긴 하지만, 저는 cocoaPods를 이용하여 기존 프로젝트에도 쉽게 적용시키기 위한 내용으로 제공해보고자 합니다.)

1. Xcode Project 생성

Xcode를 켜고 Create new project > iOS app > 프로젝트명을 적어 프로젝트를 하나 생성합니다.
(기존 프로젝트에 적용하고 싶을 경우 별도로 프로젝트 생성은 할 필요가 없겠죠?)

2. Firebase Project 생성

크롬브라우저에서 Firebase 콘솔 화면을 열어 프로젝트를 하나 새로 만듭니다.
Firebase Console

1) firebase project name

프로젝트명을 넣어줍니다.

2) Analytics 설정

지금은 딱히 필요 없으니 설정을 안합니다.
(나중에 진짜 프로젝트를 만들 때는 도움이 많이 되니 필요하시면 미리 설정을 해놓으셔도 좋습니다.)

3. Firebase Project에 앱 등록

메인 화면에 있는 저 iOS버튼이나 프로젝트 설정에 가도 앱 등록이 하나도 안되어 있으면 저 버튼 모양으로 등록하라고 나옵니다. 버튼을 눌러서 등록을 시작합니다.

1) 앱 등록

아까 만들어둔 혹은 기존의 Xcode 프로젝트를 열어 bundle identifier를 복사/붙여넣기 합니다.
(선택사항은 굳이 작성하지 않아도 상관없습니다.)

테스트로 해보실 거면 크게 신경쓰지 않아도 되지만 이 번들 아이디는 한번 프로젝트에 설정되면 변경이 불가능 하니 신중하게 적어주시면 됩니다.

4. Xcode Project에 구성파일 설정

plist 파일을 다운로드 받아 앱 프로젝트에 추가해 줍니다.

파인더에서 한번 파일을 확인해 봅니다

해당 파일을 열어보면 파이어베이스 프로젝트에 대한 정보들이 들어가 있음을 확인할 수 있습니다. 이 정보들을 바탕으로 후에 SDK가 이식되었을 때 해당 프로젝트 정보를 식별하고 사용하게 해주는 설정정보 파일이라고 보면 됩니다.

자 이제 파인더에 있는 파일을 드래그하여 Xcode 프로젝트 내로 넣어줍니다.

파일은 참조방식이 아니라 파일 째로 넣어버려야 합니다.

5. Xcode Firebase SDK 설정

plist 설정이 끝난 후 다음을 눌러 보면 SDK 추가 방법에 대해 안내가 나옵니다.

저는 cocoaPods를 이용하여 SDK 설정을 해보겠습니다.

우선 켜져 있는 Xcode project를 닫아줍니다.

1) 터미널을 열어 해당 프로젝트로 이동합니다.

2) pod init 커맨드 실행 후 Podfile 생성 확인

pod init

열어보면 이렇게 기본 문구들로 나와있습니다.

3) Podfile 항목 추가

# Uncomment the next line to define a global platform for your project
# platform :ios, '9.0'

target 'fireTest' do
  # Comment the next line if you don't want to use dynamic frameworks
  use_frameworks!

  # Pods for fireTest
  pod 'Firebase/RemoteConfig'
  pod 'Firebase/Database'

  target 'fireTestTests' do
    inherit! :search_paths
    # Pods for testing
  end

  target 'fireTestUITests' do
    # Pods for testing
  end

end

중간에 firebase 관련 항목을 추가합니다.
(사용할 항목만 추가 나머지 필요없으면 주석처리)

  • Firebase/RemoteConfig : 원격 구성
  • Firebase/Database : 리얼타임데이터베이스

추후에 필요한 SDK들은 또 여기에 pods를 추가해서 내려받아주면 됩니다.

4) 터미널 명령 pod install

항목 추가 후 저장한 다음에 다시 터미널에서 pod install 을 명령줄에 입력합니다.

pod install


인스톨 완료후 파인더에서 보면 xcworkspace 항목이 생성된 걸 확인할 수 있습니다.

6. firebase 초기화 코드 구현

이제 프로젝트를 xcworkspace로 열어 줍니다.
(기존 xcode 프로젝트가 열려있는게 있으면 모두 닫고 xcworkspace로 열어줍니다.)

그리고 계속 작업중이던 firebase 크롬브라우저도 다음버튼을 눌러줍니다.

1) AppDelegate.m 코드 추가

이제 AppDelegate.m 에서 Firebase 를 임포트 시킨 후 FIRApp configure 도 추가해 줍니다.

#import "AppDelegate.h"

@import Firebase;

@interface AppDelegate ()

@end

@implementation AppDelegate


- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
    // Override point for customization after application launch.
    
    [FIRApp configure];
    
    return YES;
}

2) Firebase 설정 완료

7. Firebase Remote Config 시작하기

1) 웹 콘솔 Remote Config로 이동

2) key: value 데이터 저장

sample로 key에는 'name' value에는 'bk'를 넣었습니다. 후에 저장버튼 꾸욱

3) 변경사항 게시

config 값은 하단에서 변경을 해준 후에 꼭 상단에 변경사항 게시 버튼을 눌러줘야 적용이 됩니다.

4) viewController.m 코드 구현

viewDidLoad() 안에 아까 저장한 config 값을 불러오는 코드 입니다.

  • import FirebaseRemoteConfig
  • FIRRemoteConfig 객체 생성 및 interval 설정
  • default plist 설정
  • fetch 실행 및 핸들러 동작
#import "ViewController.h"

@import FirebaseRemoteConfig;

@interface ViewController ()

//@property (nonatomic, strong) FIRRemoteConfig *remoteConfig;

@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];

    FIRRemoteConfig *remoteConfig;
    
    // interval 설정
    remoteConfig = [FIRRemoteConfig remoteConfig];
    FIRRemoteConfigSettings *remoteConfigSettings = [[FIRRemoteConfigSettings alloc] init];
    remoteConfigSettings.minimumFetchInterval = 0;
    remoteConfig.configSettings = remoteConfigSettings;
    
    // 서버가 반응하지 않을 때 사용할 default plist 세팅
    //[remoteConfig setDefaultsFromPlistFileName:@"RemoteConfigDefaults"];

    // fetch 실행 후 핸들러 동작
    [remoteConfig fetchWithCompletionHandler:^(FIRRemoteConfigFetchStatus status, NSError *error) {
        if (status == FIRRemoteConfigFetchStatusSuccess) {
            NSLog(@"Config fetched!");
            [remoteConfig activateWithCompletion:^(BOOL changed, NSError * _Nullable error) {
                // ...
            }];
        } else {
            NSLog(@"Config not fetched");
            NSLog(@"Error %@", error.localizedDescription);
        }
        // 성공이든 실패든 config 값 확인
        NSLog(@"%@", remoteConfig[@"name"].stringValue);
    }];
}


@end

이 후 run 하면 정상적으로 log가 찍히는걸 확인하였습니다.

8. Firebase Realtime Database 시작하기

1) 웹 콘솔 Realtime Database로 이동

2) node 형식 데이터 저장

노드 방식으로 데이터를 저장 해봅니다. 가장 쉬운 예제로 아까 key에는 name, value에는 bk를 저장합니다.

3) 규칙 허용

(중요)데이터베이스를 읽고 쓰기 위해선 꼭 rules에 '.read','.write'가 허용이 되어있어야 합니다.
자세한 사항은 데이터베이스 규칙 참고

4) viewController.m 구현

아까 remote Config 구현했던 부분에 추가적으로 구현해봅니다.

  • import FirebaseDatabase
  • FIRDatabaseReference 객체 설정
  • child key를 가지고 데이터 읽어오기 (중간에 queryOrderedByKey 함수는 빼셔도 무방합니다)
#import "ViewController.h"

@import FirebaseRemoteConfig;
@import FirebaseDatabase;

@interface ViewController ()

//@property (nonatomic, strong) FIRRemoteConfig *remoteConfig;
//@property (strong, nonatomic) FIRDatabaseReference *ref;

@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];

//    [self remoteConfigTest];
    [self realtimeDatabaseTest];
}


// real time database test
- (void) realtimeDatabaseTest {
    FIRDatabaseReference *ref = [[FIRDatabase database] reference];
    [[[ref child:@"name"] queryOrderedByKey] getDataWithCompletionBlock:^(NSError * _Nullable error, FIRDataSnapshot * _Nonnull snapshot) {
        if (error) {
            NSLog(@"Received an error %@", error);
            return;
        } else {
            NSLog(@"name : %@", snapshot.value);
        }
    }];
}

// remote Config test
- (void) remoteConfigTest {
    FIRRemoteConfig *remoteConfig;
    
    // interval 설정
    remoteConfig = [FIRRemoteConfig remoteConfig];
    FIRRemoteConfigSettings *remoteConfigSettings = [[FIRRemoteConfigSettings alloc] init];
    remoteConfigSettings.minimumFetchInterval = 0;
    remoteConfig.configSettings = remoteConfigSettings;
    
    // 서버가 반응하지 않을 때 사용할 default plist 세팅
    //[remoteConfig setDefaultsFromPlistFileName:@"RemoteConfigDefaults"];

    // fetch 실행 후 핸들러 동작
    [remoteConfig fetchWithCompletionHandler:^(FIRRemoteConfigFetchStatus status, NSError *error) {
        if (status == FIRRemoteConfigFetchStatusSuccess) {
            NSLog(@"Config fetched!");
            [remoteConfig activateWithCompletion:^(BOOL changed, NSError * _Nullable error) {
                // ...
            }];
        } else {
            NSLog(@"Config not fetched");
            NSLog(@"Error %@", error.localizedDescription);
        }
        // 성공이든 실패든 config 값 확인
        NSLog(@"%@", remoteConfig[@"name"].stringValue);
    }];
}

@end

역시 정상적으로 log가 찍히는 걸 확인 할 수 있습니다.

저는 이 두가지 중에 한 가지를 가지고 버전체크하는 기능을 만드려고 합니다.
두가지 다 원래 주로 사용하는 목적이 있으므로 레퍼런스 문서를 잘 참고 하여 사용사례나 어떤 목적으로 활용하면 좋을지 생각하는 게 도움이 많이 될 것입니다.

이상입니다!

profile
k-힙합을 사랑하는 개발자

0개의 댓글