Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
Tags
- Protocol
- Xcode
- ribs
- Human interface guide
- 리팩토링
- MVVM
- tableView
- Refactoring
- clean architecture
- 애니메이션
- UICollectionView
- 스위프트
- swiftUI
- combine
- map
- uiscrollview
- 리펙터링
- 클린 코드
- rxswift
- RxCocoa
- collectionview
- 리펙토링
- Clean Code
- Observable
- SWIFT
- ios
- uitableview
- HIG
- UITextView
- swift documentation
Archives
- Today
- Total
김종권의 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:58Product 종류
- 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
'iOS 응용 (swift)' 카테고리의 다른 글
Comments