iOS 구독 모델 구현: StoreKit을 이용한 반복 결제 시스템 설계 및 관리

작성일 :

iOS 구독 모델 구현: StoreKit을 이용한 반복 결제 시스템 설계 및 관리

애플리케이션 개발자에게 구독 모델은 안정적인 수익 모델을 제공합니다. Apple의 StoreKit 프레임워크는 iOS 앱에서 인앱 구독을 손쉽게 관리하고 반복 결제를 처리할 수 있도록 해줍니다. 이 문서에서는 iOS 애플리케이션에 StoreKit을 사용하여 구독 모델을 구현하는 방법을 단계별로 설명합니다.

준비 작업

Apple Developer 계정 설정

먼저 구독 모델을 구현하려면 Apple Developer 계정이 필요합니다. Apple Developer 계정으로 로그인한 후 App Store Connect에서 새로운 애플리케이션을 생성하거나 기존의 애플리케이션에 인앱 구독 상품을 추가합니다.

  1. App Store Connect에 로그인합니다.
  2. My Apps로 이동하여 새로운 앱을 생성하거나 기존 앱을 선택합니다.
  3. Features 탭에서 In-App Purchases를 선택합니다.
  4. + 버튼을 클릭하여 새로운 인앱 구매 항목을 추가합니다.
  5. Subscription 유형을 선택하고 필요한 정보를 입력합니다.

이 과정에서 구독 항목의 이름, 설명, 가격 및 결제 주기를 설정할 수 있습니다. 항목을 입력한 후 검토 및 승인을 기다립니다.

Xcode 프로젝트 설정

앱 내부에서는 Xcode를 사용하여 StoreKit 프레임워크를 설정해야 합니다. StoreKit은 기본적으로 iOS 프로젝트에 포함되어 있으므로 별도의 설치는 필요하지 않습니다.

swift
import StoreKit

위의 코드를 프로젝트의 적절한 위치에 추가하여 StoreKit을 가져옵니다.

StoreKit 초기화 및 제품 식별자 설정

사용자가 구독을 시작할 수 있도록 코드에서 StoreKit을 초기화하고 제품 식별자를 설정해야 합니다. 다음은 이를 위한 샘플 코드입니다.

swift
class SubscriptionManager: NSObject, SKProductsRequestDelegate, SKPaymentTransactionObserver {
    static let shared = SubscriptionManager()
    let productIdentifiers: Set<String> = ["com.yourapp.subscription.monthly"]
    var products = [SKProduct]()

    func requestProducts() {
        let request = SKProductsRequest(productIdentifiers: productIdentifiers)
        request.delegate = self
        request.start()
    }

    func productsRequest(_ request: SKProductsRequest, didReceive response: SKProductsResponse) {
        products = response.products
        // 제품 리스트 업데이트 로직
    }
}

구독 구매 및 상태 관리

사용자가 구독을 구매할 수 있도록 프로세스를 설정해야 합니다. 이는 크게 세 단계로 나눌 수 있습니다: 구독 상품 표시, 구매 트랜잭션 처리, 구독 상태 갱신.

구독 상품 표시

앱 내에서 구독 상품을 사용자에게 보여주는 UI를 구현합니다. 예를 들어, 스토어 화면이나 구독 전용 페이지에 구독 옵션을 나열할 수 있습니다.

swift
func displayProducts() {
    // 상품을 표시하는 UI 업데이트 로직
    for product in products {
        print("Product: \(product.localizedTitle) - Price: \(product.priceLocale.currencySymbol ?? "")\(product.price)")
    }
}

구매 트랜잭션 처리

사용자가 구독 상품을 선택하면 결제 프로세스를 시작하여 트랜잭션을 처리합니다.

swift
func purchase(product: SKProduct) {
    if SKPaymentQueue.canMakePayments() {
        let payment = SKPayment(product: product)
        SKPaymentQueue.default().add(payment)
    } else {
        print("In-app purchases are not allowed")
    }
}

트랜잭션 업데이트 처리

결제 트랜잭션을 처리하고 상태를 관리하기 위해 SKPaymentTransactionObserver를 구현합니다.

swift
func paymentQueue(_ queue: SKPaymentQueue, updatedTransactions transactions: [SKPaymentTransaction]) {
    for transaction in transactions {
        switch transaction.transactionState {
        case .purchased:
            // 구독 활성화 로직
            SKPaymentQueue.default().finishTransaction(transaction)
        case .failed:
            // 에러 처리 로직
            SKPaymentQueue.default().finishTransaction(transaction)
        case .restored:
            // 구독 복원 로직
            SKPaymentQueue.default().finishTransaction(transaction)
        default:
            break
        }
    }
}

결제 영수증 검증 및 구독 상태 확인

구독 상태를 정확히 관리하려면 결제 영수증을 검증하고 사용자의 구독 상태를 주기적으로 확인해야 합니다. 이는 보안상의 이유로 백엔드 서버에서 처리하는 것이 가장 좋습니다. 백엔드 서버는 Apple의 영수증 검증 API를 이용해 사용자의 구독 상태를 검증할 수 있습니다.

swift
func verifyReceipt() {
    // 백엔드 서버로 영수증 데이터 전송 및 검증 로직
}

구독 관리 및 갱신

사용자는 언제든지 자신의 구독을 관리하고 갱신할 수 있어야 합니다. 이를 위해 앱 내에서 사용자에게 구독 상태를 표시하고, 필요시 갱신 또는 해지할 수 있는 기능을 제공해야 합니다.

swift
func manageSubscriptions() {
    if let url = URL(string: "https://apps.apple.com/account/subscriptions") {
        UIApplication.shared.open(url)
    }
}

마무리

iOS 앱에서 StoreKit을 이용해 구독 모델을 구현하는 것은 복잡하지만, 위에서 설명한 단계를 따르면 사용자에게 원활한 구독 경험을 제공할 수 있습니다. 올바르게 설계된 구독 모델은 애플리케이션의 수익성을 높이고 사용자 유지율을 향상시킬 수 있습니다.