# 빠른 시작

> CocoaPods나 Swift 패키지 관리자를 사용하여 탭조이 오퍼월을 iOS 앱에 연동해 오퍼월 기능을 빠르게 활성화합니다.

## SDK 연동##sdk-integration

### CocoaPods##cocoapods

[CocoaPods](https://cocoapods.org/)는 Objective-C와 Swift의 종속성 관리자입니다.

탭조이를 사용하려면 이를 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 패키지 관리자##swift-package-manager

SDK v13.4.0부터 Swift 패키지 관리자를 지원합니다.

\_File > Add Packages Dependencies\_로 이동합니다. 오른쪽 상단의 검색창에 `https://github.com/Tapjoy/swift-packages.git` 저장소를 붙여 넣고 **Add Package**를 선택합니다.

## 앱 트래킹 투명성 승인 요청##request-app-tracking-transparency-authorization

애플리케이션이 [앱 트래킹 투명성](https://developer.apple.com/documentation/apptrackingtransparency)을 사용하도록 설계된 경우 IDFA에 대한 액세스 권한을 요청하는 다이얼로그를 표시하려면 애플리케이션에서 IDFA 사용 권한을 설명하는 커스텀 메시지와 함께 `NSUserTrackingUsageDescription` 키를 포함하여 Info.plist를 업데이트합니다.

예제는 아래와 같습니다.

```text
<key>NSUserTrackingUsageDescription</key>
<string>이렇게 하면 개인화된 광고를 제공할 수 있습니다.</string>
```

![NSUserTrackingUsageDescription 키가 포함된 정보 프로퍼티 목록입니다.](/api/media?file=/grow/media/images/att-desc-plist.png)

그러면 아래 스크린샷과 같이 사용 설명 텍스트가 앱 트래킹 투명성 권한 다이얼로그의 일부로 표시됩니다.

![iOS 앱 트래킹 투명성 권한 다이얼로그.](/api/media?file=/grow/media/images/att-desc-ios.png)

프로젝트에 `AppTrackingTransparency` 프레임워크를 추가한 다음 `requestTrackingAuthorizationWithCompletionHandler:`를 호출하여 인증 프롬프트를 표시합니다. 베스트 프랙티스는 탭조이로 연결하기 전에 `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.
  })
}
```

## 탭조이에 연결##connect-to-tapjoy

다음 단계로, 애플리케이션에 탭조이 연결 코드를 추가합니다. 이 코드의 키 비트는 애플리케이션에서 Offerwall SDK를 ‘활성화’합니다.

> **Note:**
>
> 탭조이 연결 호출이 제대로 구현되지 않으면 탭조이의 제품이나 기능이 작동하지 않으므로 이 연결 호출은 매우 중요합니다.

탭조이 연결 호출을 구현하려면 연동하려는 애플리케이션에 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. 앱을 퍼블리싱하기 전에 비활성화합니다.

    //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. 앱을 퍼블리싱하기 전에 비활성화합니다.
    
    //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
}
```

연결 호출 전에 `setLoggingLevel` 메서드를 정의해야 합니다. 연결 플래그를 사용하여 사용자 ID를 설정하는 것이 좋습니다. 이렇게 하면 AppLaunch 플레이스먼트에서는 호출 시 적절한 사용자 ID를 검색할 수 있습니다.

자세한 내용은 Unity 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

탭조이가 연결을 완료하거나, 경고로 연결되었거나, 연결에 실패했을 때 알림을 받으려면 이전에 선택자로 설정한 메서드를 구현해야 합니다. 연결 중에 블로킹 이외 문제가 발생하면(또는`connectSuccess` 이후에도) `connectWarning` 콜백이 작동합니다. 현재 이 기능은 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

게임의 레벨 수를 탭조이에 제공할 수 있습니다. 이 값은 연결을 호출하기 전이나 후에 설정 가능합니다.

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

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

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

`setUserSegment`를 호출하여 사용자를 세그먼트의 일부로 식별할 수 있습니다. 이는 연결 호출 전이나 후에 설정할 수 있습니다.

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