# 탭조이 관리형 재화

> 탭조이 오퍼월 관리형 재화를 사용하여 탭조이 서버에 사용자 재화 잔액을 저장하고 관리합니다.

탭조이에서 관리하는 재화를 사용하여 사용자의 가상 재화 잔액을 탭조이 서버에 저장하고 관리할 수 있습니다. 탭조이의 퍼블리셔 SDK를 통합하는 모든 개발자가 이용할 수 있는 이 무료 서비스를 통해, 앱 내에서 재화를 백엔드에 저장할 필요가 없어집니다.

## 재화 잔액 가져오기##get-currency-balance

사용자의 현재 가상 재화 잔액을 확인하려면 각 플랫폼별로 안내된 메서드를 사용합니다. 잔액이 정확하게 유지되도록 `getCurrencyBalance`를 자주 호출하는 것이 권장되는 베스트 프랙티스입니다. 잔액을 확인하는 일반적인 시점은 다음과 같은 상황입니다.

* ​​앱 실행
* 앱 재개
* 탭조이 뷰 종료
* 플레이스먼트 콘텐츠가 사라짐

최적의 결과를 위해 광고 콘텐츠가 종료된 후 약 3.5초 뒤에 `getCurrencyBalance`를 호출합니다. 이렇게 하면 보상이 업데이트될 충분한 처리 시간이 확보됩니다. 즉시 잔액을 확인하면 새롭게 획득한 보상이 반영되지 않을 수 있습니다.

### 재화 잔액 검색##retrieve-currency-balances

탭조이는 보상을 신속하게 전달하기 위해 최선을 다합니다. 하지만 네트워크 지연이 발생할 수 있으므로 즉시 보상이 보장되지는 않습니다. 사용자들에게 오퍼 보상이 반영되기까지 다소 시간이 걸릴 수 있음을 알려줍니다. 정확성을 유지하려면 정기적으로 잔액을 확인하고, 다음과 같은 주요 앱 이벤트가 발생할 때 확인하십시오.

* 앱 실행
* 앱 재개
* 레벨 사이
* 스토어 로딩 전

재화 잔액을 조회하려면 다음 플랫폼별 메서드를 참고하십시오.

1. **iOS**

   iOS 디바이스에서 현재 가상 재화 잔액을 확인하려면 다음 메서드를 사용합니다.

   ```objective-c title="Objective-C"
   // This method requests the tapjoy server for current virtual currency of the user.
   //Get currency
   [Tapjoy getCurrencyBalanceWithCompletion:^(NSDictionary *parameters, NSError *error) {
     if (error) {
       //Show error message
       NSLog(@"getCurrencyBalance error: %@", [error localizedDescription]);
     } else {
       //Update currency value of your app
       NSLog(@"getCurrencyBalance returned %@: %d", parameters[@"currencyName"], [parameters[@"amount"] intValue]);
     }
   }];
   ```

   완료 블록은 `currencyName`에 재화 이름, `amount`에 사용자의 총 잔액을 반환합니다. 구현 세부 사항은 SDK 패키지의 샘플 애플리케이션을 참고하십시오.

2. **Android**

   Android 디바이스에서 현재 가상 재화 잔액을 확인하려면 다음 메서드를 사용합니다.

   ```java title="Java"
     Tapjoy.getCurrencyBalance(new TJGetCurrencyBalanceListener(){
       @Override
       public void onGetCurrencyBalanceResponse(String currencyName, int balance) {
         Log.i(TAG, "getCurrencyBalance returned " + currencyName + ":" + balance);
       }
       @Override
       public void onGetCurrencyBalanceResponseFailure(String error) {
         Log.i("Tapjoy", "getCurrencyBalance error: " + error);
       }
     });
   ```

   `onGetCurrencyBalanceResponse` 콜백에서 결과값을 받고 `onGetCurrencyBalanceResponseFailure`에서 오류 정보를 받습니다. 앱 시작과 재개 시 `getCurrencyBalance`를 호출하여 정확도를 유지합니다. spend와 award 콜백도 전체 잔액을 반환하며, 앱 업데이트에 활용할 수 있습니다.

3. **Unity**

   ```csharp title="C#"
   // Get currency
   Tapjoy.GetCurrencyBalance();

   // on enable, add delegates
   void OnEnable() {
     Tapjoy.OnGetCurrencyBalanceResponse += HandleGetCurrencyBalanceResponse;
     Tapjoy.OnGetCurrencyBalanceResponseFailure += HandleGetCurrencyBalanceResponseFailure;
   }

   // on disable, remove delegates
   void OnDisable() {
     Tapjoy.OnGetCurrencyBalanceResponse -= HandleGetCurrencyBalanceResponse;
     Tapjoy.OnGetCurrencyBalanceResponseFailure -= HandleGetCurrencyBalanceResponseFailure;
   }
   public void HandleGetCurrencyBalanceResponse(string currencyName, int balance) {
     Debug.Log("C#: HandleGetCurrencyBalanceResponse: currencyName: " + currencyName + ", balance: " + balance);
   }
     
   public void HandleGetCurrencyBalanceResponseFailure(string error) {
     Debug.Log("C#: HandleGetCurrencyBalanceResponseFailure: " + error);
   }
   ```

   지정한 `OnGetCurrencyBalanceResponse` 핸들러에서 재화 잔액에 대한 알림을 받게 되며, 이 핸들러는 `currencyName` 및 `balance` 파라미터를 전달합니다. `OnGetCurrencyBalanceResponseFailure` 핸들러에서 오류가 발생하면 알림을 받게 됩니다.

4. **React Native**

   ```javascript title="JavaScript"
   try {
     let result = await Tapjoy.getCurrencyBalance();
       let currencyName = result['currencyName'];
       let amount = result['amount'];
   } catch (error: any) {
       //Handle error
   }
   ```

   React Native에서 파라미터를 받지 않는 `getCurrencyBalance()`에 대해 프로미스를 사용합니다. 이 프러미스는 `currencyName`와 `amount`를 포함하는 딕셔너리로 해결되거나, 실패할 경우 오류가 발생합니다.

5. **Adobe Air**

   ```java title="Java"
     // Get currency
     TapjoyAIR.getCurrencyBalance();

     // Setup handlers
     TapjoyAIR.addEventListener(TJCurrencyEvent.GET_CURRENCY_BALANCE_SUCCESS, tapjoyCurrencyEventHandler);
     TapjoyAIR.addEventListener(TJCurrencyEvent.GET_CURRENCY_BALANCE_FAILURE, tapjoyCurrencyEventHandler);

     private function tapjoyCurrencyEvents(event:TJCurrencyEvent):void {
       trace("Tapjoy sample event listener for " + event.type + ", " + event.balance + ", " + event.currencyName);
     }
   ```

   지정한 `TJCurrencyEvent.GET_CURRENCY_BALANCE_SUCCESS` 핸들러에서 재화 잔액에 대한 알림이 전달되며, 이 핸들러는 `TJCurrencyEvent` 파라미터를 전달합니다. 이 오브젝트에는 `currencyName` 및 `balance` 등록 정보가 포함되어 있습니다. `TJCurrencyEvent.GET_CURRENCY_BALANCE_FAILURE` 핸들러에서 오류가 발생하면 알림을 받게 됩니다.

## 사용자가 화폐를 획득했는지 확인##checking-if-the-user-has-earned-currency

마지막 잔액 확인 이후 재화를 획득하면 사용자에게 알림을 제공합니다. 알림을 설정하려면 다음 섹션의 플랫폼별 명령어를 사용합니다.

1. **iOS**

   iOS 디바이스에서 획득한 재화를 감지하려면 알림 관찰자를 추가합니다.

   ```objective-c title="Objective-C"
   // Set the notification observer for earned-currency-notification. It's recommended that this be placed within the applicationDidBecomeActive method.
   [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(showEarnedCurrencyAlert:) name:TJC_CURRENCY_EARNED_NOTIFICATION object:nil];

   // In the following method, you can set a custom message or use the default UIAlert to inform the user that they just earned some currency.
   - (void)showEarnedCurrencyAlert:(NSNotification*)notifyObj
   {
     NSNumber *currencyEarned = notifyObj.object;
     int earnedNum = [currencyEarned intValue];

     NSLog(@"Currency earned: %d", earnedNum);

     // Pops up a UIAlert notifying the user that they have successfully earned some currency.
     // This is the default alert, so you may place a custom alert here if you choose to do so.
     [Tapjoy showDefaultEarnedCurrencyAlert];

     // This is a good place to remove this notification since it is undesirable to have a pop-up alert more than once per app run.
     [[NSNotificationCenter defaultCenter] removeObserver:self name:TJC_CURRENCY_EARNED_NOTIFICATION object:nil];
   }
   ```

2. **Android**

   사용자가 가상 재화를 획득할 때마다(예: 오퍼를 통해) 알림을 받으려면 다음 방법으로 획득한 재화 리스너를 설정합니다.

   ```java title="Java"
     // Get notifications whenever Tapjoy currency is earned.
     Tapjoy.setEarnedCurrencyListener(new TJEarnedCurrencyListener() {
       @Override
       public void onEarnedCurrency(String currencyName, int amount) {
         Log.i("Tapjoy", "You've just earned " + amount + " " + currencyName);
       }
     });
   ```

   획득한 재화 알림은 `onEarnedCurrency(String currencyName, int amount)` 콜백 내의 `TJEarnedCurrencyListener`에서 수신합니다. 예를 들어 사용자의 잔액이 100이고 오퍼로 25를 획득했다면, 다음 `getCurrencyBalance()` 호출 시 `onEarnedCurrency`가 25 금액으로 트리거됩니다.

3. **Unity**

   ```csharp title="C#"
   // on enable, add delegates
   void OnEnable() {
     Tapjoy.OnEarnedCurrency += HandleEarnedCurrency;
   }

   // on disable, remove delegates
   void OnDisable() {
     Tapjoy.OnEarnedCurrency -= HandleEarnedCurrency;
   }

   public void HandleEarnedCurrency(string currencyName, int amount) {
     Debug.Log("C#: HandleEarnedCurrency: currencyName: " + currencyName + ", amount: " + amount);
   }
   ```

   지정한 `OnEarnedCurrency` 핸들러를 통해 획득한 재화로 알림을 받게 되며,`currencyName` 및 `amount` 파라미터가 전달됩니다.

4. **Adobe Air**

   ```java title="Java"
     TapjoyAIR.addEventListener(TJEarnedCurrencyEvent.EARNED_CURRENCY, tapjoyEarnedCurrencyEventHandler);

     private function tapjoyEarnedCurrencyEventHandler(event:TJEarnedCurrencyEvent):void
     {
       trace("You can notify user's here that they've just earned " + event.amount + " " + event.currencyName);
     }
   ```

   지정한 `earned in the TJEarnedCurrencyEvent.EARNED_CURRENCY` 핸들러에서 재화 관련 알림을 받게 되며 `TJEarnedCurrencyEvent object`가 전달됩니다. 이 오브젝트에는 `currencyName` 및 `amount` 등록 정보가 포함되어 있습니다.

## 탭조이 관리형 재화 지출##spend-tapjoy-managed-currency

사용자의 가상 재화를 일정 금액 사용하려면 다음 섹션에 자세히 안내된 플랫폼별 메서드를 호출합니다.

1. **iOS**

   ```objective-c title="Objective-C"
   // This method call will deduct 10 virtual currencies from the user's total.
   [Tapjoy spendCurrency:10 completion:^(NSDictionary *parameters, NSError *error) {
     if (error) {
       NSLog(@"spendCurrency error:%@", [error localizedDescription]);
     } else {
       NSLog(@"spendCurrency returned %@: %d", parameters[@"currencyName"], [parameters[@"amount"] intValue]);
     }
   }];
   ```

   완료 블록에서 재화 잔액에 대한 알림을 받게 되며, 파라미터 `currencyName`는 재화 이름을 제공하고, `amount`는 사용자의 잔액을 제공합니다.

2. **Android**

   ```java title="Java"
     Tapjoy.spendCurrency(10, new TJSpendCurrencyListener() {
       @Override
       public void onSpendCurrencyResponse(String currencyName, int balance) {
         Log.i("Tapjoy", currencyName + ": " + balance);
       }

       @Override
       public void onSpendCurrencyResponseFailure(String error) {
         Log.i("Tapjoy", "spendCurrency error: " + error);
       }
     });
   ```

   지정한 `TJSpendCurrencyListener`의 `onSpendCurrencyResponse(String currencyName, int balance)` 콜백 메서드에서 재화 잔액에 대한 알림을 받게 됩니다. `onSpendCurrencyResponseFailure(String error)` 메서드에서 오류가 발생하면 알림을 받게 됩니다.

3. **Unity**

   ```csharp title="C#"
   // Spend currency
   Tapjoy.SpendCurrency(10);

   // on enable, add delegates
   void OnEnable() {
     Tapjoy.OnSpendCurrencyResponse += HandleSpendCurrencyResponse;
     Tapjoy.OnSpendCurrencyResponseFailure += HandleSpendCurrencyResponseFailure;
   }

   // on disable, remove delegates
   void OnDisable() {
     Tapjoy.OnSpendCurrencyResponse -= HandleSpendCurrencyResponse;
     Tapjoy.OnSpendCurrencyResponseFailure -= HandleSpendCurrencyResponseFailure;
   }

   public void HandleSpendCurrencyResponse(string currencyName, int balance) {
     Debug.Log("C#: HandleSpendCurrencyResponse: currencyName: " + currencyName + ", balance: " + balance);
   }
     
   public void HandleSpendCurrencyResponseFailure(string error) {
     Debug.Log("C#: HandleSpendCurrencyResponseFailure: " + error);
   }
   ```

   지정한 `OnSpendCurrencyResponse` 핸들러에서 재화 잔액에 대한 알림을 받게 되며, 이 핸들러는 `currencyName` 및 `balance` 파라미터를 전달합니다. `OnSpendCurrencyResponseFailure` 핸들러에서 오류가 발생하면 알림을 받게 됩니다.

4. **React Native**

   ```javascript title="JavaScript"
   try {
     let result = await Tapjoy.spendCurrency(10);
       let currencyName = result['currencyName'];
       let amount = result['amount'];
   } catch (error: any) {
       //Handle error
   }
   ```

   React Native에서 `spendCurrency(),`에 프러미스를 사용하며, `amount`를 파라미터로 받습니다. 프러미스는 사전 또는 오류(이 오류는 처리되어야 함)로 해결됩니다. 딕셔너리 키에는 `currencyName` 재화 금액이 포함된 문자열이 있습니다.

5. **Adobe Air**

   ```java title="Java"
     // Spend currency
     TapjoyAIR.spendCurrency(10);

     // Setup handlers
     TapjoyAIR.addEventListener(TJCurrencyEvent.SPEND_CURRENCY_SUCCESS, tapjoyCurrencyEventHandler);
     TapjoyAIR.addEventListener(TJCurrencyEvent.SPEND_CURRENCY_FAILURE, tapjoyCurrencyEventHandler);

     private function tapjoyCurrencyEventHandler(event:TJCurrencyEvent):void {
       trace("Tapjoy sample event listener for " + event.type + ", " + event.balance + ", " + event.currencyName);
     }
   ```

   지정한 `TJCurrencyEvent.SPEND_CURRENCY_SUCCESS` 핸들러에서 재화 잔액에 대한 알림이 전달되며, 이 핸들러는 `TJCurrencyEvent` 파라미터를 전달합니다. 이 오브젝트에는 `currencyName` 및 `balance` 등록 정보가 포함되어 있습니다. `TJCurrencyEvent.SPEND_CURRENCY_FAILURE` 핸들러에서 오류가 발생하면 알림을 받게 됩니다.

## 탭조이 관리형 재화 보상##award-tapjoy-managed-currency

> **Warning:**
>
> 신규 앱에서 이 기능을 사용하려면 세일즈 담당자에게 문의하여 승인을 받으십시오.

사용자의 가상 재화에 보상을 지급하려면 다음 섹션에 자세히 안내된 플랫폼별 메서드를 사용합니다.

1. **iOS**

   ```objective-c title="Objective-C"
   // This method call will award 10 virtual currencies to the user's total.
   [Tapjoy awardCurrency:10 completion:^(NSDictionary *parameters, NSError *error) {
     if (error) {
       NSLog(@"awardCurrency error:%@", [error localizedDescription]);
     } else {
       NSLog(@"awardCurrency returned %@: %d", parameters[@"currencyName"], [parameters[@"amount"] intValue]);
     }
   }];
   ```

   `completion` 블록에서 재화 잔액에 대한 알림을 받게 되며, 파라미터 `currencyName`는 재화 이름을 제공하고, `amount`는 사용자의 잔액을 제공합니다.

2. **Android**

   ```java title="Java"
     Tapjoy.awardCurrency(10, new TJAwardCurrencyListener() {
       @Override
       public void onAwardCurrencyResponseFailure(String error) {
         Log.i("Tapjoy", "awardCurrency error: " + error);					}

       @Override
       public void onAwardCurrencyResponse(String currencyName, int balance) {
         Log.i("Tapjoy", currencyName + ": " + balance);
       }
     });
   ```

   지정한 `TJAwardCurrencyListener`의 `onAwardCurrencyResponse(String currencyName, int balance)` 콜백 메서드에서 재화 잔액에 대한 알림을 받게 됩니다.

3. **Unity**

   ```csharp title="C#"
   // Award currency
   Tapjoy.AwardCurrency(10);

   // on enable, add delegates
   void OnEnable() {
     Tapjoy.OnAwardCurrencyResponse += HandleAwardCurrencyResponse;
     Tapjoy.OnAwardCurrencyResponseFailure += HandleAwardCurrencyResponseFailure;
   }

   // on disable, remove delegates
   void OnDisable() {
     Tapjoy.OnAwardCurrencyResponse -= HandleAwardCurrencyResponse;
     Tapjoy.OnAwardCurrencyResponseFailure -= HandleAwardCurrencyResponseFailure;
   }

   public void HandleAwardCurrencyResponse(string currencyName, int balance) {
     Debug.Log("C#: HandleAwardCurrencySucceeded: currencyName: " + currencyName + ", balance: " + balance);
   }
     
   public void HandleAwardCurrencyResponseFailure(string error) {
     Debug.Log("C#: HandleAwardCurrencyResponseFailure: " + error);
   }
   ```

   지정한 `OnAwardCurrencyResponse` 핸들러에서 재화 잔액에 대한 알림을 받게 되며, 이 핸들러는 `currencyName` 및 `balance` 파라미터를 전달합니다. `OnAwardCurrencyResponseFailure` 핸들러에서 오류가 발생하면 알림을 받게 됩니다.

4. **React Native**

   ```javascript title="JavaScript"
   try {
     let result = await Tapjoy.awardCurrency(10);
       let currencyName = result['currencyName'];
       let amount = result['amount'];
   } catch (error: any) {
       //Handle error
   }
   ```

   React Native에서 `awardCurrency()`에 프러미스를 사용하며, `amount`를 파라미터로 받습니다. 프러미스는 사전 또는 오류(이 오류는 처리되어야 함)로 해결됩니다. 딕셔너리 키에는 `currencyName` 재화 금액이 포함된 문자열이 있습니다.

5. **Adobe Air**

   ```java title="Java"
   // Award currency
   TapjoyAIR.awardCurrency(10);

   // Setup handlers
   TapjoyAIR.addEventListener(TJCurrencyEvent.AWARD_CURRENCY_SUCCESS, tapjoyCurrencyEventHandler);
   TapjoyAIR.addEventListener(TJCurrencyEvent.AWARD_CURRENCY_FAILED, tapjoyCurrencyEventHandler);

   private function tapjoyCurrencyEventHandler(event:TJCurrencyEvent):void {
     trace("Tapjoy sample event listener for " + event.type + ", " + event.balance + ", " + event.currencyName);
   }
   ```

   지정한 `TJCurrencyEvent.AWARD_CURRENCY_SUCCESS` 핸들러에서 재화 잔액에 대한 알림이 전달되며, 이 핸들러는 `TJCurrencyEvent` 파라미터를 전달합니다. 이 오브젝트에는 `currencyName` 및 `balance` 등록 정보가 포함되어 있습니다. `TJCurrencyEvent.AWARD_CURRENCY_FAILURE` 핸들러에서 오류가 발생하면 알림을 받게 됩니다.

## 탭조이 관리형 재화 테스트##test-tapjoy-managed-currency

오퍼월의 오퍼를 테스트하려면 애플리케이션에 테스트 디바이스를 추가합니다. 이렇게 하면 테스트 오퍼가 확인을 위해 오퍼월 상단에 표시됩니다.

## 베스트 프랙티스 및 추가 정보##best-practices-and-additional-information

* 항상 `awardCurrency`와 `spendCurrency` 호출을 확인하고, 호출이 성공할 때만 콘텐츠를 잠금 해제합니다. 호출이 실패하면 디바이스 내 잔액이 손상될 수 있습니다.
* 로컬에 저장된 재화 정보에만 의존하지 마시고, 정확성을 위해 탭조이의 서버를 활용합니다.
* 콘텐츠 잠금을 해제하기 위해 재화를 차감할 때만 spendCurrency를 호출합니다.
* 관리형 재화는 앱 ID당 하나의 재화만 지원합니다. 여러 재화를 사용하려면 자체 관리형 재화를 사용하십시오.
* 탭조이는 디바이스 및 앱별로 재화 잔액을 저장하여 디바이스 간 재화 잔액 공유를 방지합니다.
* 탭조이는 신속한 보상을 목표로 하고 있지만, 여러 가지 요인으로 인해 재화 보상이 지연될 수 있습니다. 주요 앱 이벤트가 발생한 후에는 정기적으로 잔여 용량을 확인하고, 사용자에게 발생할 수 있는 지연 사항을 알립니다.
