In-App Purchases ?

디지털 컨텐츠나 서비스를 앱에서 바로 구매할 수 있도록 제공되는 기능

유형 상품은 해당되지 않는다

 

support 4 content types

Consumable 게임 등에서 화폐처럼 계속해서 구입할 수 있는 아이템

Non-Consumable 한번 구입하면 디바이스를 옮겨 다녀도 계속 소유할 수 있는 아이템, 게임에서 무기라던가 무료앱을 제공하고 여기에 기능을 덧붙여서 유료로 제공하는 pro app 등

Non-Renewing Subscriptions 자동으로 재결제 되지 않기 때문에 사용자가 직접 재결제할 필요가 있음

Auto-renewable Subscriptions 자동 재결제

 

 

Load In-App Identifiers

앱에서 어떤 상품을 파는지 목록을 가져옴

 

Fetch Product Info

id 목록을 가져왔으면 App Store에서 해당 id를 가진 프로덕트의 localized된 정보를 가져옴

말 그대로 글로벌 마켓을 지원하기 때문에 지원하고자 하는 앱스토어에 맞게 localized information을 가져올 수 있다.

SKProductRequest를 생성할 때 상품 id 목록을 넘겨서 관심있는 상품을 알려줌

let request = SKProductRequest(productIdentifiers: ids)

request.delegate = self //상품 로딩 되면 알려줌

request.start()

전달된 id를 가진 상품의 localized 정보를 앱스토어로부터 가져와서 내려줌

앱스토어에 있는 currency 를 변경하지 말고 사용할 것.

 

Show In-App UI

당신의 앱, 당신의 서비스이기 때문에 서비스에 맞게 상품을 구입할 수 있는 최선의 UI를 보여줘라

 

Make Purchase

사용자가 상품 구매한 payment를 생성해서 paymentQueue에 추가한다

 

Process Transaction

paymentQueue에 payment가 등록되면 observer가 상품 구매 트랜잭션 상태를 트래킹해서 콜백으로 알려주고 어떻게 대응할지 구현하면 된다.

purchasing continue; 구매 flow 진행중
purchased 구매 완료 finishedTransaction 호출
deferred 이 컨텐츠를 사용할 수 있도록 허가 기다리는 중. 업데이트되면 다시 콜백 불릴거라 다른 처리 할 필요 없음.
restored 복구 finishedTransaction 호출
failed 실패 finishedTransaction 호출

 

Sandbox test

샌드박스 환경에서 테스트 가능한데 deferred 상태를 확인하기 위해 가족용 계정을 만드는 불필요한 작업을 하지 않도록 옵션을 제공한다

payment.simulatesAskToBuyInSandbox flag

 

Make Asset Available

payment completed되면 구매한 상품 정보를 업데이트하거나 사용자에게 어떤 상품을 구매했는지 알려주기

On-demand resources : 구매 후 더 필요한 리소스 있으면 받을 수 있게? apple에서 host 제공함 콜백으로 받으면 됨

 

 

Finish Transaction

paymentQueue에게 모든 payment 트랜잭션이 끝났다는 것을 알려줌

download 끝나면 끝났다고 알려줌

호출하지 않으면 payment가 큐에 살아 있음

다운로드 중이면 끝날때까지 기다렸다가 호출

 

Restore Transaction

SKPaymentQueue.defaultQueue().restoreCompletedTransactions()

restore api를 호출하면 observer delegate로 restored 상태를 가진 트랜잭션 목록이 전달됨

non-consumable or auto-renewable subscriptions 를 구입한 이력이 있으면 해당 identifier의 트랜잭션이 restored 상태값을 가지고 전달됨

필요에 의해 서버 처리하고 마지막은 무조건 finishedTransaction api를 호출해야 함 -> 트랜잭션 처리가 완료되었음을 알려주어야 함. 

 

 

 

SKPaymentQueue

신뢰도 있는 state를 가지고 있는 유일한 소스

queue가 알려주는 payment가 실제로 유효하고 존재하는 payment이다

개발자가 캐싱할 수는 있지만 믿을 수 있는건 paymentQueue에 있다

앱 시작하자마자 payment queue를 트래킹하는 observer를 생성해라

이유에 대해 설명하기 위해 예를 들면, 리딤 코드를 발급하는 서비스의 경우 사용자는 앱 내가 아닌 앱스토어에서 리딤코드를 사용할 것이다. 만약 앱이 실행 되었을 때 바로 이를 알아채지 못하면 사용자는 해당 상품을 사용할 수 없게 된다. 따라서 앱이 실행되자마자 paymentQueue가 알아챌 수 있게 appDelegate에 launch delegate method에 observer를 생성해야 한다.

 

Error Handling

모든 에러가 같지 않기 때문에 가이드 문서 보고 에러 코드 체크할 것

에러에 대한 얼럿은 비추

사용자가 구매를 취소한 것도 에러 콜백을 호출한다

사용자는 본인이 캔슬한걸 알고 있는데 굳이 얼럿으로 또 확인 시켜줄 필요는 없다

트랜잭션 핸들링은 최대한 스토어킷이 하도록 놓아두자

 

 

Receipt Validation

Server to Server : downloadable service

on device : 단순히 클라 사이드에서만 체크해서 상품을 unlock하는 경우, 예를 들어 잘 만들어진 앱의 예는 아니지만 교육 동영상 목록을 어플 안에 모두 넣어두고 구입한 경우에만 플레이할 수 있도록 구현. 용량이 적고 서버를 구축할 상황이 아니었음. 이때 receipt validation을 클라에서 처리

receipt validation api는 절대 클라에서 직접 호출하지 말 것. 클라에서 보내는 것을 믿을 수 있는지 확인할 길이 없다

 

The receipt

이 디바이스에서 이 유저가 이 상품을 구매했는지 믿을 수 있는 정보를 제공

번들에 저장되어 있는 앱스토어 path로 receipt를 가져올 수 있음

절대 certificate의 expiry date로 만료일 체크하지 말 것

root certificate authority on the receipt로 체크할 것; 애플에서 왔지~

receipt는 물건을 구매하면 발생하는데 renewable하다

 

 

Transaction LifeCycle

Counsumable & Non-renewing Subscriptions : 구매 후 단 한번 트랜잭션 발생 refresh receipt하거나 디바이스를 변경해도 다시 발생하지 않는다

Non-Consumable & Auto-renewable Subscriptions : 언제나 receipt에 구매 이력이 남아 있다 restore api로 가져올 수 있다 

 

 

 

리뷰 통과하려면

You must have a Restore button Should be used only for Non-Consumable & Auto-renewable Subscriptions

Resotre 와 구매 버튼은 따로

Auto-renewable 을 지원할 때 privacy policy URL 제공

앱 올릴때 지원한다느 걸 꼭 언급해야 함

계정로그인이 기본인 서비스가 아닌 경우 Non-renewing subscription은 로그인하지 않아도 구입할 수 있는 옵셔널 상품이어야 한다 

should works!!

+ Recent posts