'App'에 해당되는 글 2건

  1. 2013.07.22 Amazon In-App Purchasing 모듈 붙이기
  2. 2010.11.15 UIWebView 와 Application (App) 간의 통신 (15)
Unity Engine/Amazon2013.07.22 17:51

아마존 모바일 앱을 등록하고, 인앱 구매 모듈을 붙이시려는 분들께 도움이 되고자 남겨봅니다.

티스토어 인앱모듈을 붙여보신 분이라면 이클립스 작업으로 플러그인을 만들어야 하는 게 아닌가 생각하실 수 있습니다만, 아마존 모바일 인앱모듈은 구현이 상당히 쉽습니다. (유니티용 패키지를 따로 제공하기 때문에 꼼꼼히 적재적소에 코딩하시는 일만 남거든요~)


그럼, 간단하게 Consumable 상품을 하나 추가해 테스트 하는 과정까지 살펴보도록 하겠습니다.


1. In-App 상품 등록

어플을 등록 후 In-App Items 탭을 눌러 인앱상품을 등록합니다.



인앱상품은 Consumable(일반 소비성 아이템-게임머니 등), Entitlement(영구 구매 등 권한부여 아이템), Subscription(구독 등 기간제 아이템) 3가지 종류 중 선택하여 추가하실 수 있습니다.

그리고 SKU (인앱상품 식별코드) 는 어플 내에서 상품 구매시 호출할 때 사용되니 상품별로 네이밍을 잘 하시면 됩니다. (상품별 로직을 짜실 수 있게 규칙성을 주시면 좋겠죠.)


2. Amazon Mobile Apps-SDK 다운

Apps-SDK.zip 파일을 다운 받으시면 됩니다. (개발자 등록과정 등은 생략할게요. 개발자 등록이 안되도 SDK는 다운 받으실 수 있습니다. 다만, 인앱 상품등록을 하려면 개발자 등록, 앱 등록이 필수겠죠 ㅎ)


3. In-App Purchasing Unity Plug-In 설치

다운 받으신 파일을 압축해제 해 보면 DeviceMessaging, GameCircle, In-App-Purchasing 등 아마존에서 제공되는 SDK가 모두 포함 되 있습니다. 이 중 In-App-Purchasing/plugins/unity/AmazonIAP.unitypackage 를 해당 프로젝트에서 Import 합니다.


4. AndroidManifest.xml 파일 생성 및 설정



패키지를 Import 하면, 유니티 상단 메뉴에 Amazon 탭이 생깁니다. Amazon 탭에서 Generate AndroidManifest.xml File... 을 선택하시면 Assets 폴더 내에 Plugins/Android/AndroidManifest.xml 파일이 생성됩니다. 이 작업은 아마존 인앱구매 창의 액티비티를 AndroidManifest.xml 에 추가하기 위함입니다. Plugins/Android/AndroidManifest.xml 파일이 있으면 안드로이드 빌드 시 해당 파일로 AndroidManifest.xml 이 생성됩니다. 

(이 때, 다른 작업으로 이미 AndroidManifest.xml 파일을 생성하셨다면 필요한 퍼미션이나 액티비티들을 복사 해 두셨다가 Generate AndroidManifest.xml File... 후에 다시 추가 해 주셔야 합니다.)


그리고 혹시나 AndroidManifest.xml 파일에 다음 퍼미션이 추가 되 있지 않다면 반드시 추가 해 주시기 바랍니다. (이게 없으면, 구매 완료를 알려주지 않아요.)

<receiver android:name="com.amazon.inapp.purchasing.ResponseReceiver">
    <intent-filter>
        <action android:name="com.amazon.inapp.purchasing.NOTIFY" android:permission="com.amazon.inapp.purchasing.Permission.NOTIFY"/>
    </intent-filter>
</receiver>



5. 인앱상품 모듈 구현

- 상품 목록 호출

AmazonIAP.initiateItemDataRequest(string[인앱상품 식별코드 리스트]);


- 상품 호출 이벤트

성공시

void itemDataRequestFinishedEvent( List<string> unavailableSkus, List<AmazonItem> availableItems )


AmazonItem.description ( 상품설명 )

AmazonItem.type ( Consumable, Entitlement, Subscription )

AmazonItem.price ( 상품 가격 )

AmazonItem.sku ( 인앱상품 식별코드 )

AmazonItem.smallIconUrl ( 상품 대표아이콘 ; 인앱상품 등록시 업로드 한 이미지 url )

AmazonItem.title ( 상품명 )


실패시

itemDataRequestFailedEvent()


- 상품 구매 요청

AmazonIAP.initiatePurchaseRequest(인앱상품 식별코드(SKU))


- 상품 구매 이벤트

성공시

void purchaseSuccessfulEvent( AmazonReceipt receipt )


AmazonReceipt.type ( Consumable, Entitlement, Subscription )

AmazonReceipt.token ( 인증 토큰 - 개별 인앱 인증 서버 구현시 필요 )

AmazonReceipt.sku ( 인앱상품 식별코드 )

AmazonReceipt.subscriptionStartDate ( Subscription 상품 시작일 )

AmazonReceipt.subscriptionEndDate ( Subscription 상품 종료일 )


실패시

void purchaseFailedEvent( string reason )



Entitlement, Subscriptions 모듈 구현은 해당 페이지를 참고하세요~ 너무 쉽게 잘 설명 되 있어서 추가로 설명드리지 않아도 되겠네요~

(사실 Consumable 상품만 해봐서 ^^)


Overview of Entitlements


Overview of Subscriptions




6. 인앱구매 테스트

Amazon In-App Purchasing 테스트의 경우, 실제로 앱이 등록되기 이전에 인앱상품 테스트를 해 볼 수 있도록 AmazonSDKTest 앱을 제공합니다. 구현하신 앱상에서 인앱 상품 구매를 요청하면 AmazonSDKTest 앱에서 특정폴더에 저장 된 json 파일을 읽어 상품을 확인하고 상품 화면을 보여주고, 구매가 이뤄지면 구매 성공여부도 AmazonSDKTest 에서 해당 앱으로 알려주게 됩니다.

- AmazonSDKTest를 설치

테스트 앱은 2. Amazon Mobile Apps-SDK 다운 때 받으신 파일 내에 있습니다. In-App-Purchasing/tools/AmazonSDKTest.apk

- json 파일을 설정

상품명, SKU, 가격 등의 정보가 입력 된 json 파일을 SD카드 Root 에 json 파일을 저장하시면 됩니다. (파일명은 amazon.sdktester.json)

json 파일의 형식대로 직접 입력하셔도 되지만 아마존 인앱상품 등록화면에서 추출하셔서 사용하면 더 편합니다.




'Unity Engine > Amazon' 카테고리의 다른 글

Amazon In-App Purchasing 모듈 붙이기  (0) 2013.07.22
Posted by Min-gu, Kim
iPhone Dev2010.11.15 15:26

UIWebView 에 특정 페이지를 Request 하고나면, Application 의 메소드를 실행하고 싶지만 말 그대로 웹뷰이기 때문에 불가능한 경우가 많이 있습니다.

예를 들어, 어플 상에서 UITableView 같은 컨트롤에 리스트를 출력하고, 선택하면 UIWebView 로 상세 페이지를 보여준다고 가정합니다. 이런 경우, 페이지간 이동을 Navigation으로 해서 Back 을 통해 다시 리스트로 돌아가는 방법이 있을 뿐, UIWebView 내에서 <input type=submit ...> 같은 버튼을 통해서 Back 하거나 새로운 UIViewController 로 연결할 수가 없습니다.

이런 경우에 해결책은 다름 아닌, UIWebViewDelegate 에 있습니다.

구현 시나리오는 이렇습니다.

1. Web 과 App 이 통신할 수 있도록 하나의 Protocol 을 정의.
2. Web 상에서 버튼 등 Request가 일어나게 하는 컨트롤을 이용해 Protocol 을 써줍니다. 
3. App 상에서 webView: shouldStartLoadWithRequest: navigationType: 메서드를 구현하여 정의된 Protocol 을 찾아 구현 될 메서드를 실행.

저는 Javascript를 이용해 구현 해 봤습니다. 

1. Protocol 을 정의
"toApp:relationButton:param1"

저는 Protocol 을 이렇게 정의 했습니다. 원하시는 형태로 마음껏 구성하시되 3번 항에서 파싱만 완벽히 맞춰 주시면 되겠죠.
위 프로토콜을 정의하면서 파싱을 고려해야 하는데요, 저는 : 로 문자열을 나눈 후, 첫번째와 두번째 텍스트 각각이 toApp, relationButton 일 경우 세번째 텍스트인 param1 를 App 상에서 받아서 처리하기 위해서 Protocol 을 위와 같이 정의 한 것입니다.

2. Web 상에서 버튼 등 Request가 일어나게 하는 컨트롤을 이용해 Protocol을 써준다.
Web 상에서는 버튼등의 컨트롤을 사용해 Request가 일어나게 할 수 있죠. 이를 이용해 Javascript로 버튼이 onClick 시에 스크립트를 실행하도록 할 것이고, 스크립트에서는 Protocol을 써줄것입니다.

2-1. 스크립트에 Protocol을 써 주는 메서드를 정의
<script type="text/javascript">
     function eventtoApp(param1) {
          document.location = "toApp:relationButton:" + param1;
     }
</script>

2-2. HTML Body 내에서 버튼의 onClick 이벤트에 스크립트 실행 연결
<input type=submit onClick="javascript:eventtoApp('P0001001')";/>

3. App 상에서 webView: shouldStartLoadWithRequest: navigationType: 메서드를 구현하여 정의된 Protocol 을 찾아 구현 될 메서드를 실행.
마지막으로, App상에서 UIWebViewDelegate내 메서드인 webView: shouldStartLoadWithRequest: navigationType: 메서드를 구현 해 줍니다.
이 메서드는 UIWebView 컨트롤에서 Request가 일어날 때마다 들어오게 되는데요. 메서드의 반환형식은 BOOL 타입입니다. YES를 반환할 경우 UIWebView 에서 컨텐츠를 로드하게 됩니다.
그래서, 1번항에서 미리 정의 했던 Protocol 을 파싱하는 로직을 구현하되, 매치되지 않는 경우에는 return YES; 를 해 줘야 합니다. 정확히 매치되는 경우에만 어플에서 처리를 할 수 있도록 하면 되는 것이죠. 바로, 이 부분이 앞서 Protocol 에서 App 상에서 필요한 것은 param1 뿐이지만, toApp:relationButton 와 같은 전제를 붙인 이유입니다. 정확히 toApp:relationButton 가 매치되는 경우에만 파싱을 해서 param1을 가져오기 위함인 것이죠.

파싱은 간단하게 구현 하실 수 있습니다.

- (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request 

 navigationType:(UIWebViewNavigationType)navigationType {

NSString *requestString = [[request URL] absoluteString];

NSArray *components = [documentLocation componentsSeparatedByString:@":"];

if([components count] <= 1) {

return YES;

}


if ([(NSString *)[components objectAtIndex:0] isEqualToString:@"toApp"]) {

// 1번째 문자열이 toApp 경우

if([(NSString *)[components objectAtIndex:1] isEqualToString:@"relationButton"]) {

// 2번째 문자열이 relationButton 경우

NSLog(@"%@", [components objectAtIndex:2]); // param1

return NO;

}

}

}


Request가 일어난 뒤 받아온 문자열을 : 로 구분하여 나눈 뒤, 첫번째 텍스트와 두번째 텍스트가 각각 toApp, relationButton 인 경우에만 3번째 param1 을 받아와서 사용합니다. 그 외의 경우에는 return YES; 를 통해 UIWebView 컨트롤에서 컨텐트를 로드하도록 나두고요. 

여기 예문에서는 NSLog로 어플에서 잘 받아지는가만 출력 해 봤습니다. param1을 어플 내 화면에 출력하거나, 다른 메서드를 실행하기 위한 파라미터로 사용하거나 하는 등.. 결과적으로는, Web에서 App을 호출하는 형태를 구현하실 수 있습니다. :)
Posted by Min-gu, Kim

티스토리 툴바