# 更新指南

> 正确更新 Tapjoy Offerwall iOS SDK 版本以避免问题并维持兼容性。

本指南介绍从一个 Offerwall SDK 版本更新到另一个版本时所需的步骤，建议您执行所有步骤以防止发生任何问题或冲突。

下面将介绍更新到特定的 Offerwall SDK 版本时所需的额外步骤。

## 14.3.0##14.3.0

* 将 `[Tapjoy setDebugEnabled:YES]` 的所有用例替换为 `[Tapjoy setLoggingLevel:TJLoggerLevelDebug]`。前者已弃用。

* 日志级别为：Error（错误）、Warning（警告）、Info（信息）和 Debug（调试）。

* 将 `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

我们向 `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

在调用\_请求连接\_之前，可以设置入口点。该设置用于指定广告位将在应用中的显示位置。您可以从多个预设值中选择一个值。

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`。
