I don't remember when this issue was first discovered, but I'm having trouble logging in to xcode with my Apple ID, but beta version works. (seems to be related to macOS big sur beta 11)
To submit app i need to figure this out asap. I googled and found some kind of trick.
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은 로그인하지 않아도 구입할 수 있는 옵셔널 상품이어야 한다