[swift] Swift Device의 앱 내 구매 및 프리미엄 기능

앱 개발을 진행하다보면 앱 내 구매 및 프리미엄 기능을 구현해야 할 때가 있습니다. 이번 포스트에서는 Swift를 사용하여 iOS 앱 내에서 구매 및 프리미엄 기능을 어떻게 구현하는지 알아보겠습니다.

1. 앱 내 구매 기능 구현하기

앱 내 구매 기능을 구현하기 위해서는 Apple의 In-App Purchase (IAP) 기능을 사용해야 합니다. IAP 기능을 사용하려면 다음과 같은 단계를 따라야 합니다.

1-1. IAP 등록하기

  1. Apple Developer 사이트에 로그인한 후, 앱을 등록합니다.
  2. 앱 등록 후, 앱 생성 페이지로 이동하여 “In-App Purchase” 항목을 선택합니다.
  3. 원하는 구매 상품을 생성한 후, 해당 상품들의 식별자를 기록해둡니다.

1-2. IAP 기능 구현하기

  1. Xcode에서 프로젝트를 열고, StoreKit 프레임워크를 추가합니다.
  2. IAP 기능을 사용할 ViewController에서 SKPaymentQueue 델리게이트로 등록합니다.
  3. IAP 상품들을 로드하고 구매 가능한 상품들을 화면에 표시합니다.
  4. 사용자가 상품을 선택하여 구매를 요청하면 SKPaymentQueue.default().add(payment) 메소드를 호출하여 결제 요청을 합니다.
  5. 결제 요청 결과는 SKPaymentTransactionObserver 델리게이트를 통해 받아 처리합니다.
import StoreKit

class PurchaseViewController: UIViewController, SKPaymentTransactionObserver {
    
    override func viewDidLoad() {
        super.viewDidLoad()
        
        // SKPaymentQueue의 옵저버로 등록
        SKPaymentQueue.default().add(self)
    }
    
    // IAP 상품 로드 및 구매 가능한 상품 표시 코드
    
    // 사용자가 상품을 선택하고 결제 요청
    func purchase(product: SKProduct) {
        let payment = SKPayment(product: product)
        SKPaymentQueue.default().add(payment)
    }
    
    // 결제 요청 결과 처리
    func paymentQueue(_ queue: SKPaymentQueue, updatedTransactions transactions: [SKPaymentTransaction]) {
        for transaction in transactions {
            switch transaction.transactionState {
            case .purchased:
                // 결제 완료 처리 코드
                break
            case .restored:
                // 이전에 구매한 상품 복원 처리 코드
                break
            case .failed:
                // 결제 실패 처리 코드
                break
            case .deferred, .purchasing:
                // 결제 진행 중이거나 결제가 보류 중인 경우
                break
            }
        }
    }
    
    // SKPaymentQueue의 옵저버 해제
    deinit {
        SKPaymentQueue.default().remove(self)
    }
}

위 코드는 IAP를 구현하는 간단한 예제입니다. 구매 가능한 상품들을 로드하고, 사용자가 선택한 상품을 결제 요청하여 결과를 처리하는 부분을 확인할 수 있습니다.

2. 프리미엄 기능 구현하기

프리미엄 기능을 구현하는 방법은 프로젝트의 요구사항에 따라 다를 수 있습니다. 하지만 대부분의 경우, 프리미엄 기능에 대한 정보와 사용자의 프리미엄 상태를 저장할 수 있는 서버가 필요합니다. 아래는 간단한 예제입니다.

class PremiumManager {
    
    static let shared = PremiumManager()
    
    private var isPremiumUser: Bool = false
    
    private init() {}
    
    func checkPremiumStatus(completion: @escaping (Bool) -> Void) {
        // 서버에 사용자의 프리미엄 상태 조회 요청
        APIClient.checkPremiumStatus { response in
            self.isPremiumUser = response.isPremium
            completion(self.isPremiumUser)
        }
    }
    
    func purchasePremium(completion: @escaping (Bool) -> Void) {
        // 결제 API 호출 및 프리미엄 상태 업데이트
        APIClient.purchasePremium { success in
            self.isPremiumUser = success
            completion(success)
        }
    }
    
    func getPremiumFeature() {
        if isPremiumUser {
            // 프리미엄 기능 활성화 코드
        } else {
            // 프리미엄 기능 비활성화 코드
        }
    }
}

// 사용 예시
PremiumManager.shared.checkPremiumStatus { isPremiumUser in
    if isPremiumUser {
        PremiumManager.shared.getPremiumFeature()
    } else {
        // 프리미엄 기능이 필요한 경우, 프리미엄 구매 페이지로 이동할 수 있는 UI를 표시하는 등의 처리
    }
}

위 코드는 PremiumManager 싱글턴 클래스를 사용하여 프리미엄 기능을 구현하는 예제입니다. checkPremiumStatus 메소드를 호출하여 서버에서 사용자의 프리미엄 상태를 조회하고, 그에 따라 프리미엄 기능을 활성화하거나 비활성화합니다. 또한 purchasePremium 메소드를 호출하여 프리미엄 상품을 구매하고, 프리미엄 상태를 업데이트합니다.

추가 참고 자료