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.

developer.apple.com/forums/thread/100020

 

Your session has expired, please l… | Apple Developer Forums

I log into my Apple Id account under Pref->Account. I AM able to login, it shows me as a team memeber. Then I exit xcode and when I run it, I go to Pref->Account, it says 'Your session has expired, please login'. I can do this over and over. Thanks Ralph

developer.apple.com

 

Because binary built with beta version couldn't upload to app store, I need to build binary with Xcode 11.7 and upload with beta.

It seems very odd but I have a no choice for now. Actually I haven't tried this way yet. If there is another problem, I will update it.

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!!

이번 여행에 에어캐나다 항공을 이용했는데 오는 길에 경유시간이 한시간 반 정도였다.

캐나다의 속도를 대략 알기에 또한 작은 공항이 아닌 걸 알기에 불안했지만 잘 오겠지 스스로를 다독이며 환승을 열심히 했건만

두둥!!! 역시나 시간 안에 짐을 못 실음... 나랑 같이 간 친구 그리고 몇명 더 있었던 것 같다.

몇시간이 아닌 다음 날 같은 시각 항공편으로 온다고 해서 당장 필요한 몇 가지를 구입했다.

 

의료비 청구를 여러번 해봐서 쉬울 줄 알았는데 여행자 보험은 생각보다 귀찮은 과정이 필요했다.

 

우선 공항에서 작성한 사고 접수 문서(PIR)에 적힌 접수 번호(Incident Number)와 항공권 Booking Number 등 몇 가지 정보로 보험사 제출 용 지연 확인서를 받아야 하는데 이런 사고 접수 번호가 안 보인다.

PIR 신고서에 보통 적혀 있어야 하는데 내 것엔 사고 접수 번호가 없음 10자리의 그 어떤 문자열도 보이지 않아!!

에어캐나다 사이트에서 신청하려고 해도 접수 번호가 필요하고 외국 지사로 전화 하기에는 영어 리스닝이 자신없고 한국 지사는 전화를 하루종일 안받음 - 검색해보니 보통 저런 지점은 직원이 적어서 바쁘다고 함

 

답답이~~~

 

일단 사고접수를 받아서 사이트에서 접수 해보고 안 되면 해외번호로 전화해야지 결심하고 인천공항 수하물 센터로 전화를 해봤다.

그런데 왠걸~~ 보험사 제출용이라고 하니까 지연 확인서 필요할 거라고 보내 준다고 하심. 감사합니다, 감사합니다!

안되는 영어로 노력하지 않아도 되겠네.. (왜인지 살짝 아쉬운)

블로그 검색한거랑 번호가 살짝 다른데 PIR 하단에 적힌 번호로 연락하면 되는듯 하다. 신난당//

 

 

이제 남은 것은 보험금 청구인가;; 머나먼 길:)

여행자 보험은 여행자클럽에서 메리츠화재을 선택했다.

사이트에서는 여행자 보험 청구 슬롯이 따로 안 보여서 여행자 클럽으로 전화했더니 메일을 보내주셨다.

엄마 보고 싶네... 뭐가 많네요 꺼이꺼이

이래저래 준비만 2-3일 했다 ㅋㅋ 회사에서 스캔하다보니 인증서 필요하고 여권 안가져오고 그래서;;;

그래도 마무리는 했으니 다행이다. 제발 전부 처리 잘 되기를 :D 비나이다//////

 

 

 

 

+ Recent posts