안드로이드 구글 플레이어 올리기..

안드로이드는 50메가 제한이 있음..

.. 어떻게 유니티에서 파일을 나눠서 apk 파일을 만들 것인가 ?  ==> 애셋 번들을 만들라.  방법 잘 정리된 블로그 글.

.. 어떻게 나눠진 파일을 올리는가 ?

zip 으로 압축해서 올림.  android\obb\패키지명\main.버전코드.패키지명.obb 이런식으로 된다고?..  파일명은 신경 꺼라.  바로가기

안드로이드 개발자 사이트 번역

APK Expansion Files (확장파일)

구글 플레이는 현재 50메가 이하의 파일을 요구한다. 대부분의 어플에게 이 용량은  코드와 애셋을 합쳐 충분할 것이다. 하지만 고퀄리티 그래픽이나 미디어 파일, 큰 애셋을 갖는 어플은 더 많은 공간을 요구한다. 이전에는 50메가 이상의 경우 사용자가 앱을 오픈할 때  개발자가 추가적인 리소스를 호스팅하고 다운로드를 제공해야 했다.  추가적인 파일을 호스팅하는 것은 비용이 들고 UX 도 이상적이지 않다. 이 과정을 쉽게하기 위해 구글 플레이는 2개의 대용량 파일을 붙일 수 있게 했다.

구글 플레이는 확장파일을 비용 없이 제공한다.  확장파일은 기기의 공유 스토리지 위치 (SD 카드 또는 USB-마운터블 파티션 – 즉 “외장” 공간) 에 저장된다. 대부분의 기기에서 구글 플레이는 확장 파일을 APK 파일 다운로드와 동시에 받아 사용자가 처음 열었을 때 모든 것이 다 준비되도록 한다.  하지만, 어떤 경우에는 어플이 구글 플레이로부터 어플 시작 시 파일을 다운로드 해야 한다.

Overview

구글 플레이 안드로이드 개발 콘솔을 통해서 APK를 올릴 때 마다 하나 또는 두개의 확장파일을 추가하는 옵션이 주어진다. 각 파일은 2기가 까지이며 어떤 포맷이든 허용되나 다운로드 시 bandwidth 를 유지할 수 있는 압축된 파일을 추천한다. 개념적으로 각 확장파일은 다른 역할을 한다.

# ‘main’ 확장파일은 추가적인 리소스에 대한 주된 확장파일이다.

# ‘patch’ 확장파일은 메인 파일에 대한 부가적인 파일로 작은 업데이트 용도의 파일이다.

두 확장 파일을 어떤 방법으로든 쓸 수 있지만, 메인 파일이 중요한 애셋을 포함하고 업데이트는 가끔 하도록 권장한다. 패치 파일은 더 작고 패치를 위한 파일..

하지만, 어플이 새 패치 파일만을 업데이트 했더라도, 개발자는 매니패스트 의 versionCode 를 업데이트 해서 새로운 APK 를 올려야 한다.

\/\/ Note : 패치 확장파일은 실질적으론 메인 확장 파일과 동일함. 어떻게 사용해도 무방. 시스템은 앱의 패칭을 위해 패치 확장파일을 사용하지 않음. 패치는 스스로 해야 함.

File name format

각 확장 파일은 zip, pdf, mp4 등 어떤 포맷도 가능하다. 파일 타입에 관계 없이 구글 플레이는 opaque binary blobs 로 간주하고 다음과 같은 기준으로 리네임한다.

[main|patch].<expansion-version>.<package-name>.obb

세가지 콤포넌트.

main  or  patch
파일이 메인인지 패치인지 구별. 각 APK 에 하나의 메인과 하나의 패치만 가능.

<expansion-version>
확장이 ‘첫번째’ 참조되는 정수의 버전 코드  . (어플의 android:versionCode 값과 일치)
‘첫번째’ 는 개발자 콘솔이 업로드된 확장 파일을 재사용하는 것(새로운 APK 파일과 함께)을 허용하기 때문에 강조되었음.  이것은 처음 파일을 올렸을 때의 버전을 유지한다.

<package-name>
어플의 자바-스타일 패키지 이름.

예>   main.314159.com.example.app.obb  이렇게 됨.

Storage location

구글 플레이가 확장파일을 다운로드 할 때, 시스템의 공유 공간에 저장한다. 제대로 작동되기 위해서 파일을 지우거나, 옮기거나, 이름을 바꾸지 말것. 어플이 구글 플레이에서 다운로드 해야 할 때, 사용자는 바로 같은 곳에 저장해야 한다.

정해진 위치는 다음과 같다.

<shared-storage>/Android/obb/<package-name>/

# <shared-storage> 는 공유 공간이며 getExternalStorageDirectory() 로 받는다.

# <package-name>  은 getPackageName() 으로 얻음.

각 어플에는 메인/패치 파일이 가능. 이전 버전은 새로운 확장 파일로 업데이트하면 overwrite 됨.

파일을 언-팩 해야하면 .obb 파일을 지우지 말고 같은 디렉토리에 풀린 데이터를 저장하지 말라.  압축 해제된 파일은 getExternalFilesDir() 에 지정된 곳에 저장해야 한다. 하지만, 가능하면 해제 과정 없이 확장 파일을 바로 사용하는 것이 제일 좋다. 예를 들면 집 파일을 바로 읽는 라이브러리 같은 경우..

/\/\ Note : APK 파일과는 다르게 어떤 파일이라도 저장 가능하다.

/\/\ Tip : 미디어 파일을 집 압축 한다면 미디어 플레이백 콜을 오프셋, 길이 조절로 부를 수 있다. (MediaPlayer.setDataSource() &  SoundPool.load() ) 압축 해재 없이. 이 과정을 통해 부가적인 압축을 하지 않아도 된다. 예를 들어 집 툴을 쓸 때 -n 옵션을 써서 압축을 안 할 수 있다.

Download process

대부분의 경우 확장 파일은 APK 파일과 함께 다운로드, 저장 된다. 하지만, 어떤 경우에은 구글 플레이는 확장 파일을 다운로드 하지 못하거나 사용자가 이전에 내려받은 파일을 지울 수 있다. 이러한 경우에 대비하여 어플은 파일 자체를 다운로드할 수 있어야 한다.  구글 플레이가 제공하는 URL 을 통해서.

다운로드 프로세스

1. 사용자가 구글 플레이에서 앱 선택.
2. 구글 플레이가 확장파일을 다운로드 할 수 있으면 (대부분의 경우) APK 와 함께 파일 다운로드. 확장 파일을 다운로드 할 수 없을 때는 APK 만 한다.
3. 사용자가 앱을 런칭할 때, 앱은 확장 파일이 있는 지 확인해야 함.  있으면 레디 투 고. 없으면 구글 플레이의 HTTP 에서 다운로드 해야 함. 앱은 구글 플레이 클라이언트에 Application Licensing 서비스를 이용하여 요청해야 한다. 이것은 이름, 파일 크기, URL 에 대응함. 이 정보로 파일을 다운로드 하고 정당한 위치에 저장한다.

주의 : 파일 다운로드 코드를 포함하는 것이 중요하다. 라이브러리 제공했으니 최소의 작업량으로 가능할 것.

Development checklist

내용 요약

1. 50메가 이상이 필요한 지 판단. 가능한 한 작게.. 여러 기기를 위해서라면 복수의 APK  를 고려하라.
2. 메인 확장 파일로 뭘 뺄 지 결정.
3. 기기의 ‘공유 저장 위치’ 로부터 읽어 들이도록 개발. 파일 포맷이 무관하면 ‘집’ 해서 APK Expansion Zip Library 를 이용하도록.
4. 초기에 확장 파일 유무 검사. 없으면 다운로드 받도록. Downloader Library  를 사용하면 간단하다.
테스팅.

Rules and Limitations

iTunes Connect Developer Guide [ In-App Purchase ] section

원문

IAP 의 관리는 App Summary 페이지의 Manage In-App Purchases  버튼을 클릭하여 이루어짐. 이 버튼은 계정이 어드민, 기술 역할 등에 할당되었을 때 ‘보여진다’

About In-App Purchase

스토어-킷 을 통해 구현한다. 스토어-킷은 당신의 앱을 대신하여 앱 스토어에 연결하고, 결재를 위한 UI 제공,  ..

>> 추가적인 성능
>> 북 리더앱의 새 책.
>> 게임의 뉴 레벨
>> 온라인 게임에서의 가상 특성 구입
>> turn-by-turn 맵 서비스 접속
>> 전자 잡지 / 뉴스레터

앱내구매를 앱에서 구현하려면 ‘최신 Paid Applications contract’ 가 유효하고, 팀 요원이 프로그램 라이센스에 동의해야 함.
애플에 리뷰를 위해 보내기전에, 모든 앱내구매는 ‘아이튠즈 커넥트’ 에 등록되고 샌드박스 환경에서 테스트 되어야 한다.

Registering In-App Purchases

무료/유료 앱에 적용 가능.  제품은 먼저 ‘아 – 커넥트’에 등록되어야 함. 등록 시 ‘이름, 설명, 가격’ 와 다른 메타 데이터 추가.
제품은 ‘product indentifier’ 라는 유니크한 문자로 구별함. 앱이 스토어킷을 사용 시 이 ‘구별자’ 를 사용.
당신은 앱내구매를  ‘생성, 수정, 삭제’ 할 수 있고 리뷰를 위해 애플에 제출할 수 있다.
앱내 구매에는 10,000 개 까지 다른 ‘구별자’를 생성할 수 있다. 이것은 거래 숫자가 아님.
앱 서머리 페이지에서 생성 시작할 수 있다.

Creating In-App Purchases

>> Log into iTunes Connect
>> Manage Your Applications
>> Click the App
>> Manage IAP click  (이 버튼이 보이지 않으면 계약에 동의하지 않은 것임)
>> Create New
>> Select Type .. consumable, Non-consumable, Auto-Renewable Subscriptions, Free Subscription, Non-renewing subscription
>> Fill out the form
>> Click Save.  앱내 구매가 ‘관리’ 페이지에서 보인다.

Entering In-App Purchase Information

표 12-2 의 내용 입력.

>> Free Subscription form [ 언어 추가, 스크린 샷 … ]

>> Non-Renewable Subscription or Consumable form..

Table 12-2 Common IAP properties
Reference Name, Product ID < unique UTF-8 alphanumerical identifier > Not editable, Pricing and Availability, Languages, Review Notes < for Apple review >, Screenshot

Privacy Policy URL input…

Testing Your IAP

샌드박스 환경 -> 금융 결재 발생 안함.  앱 스토어를 이요하지만 결재 하지는 않음. 실제 결제와 동일한 값 리턴.  앱내구매에 한정된 특별한 ‘아-커넥트’ 계정 사용.  일반 계정은 샌드박스에서 쓸 수 없음.

Creating Test User Accounts

커넥트를 이용하여 1개 이상의 테스트 계정 생성. 각 언어에 대하여 1개 이상의 계정 생성해야. 테스트 유저 계정은 새롭고, 유니크한 애플 계정이어야하고, 기존 계정을 이용할 수 없다.
어드민, 기술 역할로 어사인 되어 있어야 생성 가능. ‘커넥트’ 에 접근 불가, 하지만 앱내구매에서 테스트 가능. 개발 환경의 등록된 테스트 기기에서만..

>> Log into iTunes Connect.
>> Manage Users..
>> Click Test User.
>> Add New User.

<<주의>> 실수로 테스트 유저 계정으로  (테스트 환경 대신) 기기에서 제품 환경에  로그인하면, 테스트 계정은 invalid 되고 다시 사용할 수 없게 됨.

Using Test User Accounts

#1. 테스트 유저 계정 셋업. 아이디(이메일), 비번 입력.
#2. 테스트 기기의 계정 정보 초기화 할것. 테스팅 중에 실제 계정이 쓰일 염려때문.
<< 주의 >> 테스트 계정 정보를 ‘스토어 세팅’ 패널에서 넣지 말것. 이것은 테스트 계정을 폐기할 수 있음.
#3. 샌드박스에 대비한( against ) 기능을 테스트하려면 기기를 개발 웤스테이션에 연결하고 기기를 Active SDK 로 선택할 것.
#4. 앱이 스토어킷 API 를 통해 결재를 요청할 때, 결재 확인 창이 뜨고 Sign In 패널이 또 뜬다. ‘Use Existing Account’ 선택하고 테스트 유저네임과 비번을 넣은 후 구매 테스트를 완료함. 금융거래는 일어나지 않지만 영수증을 포함한 완전한 구매가 생성. 테스트 계정에는 신용카드정보가 없으므로 실제 금융 거래는 일어나지 않음.

Sandbox Testing Your IAP

애플에 리뷰를 위해 제출하기 전에 샌드박스 환경에서 테스트 해야 함. 샌드박스로 테스트 하기 전에 아이튠즈 계정에서 로그 아웃 해야 함. 테스트 유저 계정을 테스트 디바이스에서 로그인 하면 계정이 폐기된다.
오토-리뉴어블 앱내구매를 테스팅할 때는 지속 시간이 짧아진다. 부가적으로 샌드박스 제출은 6번 까지만 ‘오토-리뉴’ 된다.

Submitting Your In-App Purchases

새로 만든 ‘앱내구매’를 다음 바이너리 업로드 때 써밋 할 지, 지금 바로 리뷰에 들어갈 지 결정해야 한다.
첫번째 앱내구매는 앱 버전과 같이 제출되어야 한다. Version Details 페이지에 해야 한다. (적어야 한다) 바이너리가 업로드 되고, 첫번째 앱내구매가 리뷰에 들어간 후 추가적인 앱내구매는 앰내구매 ‘관리’ 뷰의 테이블을 통해 제출될 수 있다.
바이너리와 함께 서밋하려면 Version Details Page 에서 선택해야 한다.
스크린 샷에서 에디트 를 클릭하여 어느 놈이 리뷰되야 하는지 선택한다.
세이브. 바이너리와 함께 제출되었다.
대규모 제출도 가능.  제출할 놈을 체크.. Ready to Submit 으로 만든다.   “Submit for Review” 클릭..
<개별 제출> 앱내구매 페이지에서 개별적으로 제출 가능. “Ready to Submit” 에서 “Waiting for Review” 로 바뀌고 즉시 리뷰를 위해 보내진다.

Tracking Your IAP Status

제출한 후에는 “Waiting for Review” 로 상태가 바뀐다. 리뷰를 기다리는 동안 수정이 가능하다.

“In Review” 로 바뀜. 수정 불가.이 상태에서는 삭제도 불가.

“Approved” 바이너리 없이 …. 암튼 완료..

바이너리와 함께 제출하기로 선택했다면, 애플에서 심사 후에 앱 심사가 끝날 때까지 approved 가 안 나옴.
리뷰 과정에서 앱내구매가 리젝되면 애플에서 연락이 간다.  커넥트의 Contact Us 를 통해 물어볼 수 있다. 리젝되면 다시 만들어야 한다.

Biggest Change in C++ 11

일단 원문 출처  이곳을 안내한 곳..  GameCodi.com

C++  의 창안자 Bjarne Stroustrup은 11 이 새로운 언어 느낌이라고 함. 코어 시++ 은 많이 변화했다.

람다 표현식, 자동 타잎, uniform initialization syntax, delegate 구조, nullptr, 가장 중요한 rvalue reference… 객체를 이해하는 패러다임의 주요 변화.

1998년에 시++ 이 정의될 때 다음 버전에는 가비지 컬렉션이 들어갈 거라고 했지만, 들어가지 않았고, 대신 “최신의 쓰레딩 라이브러리” 가 들어갔다.

Lambda Expression

[capture](parameters)->return-type {body}

한 함수 내에서 다른 함수를  정의하는 듯.

Automatic type  deduction and decltype

오토.. auto..

auto   mVar = 12340000000LL   // Long Long..

템플릿에서 자동 생성될 때 유용.

Uniform Initialization Syntax

4가지 초기화 방법

()

=

[]  {}

member initializer

이것을 정리

MyClass classObj  { 0, 23 } ;  // C++ 11 only  이렇게.

멤버 어레이 초기화 등등.

in class initialization

Deleted and Defaulted Functions

함수에 = default   or   = delete  할당.  객체 복사 방지.

nullptr

strongly typed. 숫자 0 = 널 포인터 였는데.. 이걸 구분하게 됨.

Delegating Constructors

생성자 내부에서 다른 생성자 부를 수 있음..

Rvalue References

lvalue 밖에 참조를 못 했다. r value 는 임시 객체, 숫자에 쓰임.

쓰이게 된 이유는  move semantics.   복사와 달리 ‘옮김’ 은 기존 객체의 것을 빼오는 것. 복사가 비싸고 불필요할 때 무브를 쓸 수 있다. 스트링 스와핑 같은..

C++ 11 Standard Library

Threading Library

Concurrency..

New Smarter Pointer Classes

C++ 98 auto_ptr 이 있었다. 폐기됨. C++ 11 .. shared_ptr & unique_ptr

New algorithms

all_of(), any_of (), none_of () …