# 업데이트 가이드

> 탭조이 오퍼월 iOS SDK 버전을 올바르게 업데이트하여 문제 발생을 방지하고 호환성을 유지합니다.

이 가이드에서는 하나의 Offerwall SDK 버전에서 다른 버전으로 업데이트할 때 필요한 단계를 설명합니다. 모든 단계를 수행하여 문제나 충돌이 발생하는 것을 방지합니다.

아래에서는 특정 버전의 Offerwall SDK로 업데이트할 때 필요한 추가 단계를 설명합니다.

## 14.3.0##14.3.0

* `[Tapjoy setDebugEnabled:YES]`의 모든 사용을 `[Tapjoy setLoggingLevel:TJLoggerLevelDebug]`로 대체합니다. 이전 방법은 지원이 중단되었습니다.

* 로그 레벨은 다음과 같습니다. 오류, 경고, 정보, 디버그

* `TJC_OPTION_ENABLE_LOGGING`의 모든 사용을 `TJC_OPTION_LOGGING_LEVEL`로 대체합니다. 이전 방법은 지원이 중단되었습니다.

## 14.2.0##14.2.0

* 지원 중단된 TJPlacement didClick 콜백의 모든 사용을 제거합니다. 다음 메이저 버전에서 제거되며 더 이상 아무 기능도 하지 않습니다.
* 지원 중단된 getSupportURL 메서드의 모든 사용을 제거합니다. 다음 메이저 버전에서 제거되며 더 이상 아무 기능도 하지 않습니다.

## 14.0.0##14.0.0

* 지원 중단된 `[Tapjoy trackPurchase]` 메서드의 사용을 `trackPurchaseWithCurrencyCode:(NSString *)currencyCode price:(double)price`로 대체합니다.

## 13.4.0##13.4.0

새로운 `connectWarning` 콜백이 추가되었습니다. 연결 중에 블로킹 이외 문제가 발생할 때 작동하며, 이후 `connectSuccess`가 작동합니다. 현재 이 기능은 ConnectFlags에서 전송된 경우에만 UserId 관련 문제를 감지합니다.

1. **Objective-C**

   ```objective-c
   [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(tjcConnectWarning:) name:TJC_CONNECT_WARNING object:nil];

   - (void)tjcConnectWarning:(NSNotification *)notifyObj 
   {
       NSError *error = notifyObj.userInfo[TJC_CONNECT_USER_INFO_ERROR];
       NSError *underlyingError = error.userInfo[NSUnderlyingErrorKey];
   }
   ```

2. **Swift**

   ```swift
   NotificationCenter.default.addObserver(self, selector: #selector(AppDelegate.tjcConnectWarning(notif:)), name: NSNotification.Name(rawValue: TJC_CONNECT_WARNING), object: nil)

   @objc func tjcConnectWarning(notif: NSNotification) {
       var message = "Tapjoy Connect Warning"
       if let error = notif.userInfo?[TJC_CONNECT_USER_INFO_ERROR] as? NSError {
           message.append("\nError: \(error.code) - \(error.localizedDescription)")
           if let underlyingError = error.userInfo[NSUnderlyingErrorKey] as? NSError {
               message.append("\nUnderlying Error: \(underlyingError.code) - \(underlyingError.localizedDescription)")
           }
       }
   }
   ```

## 13.2.0##13.2.0

### Connect##connect

오류 코드 및 메시지 파라미터를 `connectFailure` 콜백에 추가했습니다. 이전 콜백은 지원이 중단되었지만 계속 작동합니다.

1. **Objective-C**

   ```objective-c
   NSError *error = notifyObj.userInfo[TJC_CONNECT_USER_INFO_ERROR];
   NSInteger code = error.code;
   NSString *message = error.localizedDescription;
   NSString *underlyingErrorMessage = underlyingError != nil ? [NSString stringWithFormat:@" - %li %@", underlyingError.code, underlyingError.localizedDescription] : @""; 
   ```

2. **Swift**

   ```swift
   if let error = notif.userInfo?[TJC_CONNECT_USER_INFO_ERROR] as? NSError {
       let code = error.code
       let message = error.localizedDescription
       if let underlyingError = error.userInfo[NSUnderlyingErrorKey] as? NSError {
           let underlyingErrorMessage = "\nUnderlying Error: \(underlyingError.code) - \(underlyingError.localizedDescription)"
       }
   }
   ```

### 최대 사용자 레벨##max-user-level

이제 게임의 레벨 개수를 설정할 수 있습니다. 연결 전이나 후에 설정할 수 있습니다.

1. **Objective-C**

   ```objective-c
   [Tapjoy setMaxLevel:10]; 
   ```

2. **Swift**

   ```swift
   Tapjoy.setMaxLevel(10) 
   ```

### 사용자 세그먼트##user-segment

이제 현재 앱을 사용하는 사용자 유형을 설정할 수 있습니다. 연결 전후나 세션 중에 설정할 수 있습니다.

1. **Objective-C**

   ```objective-c
   [Tapjoy setUserSegment:TJSegmentVIP];
   [Tapjoy setUserSegment:TJSegmentPayer];
   [Tapjoy setUserSegment:TJSegmentNonPayer];
   [Tapjoy setUserSegment:TJSegmentUnknown]; 
   ```

2. **Swift**

   ```swift
   Tapjoy.setUserSegment(TJSegment.VIP)
   Tapjoy.setUserSegment(TJSegment.payer)
   Tapjoy.setUserSegment(TJSegment.nonPayer)
   Tapjoy.setUserSegment(TJSegment.unknown) 
   ```

### 엔트리 포인트##entry-point

\_request connect\_를 호출하기 전에 엔트리 포인트를 설정할 수 있습니다. 이는 앱에서 플레이스먼트가 표시되는 위치를 설명합니다. 여러 프리셋 값 중 하나를 선택할 수 있습니다.

1. **Objective-C**

   ```objective-c
   TJPlacement *placement = [TJPlacement placementWithName:@"myPlacement" delegate:nil];
   [placement setEntryPoint:TJEntryPointMainMenu];
   [placement requestContent]; 

   // Values available
   TJEntryPointUnknown //Not set, but removes any value that was already set
   TJEntryPointOther
   TJEntryPointMainMenu
   TJEntryPointHud
   TJEntryPointExit
   TJEntryPointFail
   TJEntryPointComplete
   TJEntryPointInbox 
   TJEntryPointInitialisation
   TJEntryPointStore 
   ```

2. **Swift**

   ```swift
   let placement = TJPlacement(name: "myPlacement", delegate: nil)
   placement?.entryPoint = TJEntryPoint.mainMenu
   placement?.requestContent() 

   // Values available
   TJEntryPoint.unknown
   TJEntryPoint.other
   TJEntryPoint.mainMenu
   TJEntryPoint.hud
   TJEntryPoint.exit
   TJEntryPoint.fail
   TJEntryPoint.complete
   TJEntryPoint.inbox
   TJEntryPoint.initialisation
   TJEntryPoint.store
   ```

### 재화##currency

* get, spend, earn에서는 이제 음수 값을 사용할 수 없습니다.
* 자체 관리형 재화가 관리형 재화 API를 호출하면 오류가 반환됩니다.

이제 플레이스먼트를 생성하기 전에 사용자 잔액을 설정할 수 있습니다. *requestContent* 이전에 설정해야 합니다.

1. **Objective-C**

   ```objective-c
   TJPlacement* placement = [TJPlacement placementWithName:@"placementName" delegate:nil];
   [placement setBalance:100 forCurrencyId:@"1234" withCompletion:^(NSError * _Nullable error) {
       if (error != nil) {
           //Failure
           NSString *message = error.localizedDescription;
       } else {
           //Success
       }
   }]; 
   ```

2. **Swift**

   ```swift
   let placement = TJPlacement(name: "placementName", delegate: nil)
   placement?.setBalance(100, forCurrencyId: "1234", withCompletion: { error in
       if let error = error {
           //Failure
           let message = error.localizedDescription
       } else {
           //Success
       }
   }) 
   ```

사용자가 각 플레이스먼트에서 목표를 달성하는 데 필요한 재화를 설정할 수도 있습니다.

1. **Objective-C**

   ```objective-c
   TJPlacement* placement = [TJPlacement placementWithName:@"placementName" delegate:nil];
   placement setRequiredAmount:100 forCurrencyId:@"1234" withCompletion:^(NSError * _Nullable error) {
       if (error != nil) {
           //Failure
           NSString *message = error.localizedDescription;
       } else {
           //Success
       }
   } 
   ```

2. **Swift**

   ```swift
   let placement = TJPlacement(name: "placementName", delegate: nil)
   placement?.setRequiredAmount(100, forCurrencyId: "1234", withCompletion: { error in
       if let error = error {
           //Failure
           let message = error.localizedDescription
       } else {
           //Success
       }
   }) 
   ```

## 12.8.0##12.8.0

이제 Offerwall SDK에서 XCFramework를 사용하며 별도의 리소스 번들은 필요하지 않습니다. `Tapjoy.xcframework`를 추가하기 전에 `Tapjoy.framework`와 `TapjoyResources.bundle`을 삭제합니다.
