# 快速入门

> 使用 CocoaPods 或 Swift Package Manager 将 Tapjoy Offerwall 集成到 iOS 应用中，快速启用 Offerwall 功能。

## SDK 集成##sdk-integration

### Cocoapods##cocoapods

[CocoaPods](https://cocoapods.org/) 是 Objective-C 和 Swift 的依赖项管理器。

要使用 Tapjoy，请将其添加到 podfile：

```swift
    platform :ios, '13.0'
    source 'https://github.com/CocoaPods/Specs.git'

    use_frameworks!

    target 'MyApp' do
        pod 'TapjoySDK'
    end
```

使用 Cocoapods 进行集成时，我们提供了静态或动态框架选项。默认为静态。要选择动态框架，您可以将以下代码添加到 podfile 中：

```swift
pod 'TapjoySDK/Dynamic'
```

### Swift Package Manager##swift-package-manager

从 SDK v13.4.0 开始，我们支持 Swift Package Manager。

转到 *File（文件）> Add Packages Dependancies（添加包依赖项）*。在右上角搜索栏中，粘贴代码仓库 `https://github.com/Tapjoy/swift-packages.git`，然后选择 **Add Package（添加包）**。

## 请求应用追踪透明度授权##request-app-tracking-transparency-authorization

如果应用程序需要使用[应用追踪透明度](https://developer.apple.com/documentation/apptrackingtransparency)框架，为了显示 IDFA 访问权限请求对话框，请更新 Info.plist，在其中包含 `NSUserTrackingUsageDescription` 键以及自定义消息（描述在应用程序中需要此权限才能使用 IDFA）。

例如：

```text
<key>NSUserTrackingUsageDescription</key>
<string>This allows us to deliver personalized ads for you.</string>
```

![包含 NSUserTrackingUsageDescription 键的信息属性列表。](/api/media?file=/grow/media/images/att-desc-plist.png)

此用途描述文本随后将显示在应用追踪透明度权限对话框中，如以下屏幕截图所示：

![iOS app Tracking Transparency 权限对话框。](/api/media?file=/grow/media/images/att-desc-ios.png)

将 `AppTrackingTransparency` 框架添加到您的项目中，然后调用 `requestTrackingAuthorizationWithCompletionHandler:` 来显示授权提示。建议最好在连接到 Tapjoy 之前等待 `requestTrackingAuthorization` 完成处理程序，以便可以确定在所有请求中都使用了预期的 IDFA 值。

```objective-c title="Objective-C" 
#import <apptrackingtransparency apptrackingtransparency.h>
... 
- (void)fetchTrackingAuthorization { [ATTrackingManager requestTrackingAuthorizationWithCompletionHandler:^(ATTrackingManagerAuthorizationStatus status)
{ // Call the Offerwall connect function here. 
}]; 
} 
```

```swift title="Swift"
import AppTrackingTransparency
...
func fetchTrackingAuthorization() {
  ATTrackingManager.requestTrackingAuthorization(completionHandler: { status in
    // Call the Offerwall connect function here.
  })
}
```

## 连接到 Tapjoy##connect-to-tapjoy

下一步是将 Tapjoy connect 代码添加到您的应用程序中。这段关键代码将在应用程序中“激活”Offerwall SDK。

> **Note:**
>
> Tapjoy connect 调用极其重要，因为如果未能正确实现，Tapjoy 的所有产品或功能都将无法使用。

为了实现 Tapjoy connect 调用，需要为要集成的应用程序提供 Offerwall SDK 密钥。要查找此密钥，请在 Tapjoy 后台中导航到您的应用程序，然后选择顶部导航栏上的“Settings（设置）”按钮。导航到“App Settings（应用设置）”，
然后在页面底部找到 SDK 密钥。

现在，将以下代码片段放到应用程序的应用委托文件中的 `application:didFinishLaunchingWithOptions` 方法内：

```objective-c title="Objective-C"
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(tjcConnectSuccess:) name:TJC_CONNECT_SUCCESS object:nil];
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(tjcConnectFail:) name:TJC_CONNECT_FAILED object:nil];
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(tjcConnectWarning:) name:TJC_CONNECT_WARNING object:nil];

    //Turn on Tapjoy debug mode
    [Tapjoy setLoggingLevel:TJLoggerLevelDebug]; //Only enable debug mode for development.Disable it before publishing your app.

    //If you are using Self-Managed currency, you need to set a user ID using the connect flags.
    NSDictionary *connectFlags = @{TJC_OPTION_USER_ID : @"<USER_ID_HERE>"};
    [Tapjoy connect:@"SDK_KEY_GOES_HERE" options:connectFlags];
    
    //If you are not using connect flags, you can omit them
    [Tapjoy connect:@"SDK_KEY_GOES_HERE"];

    return YES;
}
```

```swift title="Swift"
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {

    NotificationCenter.default.addObserver(self, selector: #selector(AppDelegate.tjcConnectSuccess(notif:)), name: NSNotification.Name(rawValue: TJC_CONNECT_SUCCESS), object: nil)
    
    NotificationCenter.default.addObserver(self, selector: #selector(AppDelegate.tjcConnectFail(notif:)), name: NSNotification.Name(rawValue: TJC_CONNECT_FAILED), object: nil)

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

    //Turn on Tapjoy debug mode
    Tapjoy.loggingLevel = .debug //Only enable debug mode for development. Disable it before publishing your app.
    
    //If you are using Self-Managed currency, you need to set a user ID using the connect flags.
    let connectFlags = [TJC_OPTION_USER_ID : "<USER_ID_HERE>"]
    Tapjoy.connect("SDK_KEY_GOES_HERE", options: connectFlags)
    
    //If you are not using connect flags, you can omit them
    Tapjoy.connect("SDK_KEY_GOES_HERE")
    
    return true
}
```

应在 connect 调用之前定义 `setLoggingLevel` 方法。建议使用连接标志来设置用户 ID。这样，在调用时，AppLaunch 广告位可以获取到正确的用户 ID。

如需了解更多信息，请查看我们的 SDK 参考：[Objective C](https://ltv.tapjoy.com/sdk/api/objc/Classes/Tapjoy.html) 和 [C++](https://ltv.tapjoy.com/sdk/api/cpp/index.html)。

### 连接通知##connect-notifications

为了在 Tapjoy 成功连接、已连接但有警告或连接失败时收到相关通知，您需要实现我们先前设置为选择器的方法。当连接过程中出现非阻塞问题时，`connectWarning` 回调将触发（并且 `connectSuccess` 也会在之后触发）。目前，此功能仅用于检测在 ConnectFlags 中发送的 UserId 的相关问题。

```objective-c title="Objective-C"
- (void)tjcConnectSuccess:(NSNotification *)notifyObj 
{
    NSLog(@"Tapjoy connect succeeded");
}

- (void)tjcConnectFail:(NSNotification *)notifyObj
{
    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] : @"";
    NSLog(@"%@", underlyingErrorMessage);
}

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

```swift title="Swift"
@objc func tjcConnectSuccess(notif: NSNotification) {
    NSLog("Tapjoy connect succeeded")
}

@objc func tjcConnectFail(notif: NSNotification) {
    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)"
            NSLog(underlyingErrorMessage);
        }
    }
}

@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)")
        }
    }
}
```

现在编译并运行您的应用程序。如果您正确执行了所有操作，控制台日志中将显示类似以下内容的输出：

```swift
        2020-01-29 16:01:55.422 App Name[25869:1433019] [TJLog level: 4] Connect success with type:0
```

### 最大用户等级##max-user-level

您可以告诉 Tapjoy 您的游戏中有多少关卡。此值可以在调用 connect 之前或之后设置。

```objective-c title="Objective-C"
[Tapjoy setMaxLevel:10]; 
```

```swift title="Swift"
Tapjoy.setMaxLevel(10) 
```

### 用户细分段##user-segment

您可以通过调用 `setUserSegment` 将用户标识为某个细分段的一部分。此设置可以在调用 connect 之前或之后进行。

```objective-c title="Objective-C"
[Tapjoy setUserSegment:TJSegmentVIP];
[Tapjoy setUserSegment:TJSegmentPayer];
[Tapjoy setUserSegment:TJSegmentNonPayer];
[Tapjoy setUserSegment:TJSegmentUnknown]; 
```

```swift title="Swift"
Tapjoy.setUserSegment(TJSegment.VIP)
Tapjoy.setUserSegment(TJSegment.payer)
Tapjoy.setUserSegment(TJSegment.nonPayer)
Tapjoy.setUserSegment(TJSegment.unknown) 
```
