Old_SWIFT(221012)/라이브러리이야기

Firebase Remote Config , A/B Testing 다루기

KataRN 2022. 3. 26. 23:26
반응형

안녕하세요.

 

오늘은 Firebase Remote Config에 대해 알아보겠습니다.

 

Remote Config 기능이 몬데? 왜쓰는데?

-> 다시 게시할 필요 없이 업데이트 적용

-> 새로운 기능을 안심하고 출시

-> 다양한 잠재고객을 위한 앱 맞춤설정

-> 실험을 실행하여 아이디어 테스트

 

그럼 A/B 테스트는 몬데? 왜쓰는데?

-> 실험을 통한 스마트한 앱 성장

-> 다양한 업데이트 테스트를 위한 실험 맞춤설정

-> 확실하게
-> 변경사항 적용

-> 엔지니어링 시간 소모 없이 팀 역량 강화

 

 

일단 보통 앱을 새로 출시하게 되면 24~48시간이 걸립니다.

위의 방법을 이용하면 바로 적용이 가능하고 고객별로 원하는 기능을 제공할 수 도 있습니다.

그리고 고객분석도 가능하고... 위에 있는 그대로입니다ㅎㅎ...

그렇기 때문에 아주 주요한 기능이라고 할 수 있죠. 암요암요.

 

 

이제 기능을 알아봅시다.

 

사전작업 : 코코아팟을 이용하여 "pod 'Firebase/RemoteConfig'", "pod 'Firebase/Analytics'"를 설치

 

https://katarnios.tistory.com/23

 

CocoaPods(코코아팟) 사용법(쉬움주의, 따라만해), Charts라이브러리 설치

안녕하세요 KataRN입니다. 오늘은 코코아팟에 대해 알려드리려고 합니다. 우선 코코아팟이란? "CocoaPods는 Swift 및 Objective-C 코코아 프로젝트의 종속성 관리자입니다. 80,000 개가 넘는 라이브러리를

katarnios.tistory.com

 

간단한 설정부터 시작해보도록하죠.

Firebase의 기본설정이 되어있으신 분들은 "더보기"버튼을 누르지 마시고 진행하시면 됩니다.

Firebase가 처음이신 분들은 바로 아래 "더보기"버튼을 눌러주세요.

 

더보기

파이어베이스 홈페이지에 들어갑시다.(https://console.firebase.google.com/project/_/authentication/users)

그 뒤는 이미지로 알려드릴게요~

 

여길 보시면 다양한 기능들이 있습니다.

오늘은 인증만 다루지만 조만간 나머지도 올리겠습니다!!! 반드시!!

 

 

자 이제 인증하기위한 프로젝트 등록은 끝났습니다.

이제 iOS앱을 추가하겠습니다.

이건 iOS뿐만 아니라 안드로이드 등 다른 것들도 추가할 수 있다는 거죠ㅎㅎ

사진 재탕이라 하급 모자이크 양해바람ㅎㅎ..

 

초기화 코드는 아래에서 말씀드릴게요. 우선넘어가세요.

 

 

앱의 AppDelegate에 가서 초기화 코드를 넣어줍니다.

 

이제 기본적인 공지사항UI를 만들어주겠습니다.

XIB파일을 같이 만들어서 생성해주었습니다.

 

1. RemoteConfig

RemoteConfig부터 알아보겠습니다.

이제 Firebase의 RemoteConfig에 가서 Key:Value형식으로 설정해보겠습니다.

위 화면처럼 4개값을 만들어보겠습니다.

 

! 초안 이라고 되어있는데 상단에 게시하기 버튼을 누르면 됩니다.

 

이러면 아래처럼 변경됩니다.

이제 해당 내용을 fetch해주도록 앱에 적용해보겠습니다.

 

앱에 plist파일을 만들어줍시다.

Plist에 Dictionary형태로 4가지를 만들어줍니다.

이유는 Firebase에서 Dictionary로 만들어줬으니 똑같이 만들어주는겁니다.

앱에서 Firebase의 데이터를 여기로 가져오는겁니다.

그러니 형식이 같아야겠죠? Key : Value 타입 = Ditionary입니다.

그리고 위의 isHidden의 value값이 1인 것은 true값입니다. 변경하면 0이되겠죠?

 

 

아래는 실행시 첫 화면입니다.

주석으로 설명을 대신하였습니다.

import UIKit
import FirebaseRemoteConfig
import FirebaseAnalytics

class ViewController: UIViewController {
    var remoteConfig: RemoteConfig?
    override func viewDidLoad() {
        super.viewDidLoad()
        //초기화
        remoteConfig = RemoteConfig.remoteConfig()
        
        let setting = RemoteConfigSettings()
        //테스트를 위한 설정값을 불러오는 시간차(최소화 = 자주불러옴)
        setting.minimumFetchInterval = 0
            
        remoteConfig?.configSettings = setting
        remoteConfig?.setDefaults(fromPlist: "RemoteConfigDefaults")
    }
    
    override func viewDidAppear(_ animated: Bool) {
        super.viewDidAppear(animated)
        
        getNotice()
    }
}

//RemoteConfig
extension ViewController {
    func getNotice() {
        guard let remoteConfig = remoteConfig else { return }
        
        remoteConfig.fetch {[weak self] status, _ in
            if status == .success {
                remoteConfig.activate(completion: nil)
            } else {
                print("Config not fetched")
            }
            
            guard let self = self else { return }
            
            if !self.isNoticeHidden(remoteConfig) {
                let noticeVC = NoticeViewController(nibName: "NoticeViewController", bundle: nil)
                
                noticeVC.modalPresentationStyle = .custom
                noticeVC.modalTransitionStyle = .crossDissolve
                
                // \n은 줄바꿈이지만 fetch과정에서 \\n으로 들어옵니다. 그렇기 때문에 \n으로 변경해줘서 한줄띄어쓰기가 되도록 합니다.
                let title = (remoteConfig["title"].stringValue ?? "").replacingOccurrences(of: "\\n", with: "\n")
                let detail = (remoteConfig["detail"].stringValue ?? "").replacingOccurrences(of: "\\n", with: "\n")
                let date = (remoteConfig["date"].stringValue ?? "").replacingOccurrences(of: "\\n", with: "\n")
                
                noticeVC.noticeContents = (title: title, detail: detail, date: date)
                self.present(noticeVC, animated: true, completion: nil)
            }
        }
    }
    
    func isNoticeHidden(_ remoteConfig: RemoteConfig) -> Bool {
        return remoteConfig["isHidden"].boolValue
    }
}

 

현재 isHidden값이 true입니다.

당연히 공지사항이 안뜨고 빈화면이 실행되겠죠?

아래처럼 변경 후에 개시하기를 해보도록하죠.

 

그리고 앱을 실행하면~

아래처럼 공지사항이 뜹니다.

 

이렇게 앱을 손대지않고 Firebase를 통해서 앱에 변화를 주는것입니다.

같은 방식으로 공지사항의 제목이나 내용도 손쉽게 바꿀 수 있습니다.

 

2. A/B Testing

이번엔 A/B Test입니다.

이번에도 Firebase에 접속하셔서 아래 이미지를 따라해주세요.

노출 50%로 설정함으로써 이용자의 절반에게 이벤트가 노출됩니다.

 

 

이벤트를 새로 만들어준것입니다.

리스트에 없다고 당황하지마세요!

 

저희는 이벤트 참여 문구로 2가지를 설정해줄겁니다.

 

저희가 새로 추가한 message에 조건이 붙은게 보이시죠?

 

디버깅을 위해서 Scheme설정을 해줍니다.

(FIRDebugEnabled : 디버깅을 명시적으로 사용 중지할 때까지 기기가 디버그 모드로 유지됩니다.)

 

DebugView를 보시면 이벤트가 시작하는 시점 등을 관찰할 수 있습니다.

지금 사진은 앱을 실행하기 전 입니다.

 

그리고 앱을 실행해봅시다.

자 확인이 됩니다.

 

그런데 저희는 아마 2가지 조건을 설정했지만 1가지만 보게될것입니다.

왜냐하면 기기마다 랜덤으로 뿌리기때문에 같은 시뮬레이터(동일한 권한토큰)실행이기에 처음 정해진 조건으로 계속 노출 되는것입니다.

 

이번엔 다른 조건의 이벤트가 나오도록 한번 해보겠습니다.

FirebaseApp를 초기화했던 코드 아래에 이어서 권한 토큰을 콘솔에 찍히도록 해보겠습니다.

 

해당 토큰을 복사해주세요.

다시 Firebase로 가셔서 아래처럼 작업해주세요.

이전 변수는 기준으로 되어있었습니다.

이제 Variant A로 변경해줄게요.

 

그럼 결과는?

 

 

이렇게 2가지 변수 모두 기기에 나오도록 테스트해봤습니다.

 

오늘도 긴글 읽어주셔서 감사합니다.

반응형

'Old_SWIFT(221012) > 라이브러리이야기' 카테고리의 다른 글

Firebase Cloud Firestore Database  (2) 2022.03.24
Firebase Realtime Database 다루기  (0) 2022.03.23
Lottie 다루기  (0) 2022.03.22
Kingfisher 다루기  (0) 2022.03.22
Firebase Auth 다루기 (3/3) (Apple 로그인)  (0) 2022.03.21