[UIKit] BlogClone: RevenueCat 2

Junyoung Park·2022년 11월 24일
0

UIKit

목록 보기
104/142
post-thumbnail

Building Subscription Blogging App: Part 10 – Wrapping Up (2021, Xcode 12, Swift 5) – iOS

BlogClone: RevenueCat 2

구현 목표

  • 유저별 프리미엄 구독 상태 관리

구현 태스크

  • 유저의 uid를 유저 별 앱 아이디로 사용
  • 로그인, 로그아웃 상황 별로 Purchases API 호출
  • 해당 프리미엄 값을 통한 블로그 포스팅 확인 가능 체크

핵심 코드

func login(with appId: String, completion: @escaping(Bool) -> Void) {
        Purchases.shared.logIn(appId) { [weak self] info, created, error in
            guard
                let entitlements = info?.entitlements,
                let isEntitlementActive = entitlements.all["Premium"]?.isActive,
                error == nil else {
                print("Current user: \(appId): is Premium: false")
                self?.premium.send(false)
                completion(false)
                return
            }
            print("Current user: \(appId): is Premium: \(isEntitlementActive)")
            self?.premium.send(isEntitlementActive)
            completion(isEntitlementActive)
        }
    }
  • 특정 값을 토대로 유저 별 프리미엄 상태를 리턴받는 코드
  • 최초 상태라면 구독 정보가 없으므로 프리미엄이 아님을 확인 가능
func logout(completion: @escaping(Bool) -> Void) {
        Purchases.shared.logOut { [weak self] _ , error in
            guard
                error == nil else {
                completion(false)
                return
            }
            self?.premium.send(false)
            completion(true)
        }
    }
  • 현재 유저를 로그아웃하는 함수
  • 현재 앱 설정에서는 앱 서비스를 사용하기 위해서는 로그인이 필수이기 때문에 다른 유저의 로그인 이후 자동 스위칭이 되므로 실질적인 필요는 없는 함수
private func bind() {
        userSession
            .sink { [weak self] _ in
                self?.fetchUser()
            }
            .store(in: &cancellables)
        userSession.send(Auth.auth().currentUser)
        guard let uid = Auth.auth().currentUser?.uid else { return }
        IAPService.shared.login(with: uid) { _ in }
    }
  • 앱이 실행된 시점 AuthManager가 이니셜라이즈될 때 호출되는 코드
  • 현 시점의 유저 uid를 통해 구독 상황인지를 확인
func login(email: String, password: String) {
        Auth.auth().signIn(withEmail: email, password: password) { [weak self] result, error in
            guard
                let user = result?.user,
                error == nil else { return }
            self?.userSession.send(user)
            IAPService.shared.login(with: user.uid) { _ in }
            print("Firebase Login Did Succeed")
        }
    }
  • 로그인 실행 이후 자동으로 구독 상황인지를 받아오기 위해 현 시점의 uid를 통해 로그인 가능

구현 화면

  • 새롭게 가입한 유저는 프리미엄 유저가 아니므로 가용 횟수까지 볼 수 있은 뒤 자동으로 구독을 해야 볼 수 있도록 설정했는데, RevenueCat이 제공하는 대시 보드의 내용을 보면 과연 제대로 된 설정을 했는지 의문.

사실상 강의 영상과는 거의 다른 앱이 되어 버렸는데, 사실 더 재미있었기 때문에 대만족!

profile
JUST DO IT

0개의 댓글