관리 메뉴

김종권의 iOS 앱 개발 알아가기

[iOS - Swift] 1. 인앱 결제 StoreKit 개념 - Product 정의, 획득 (SKProduct, SKProductsRequest, SKProductsRequestDelegate) 본문

iOS 응용 (swift)

[iOS - Swift] 1. 인앱 결제 StoreKit 개념 - Product 정의, 획득 (SKProduct, SKProductsRequest, SKProductsRequestDelegate)

jake-kim 2022. 11. 15. 22:58

* 인앱 결제 포스팅 글 목차

Product 종류

  • App Store Connect에서 상품을 총 4가지 종류로 등록
    • consumable (소모성 - 100 코인…)
    • non-consumable (영구 누적 - 카메라 필터…)
    • auto-renewable subscription (기간이 정해져있고 자동 결제 구독 - 유튜프 프리미엄…)
    • non-renewing subscription (자동 결제 구독 x)

Product 정보 생성부터 획득까지

  • App Store Connect에서 새로운 IAP 상품 생성 시, ProductID가 생성
  • (이를 벡엔드에 저장 or 앱 번들에 저장 or 개발 측에서 앱 내 상품 목록을 관리)
  • 앱에서는 백엔드에 저장된 ProductID들을 get으로 획득
  • ProductID를 가지고 StoreKit으로 상품 정보 획득(가격, 상품 이름)

(앱에서 상품 목록을 모두 가져오는 방법은 없어서 일일이 productID를 어딘가 저장하고 있어야함)

productID 저장 - 로컬 vs 서버

  • plist 파일에 저장하는 경우
    • 앱 내 IAP 상품들의 갯수가 한정적이고 정적인 경우(광고 제거, 기능 잠금 해제)
    • 유저가 새로운 IAP 상품을 사용하려면 앱을 업데이트 해야하는 경우
    • 앱 / 상품이 서버를 필요로 하지 않는 경우
  • 나머지는 모두 서버에 저장

앱스토어 쿼리 방법 (SKProductsRequest, SKProductsRequestDelegate)

  • SKProductsRequest 생성하여 요청
    • 이것을 통해 요청하면 현지화된 정보로 내려줌
    • 요청이 완료되기 전에 메모리에서 해제되지 않기 위해 strong reference 사용
var request: SKProductsRequest! // Strong Reference

func request(ids: [String]) {
	let ids = Set(ids)
	request = SKProductsRequest(productIdentifieres: ids)
	request.delegate = self // SKProductsRequestDelegate 준수
	request.start()
}
  • request를 하면 당연히 response도 있으므로, delegate를 통해 받음
    • SKProductsRequestDelegate 준수
    • productsRequest(_:didRecieve:)
// SKProductsRequestDelegate
func productRequest(
	_ request: SKProductsRequest,
 didReceive response: SKProductsResponse
) {
	if !response.products.isEmpty {
		products = response.products
		// display products on UI
	}
	
	for invalidId in response.invalidProductIdentifiers {
		// handle invalid product ids
	}
}
  • invalidProductIdentifiers 핸들링 방법
    • invalidProductIdentifiers란? App Store Connect에서 상품 구성을 잘못한 경우 발생
    • Prod 빌드에서는 유효하지 않은 invalidID는 숨길 것
    • dev 빌드에서는 유효하지 않은 invalidID를 UI에 표출할 것 or 서버에 보낼 것

상품 정보 형태 (SKProduct)

  • 위에서 알아본 델리게이트에서 받을 수 있는 SKProductResponse에 포함
class SKProduct : NSObject {
  var localizedDescription: String // 상품의 상세 설명
  var localizedTitle: String // 상품 타이틀
  var isFamilyShareable: Bool // 앱스토어 커넥트로 가족 공유가 가능한지 여부

  var productIdentifier: String // 상품 id
  var price: NSDecimalNumber // 상품의 현지 가격 정보
  var priceLocale: Locale // 상품 가격 포멧팅에 사용되는 Locale

  var contentVersion: String // 상품 버전

  var subscriptionGroupIdentifier: String? // 구독 그룹 ID
  var subscriptionPeriod: SKProductSubscriptionPeriod? // 구독 기간 정보
  var discounts: [SKProductDiscount] // 현재 이용 가능한 구독 상품의 할인 정보 리스트
  var introductoryPrice: SKProductDiscount? // 상품의 첫구독 할인 정보

  var isDownloadable: Bool // 앱 스토어에서 다운로드가 가능한 상품인지 여부
  var downloadContentLengths: [NSNumber] // 상품의 다운로드 가능 파일의 길이
  var downloadContentVersion: String // 상품 중 다운로드 가능한 버전
}

* 참고

https://developer.apple.com/documentation/storekit/skproduct

https://developer.apple.com/documentation/storekit/skpayment

https://developer.apple.com/documentation/storekit/skpaymenttransaction

https://developer.apple.com/documentation/storekit/skpaymenttransactionobserver

Comments