> ## Documentation Index
> Fetch the complete documentation index at: https://help.airbridge.io/llms.txt
> Use this file to discover all available pages before exploring further.

# iOS SDK (Deprecated)

![GitHub Tag](https://img.shields.io/github/v/tag/ab180/airbridge-ios-sdk-deploy?style=flat\&label=Airbridge%20iOS%20SDK)

<Danger>
  **Deprecated SDK**

  이 SDK는 Deprecated 되었습니다. 최신 버전인 [iOS SDK v4](/ko/developers/ios-sdk-v4)로 전환하세요.
</Danger>

## SDK 설치

<Danger>
  iOS SDK 1.35.1미만에는 알려진 이슈가 있습니다. 원활한 SDK 사용을 위해 1.35.1이상을 사용해주세요.
</Danger>

### 패키지 설치

#### CocoaPods

1. 아래와 같은 명령어로 `Podfile`파일을 생성해주세요.

```bash lines theme={"theme":{"light":"github-dark-dimmed","dark":"github-dark-dimmed"}}
cd path/to/project
touch Podfile
```

2. `Podfile`파일 내용을 아래와 같이 채워주세요.

```ruby Podfile lines theme={"theme":{"light":"github-dark-dimmed","dark":"github-dark-dimmed"}}
target '[Project Name]' do
    pod 'AirBridge', '1.40.0'
end
```

<Note>
  Airbridge iOS SDK 1.18.0 이상은 CocoaPods 1.11.0 이상이 필요합니다.
</Note>

3. 터미널을 여시고 아래와 같은 명령어를 입력해주세요.

```bash lines theme={"theme":{"light":"github-dark-dimmed","dark":"github-dark-dimmed"}}
cd path/to/project
pod install --repo-update
```

<Note>
  pod 명령어가 없을 경우, cocoapods 를 설치해주세요.

  * `sudo gem install cocoapods`
</Note>

#### SPM

Swift Package Manager(SPM)를 통해 iOS SDK를 설치할 수 있습니다. SPM을 지원하는 SDK 버전은 `1.23.0` 이상 입니다.

1. Xcode에서 File > Add packages로 이동합니다.

<Frame>
  <img src="https://mintcdn.com/airbridge-help-center/WgxACtbWtxE2BBF2/asset/image/xcode-add-package-menu.png?fit=max&auto=format&n=WgxACtbWtxE2BBF2&q=85&s=23ef9c90bddd071ba2dcaeb7aa76f486" alt="01-kr-dev-ios-sdk" width="1500" height="1333" data-path="asset/image/xcode-add-package-menu.png" />
</Frame>

2. Airbridge iOS SDK 추가하기 Apple Swift Package 윈도우가 나타나면 검색창에 Airbridge 패키지의 주소 [https://github.com/ab180/airbridge-ios-sdk-deploy](https://github.com/ab180/airbridge-ios-sdk-deploy)를 입력한 후 검색합니다. 이후 원하는 버전을 입력한 후 Add package 버튼을 클릭합니다.

<Frame>
  <img src="https://mintcdn.com/airbridge-help-center/WgxACtbWtxE2BBF2/asset/image/xcode-airbridge-package-search.png?fit=max&auto=format&n=WgxACtbWtxE2BBF2&q=85&s=26fc303a73452b6240ffc0eb2c29a670" alt="02-kr-dev-ios-sdk" width="1500" height="860" data-path="asset/image/xcode-airbridge-package-search.png" />
</Frame>

3. 원하는 타겟을 선택한 후 패키지를 추가합니다.

<Frame>
  <img src="https://mintcdn.com/airbridge-help-center/WgxACtbWtxE2BBF2/asset/image/xcode-package-product-selection.png?fit=max&auto=format&n=WgxACtbWtxE2BBF2&q=85&s=6358c34706f2ef1c62330d9685f4a79e" alt="03-kr-dev-ios-sdk" width="1500" height="861" data-path="asset/image/xcode-package-product-selection.png" />
</Frame>

4. SDK가 바르게 설치되었다면 `Package Dependencies`에 AirBridge가 표시됩니다.

<Frame>
  <img src="https://mintcdn.com/airbridge-help-center/WgxACtbWtxE2BBF2/asset/image/xcode-package-dependency-list.png?fit=max&auto=format&n=WgxACtbWtxE2BBF2&q=85&s=e431d629af85be475f55e10210d3c25f" alt="04-kr-dev-ios-sdk" width="1500" height="1084" data-path="asset/image/xcode-package-dependency-list.png" />
</Frame>

#### 직접 설치

AirBridge.framework : [다운로드](https://sdk-download.airbridge.io/frameworks/AirBridge.xcframework-1.40.0.zip)

###### 1. AirBridge.framework 추가

1. `Xcode > Project 파일 > General > Frameworks, Libraries, and Embedded Content`의 `+`버튼을 눌러주세요.
2. 좌측 하단의 `Add Other.. > Add Files..`를 클릭해 다운로드 받은 zip 파일내의 `AirBridge.xcframework` 폴더를 추가해주세요.
3. `AirBridge.xcframework` Embed 상태를 Embed & Sign 로 변경해주세요.

###### 2. Dependency framework 추가

1. `Xcode > Project 파일 > General > Frameworks, Libraries, and Embedded Content`로 이동해주세요.
2. `+`버튼을 눌러주세요.
3. 리스트에서 아래 6개의 `[Framework 이름].framework`를 찾아 추가해주세요.
4. 추가한 6개의 `[Framework 이름].framework`의 Embed 를 Do not Embed 로 설정해주세요.
5. `Xcode > Project 파일 > Build Phase > Link Binary With Libraries`로 이동해주세요.
6. 6개의`[Framework 이름].framework`의 Status 를 Optional 로 설정해주세요.

| Framework                         | 설명                                                        |
| --------------------------------- | --------------------------------------------------------- |
| AdSupport.framework               | IDFA 를 수집하는데 사용합니다.                                       |
| CoreTelephony.framework           | 통신사 정보를 수집하는데 사용합니다.                                      |
| StoreKit.framework                | SKAdNetwork 정보를 수집하는데 사용합니다.                              |
| AppTrackingTransparency.framework | Tracking 허용 상태정보를 수집하는데 사용합니다.                            |
| AdServices.framework              | Apple Search Ads Attribution 정보를 수집하는데 사용합니다. (iOS 14.3+) |
| WebKit.framework                  | Web SDK와 연동하여 이벤트를 수집하는데 사용합니다.                           |

### 프로젝트 설정

다음 코드를 `AppDelegate`의 `application(_:didFinishLaunchingWithOptions:)`의 최상단에 추가해 SDK를 초기합니다.

<CodeGroup>
  ```objective-c Objective-C lines theme={"theme":{"light":"github-dark-dimmed","dark":"github-dark-dimmed"}}
  #import <AirBridge/AirBridge.h>

  - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary*)launchOptions {
      [AirBridge getInstance:@"YOUR_APP_SDK_TOKEN" appName:@"YOUR_APP_NAME" withLaunchOptions:launchOptions];
      ...
  }
  ```

  ```swift Swift lines theme={"theme":{"light":"github-dark-dimmed","dark":"github-dark-dimmed"}}
  import AirBridge

  func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
      AirBridge.getInstance("YOUR_APP_SDK_TOKEN", appName:"YOUR_APP_NAME", withLaunchOptions:launchOptions)
      // ...
  }
  ```
</CodeGroup>

`AppDelegate`가 존재하지 않는 `SwiftUI` 환경을 사용할 경우 일반적으로 `@main`이 존재하는 App 클래스에서 SDK를 초기화합니다.

<CodeGroup>
  ```swift Swift lines theme={"theme":{"light":"github-dark-dimmed","dark":"github-dark-dimmed"}}
  // YourprojectApp.swift

  import SwiftUI
  import AirBridge

  @main
  struct OnlyUIApp: App {
      init() {
          AirBridge.getInstance("YOUR_APP_SDK_TOKEN", appName: "YOUR_APP_NAME")
      }
      
      var body: some Scene {
          WindowGroup {
              ContentView()
          }
      }
  }
  ```
</CodeGroup>

`YOUR_APP_NAME`과 `YOUR_APP_SDK_TOKEN`은 `Airbridge 대시보드` > `Settings` > `Tokens` 탭에서 확인하실 수 있습니다.

#### IDFA 이용약관 동의

SDK 를 사용하기 위해서는 앱스토어에 앱을 게시할 때 **IDFA 이용약관 동의**가 필요합니다.

1. 'Yes' 항목에 체크해 주세요.
2. 아래 사진과 같은 화면이 나옵니다.
3. 'Attribute this app installation to a previously served advertisement.' 항목을 체크해 주세요.
4. 'Attribute an action taken within this app to a previously served advertisement' 항목을 체크해 주세요.
5. 'Limit Ad Tracking Setting in iOS' 항목을 체크해 주세요.

<Frame>
  <img src="https://mintcdn.com/airbridge-help-center/6CTRFgWYblklSTQJ/asset/image/apple-developer-idfa-settings.png?fit=max&auto=format&n=6CTRFgWYblklSTQJ&q=85&s=a573b170725c95c02553592d19c96dcf" alt="05-kr-dev-ios-sdk" width="1500" height="758" data-path="asset/image/apple-developer-idfa-settings.png" />
</Frame>

### SDK 설치 확인

앱을 설치하고 실행 했을때 Install 이벤트가 전송 되는지 확인해주세요.

#### 대시보드로 확인

SDK 에서 발생한 Event 들은 `Airbridge 대시보드` > `Raw Data` > `App Real-time Logs` 에 출력됩니다.

1. `Airbridge 대시보드` > `Raw Data`> `App Real-time Logs`항목을 클릭해 주세요.
2. `검색어 입력` 에 `iOS IDFA`를 입력해 주세요. 로그 노출은 최대 5분 가량 지연될 수 있습니다.

#### 로그로 확인

SDK 를 초기화하는 코드 상단에 다음 코드를 입력하면 SDK 로그가 출력됩니다.

<CodeGroup>
  ```objective-c Objective-C lines theme={"theme":{"light":"github-dark-dimmed","dark":"github-dark-dimmed"}}
  [AirBridge setLogLevel:AB_LOG_ALL];
  [AirBridge getInstance:@"YOUR_APP_SDK_TOKEN" appName:@"YOUR_APP_NAME" withLaunchOptions:launchOptions];
  ```

  ```swift Swift lines theme={"theme":{"light":"github-dark-dimmed","dark":"github-dark-dimmed"}}
  AirBridge.setLogLevel(.LOG_ALL)
  AirBridge.getInstance("YOUR_APP_SDK_TOKEN", appName:"YOUR_APP_NAME", withLaunchOptions:launchOptions)
  ```
</CodeGroup>

## 딥링크 설정

### 대시보드 설정

<Frame>
  <img src="https://mintcdn.com/airbridge-help-center/6CTRFgWYblklSTQJ/asset/image/ios-uri-scheme-app-id-ko.png?fit=max&auto=format&n=6CTRFgWYblklSTQJ&q=85&s=86c5eb6f5b382fcc31c0bef9d3ac1d2c" alt="06-kr-dev-ios-sdk" width="1500" height="859" data-path="asset/image/ios-uri-scheme-app-id-ko.png" />
</Frame>

`Airbridge 대시보드` > `Tracking Link` > `Deep Link` 에 아래 2가지 정보가 필요합니다.

* iOS URI Scheme
* iOS App ID

#### iOS URI Scheme

사용하기 원하는 scheme 을 에어브릿지 대시보드의 `iOS URI Scheme` 영역에 `://` 을 붙여 입력해주세요.

<Danger>
  **주의하세요**

  출시 앱 또는 출시 예정 앱과 개발용 앱의 URI 스킴을 다르게 등록해 주세요.

  출시 앱 또는 출시 예정 앱과 개발용 앱의 URI 스킴이 동일하면 딥링크가 작동하는 과정에서 의도하지 않은 앱이 실행될 수 있습니다.
</Danger>

#### iOS App ID

1. [https://developer.apple.com/account/resources](https://developer.apple.com/account/resources)의 `Identifiers`로 이동해 주세요.
2. Tracking 하고자하는 앱의 `Identifier`를 클릭해 주세요.
3. 해당 `Identifier`의 `App ID Prefix`+ `.`+ `Bundle ID`를 에어브릿지 대시보드의 `iOS App ID`영역에 입력해 주세요.
   * 예) 9JA89QQLNQ.com.apple.wwdc

<Frame>
  <img src="https://mintcdn.com/airbridge-help-center/6CTRFgWYblklSTQJ/asset/image/apple-developer-app-id-prefix-bundle-id.png?fit=max&auto=format&n=6CTRFgWYblklSTQJ&q=85&s=0bf6c20934f45e01ac76e4fd0bb02371" alt="07-kr-dev-ios-sdk" width="1500" height="535" data-path="asset/image/apple-developer-app-id-prefix-bundle-id.png" />
</Frame>

### 프로젝트 설정

#### Scheme

1. `Xcode`> `Project 파일`> `Info`> `URL Types`로 이동해주세요.
2. `URL Schemes`에 에어브릿지 대시보드에 입력한 `iOS URI Scheme`을 입력해주세요.

<Danger>
  **주의하세요**

  URI Scheme 입력 시 `://` 는 제외하고 입력해주세요.
</Danger>

<Frame>
  <img src="https://mintcdn.com/airbridge-help-center/yb7Ud8MfVkimM8iI/asset/image/xcode-url-scheme-field.png?fit=max&auto=format&n=yb7Ud8MfVkimM8iI&q=85&s=90fb7ff0d4103416ab30d49e0dcce627" alt="08-kr-dev-ios-sdk, 01-kr-dev-react-native-sdk" width="768" height="325" data-path="asset/image/xcode-url-scheme-field.png" />
</Frame>

#### Universal Link

1. `Xcode`> `Project 파일`> `Signing & Capabilities`로 이동해주세요.
2. `+ Capability`를 눌러 `Associated Domains`를 추가해주세요.
3. `Associated Domains`에 `applinks:YOUR_APP_NAME.airbridge.io`를 추가해주세요.
4. `Associated Domains`에 `applinks:YOUR_APP_NAME.abr.ge`를 추가해주세요.

<Note>
  `YOUR_APP_NAME` 은 대시보드의 `Settings > Tokens > 앱 이름` 에서 확인할 수 있습니다.
</Note>

<Note>
  Autofill 기능을 사용하는 경우, [Troubleshooting > Webcredentials](#webcredentials) 를 참조해주세요.
</Note>

#### SDK 에 Deeplink 정보 전달

###### AppDelegate를 사용하는 경우

iOS 12 및 이전 버전을 지원하는 앱의 경우 일반적으로 `AppDelegate`의 `application(_:open:options:)` 메서드에서 이벤트를 전달합니다.

1. `ios/[프로젝트 이름]/AppDelegate` 파일을 열어주세요.
2. 아래 함수의 최상단에서 `handleURLSchemeDeeplink` 함수를 호출해 App 이 Scheme으로 열렸을 때, SDK에 Deeplink 정보를 전달해주세요.

<CodeGroup>
  ```objective-c Objective-C lines theme={"theme":{"light":"github-dark-dimmed","dark":"github-dark-dimmed"}}
  - (BOOL)application:(UIApplication *)application
              openURL:(NSURL *)url
              options:(NSDictionary<UIApplicationOpenURLOptionsKey, id>*)options
  {
      [AirBridge.deeplink handleURLSchemeDeeplink:url];
      return YES;
  }
  ```

  ```swift Swift lines theme={"theme":{"light":"github-dark-dimmed","dark":"github-dark-dimmed"}}
  func application(_ app: UIApplication,
                   open url: URL,
                   options: [UIApplication.OpenURLOptionsKey : Any] = [:]) -> Bool
  {
      AirBridge.deeplink()?.handleURLSchemeDeeplink(url)

      return true
  }
  ```
</CodeGroup>

3. 아래 함수의 최상단에서 `handleUserActivity`함수를 호출해 App 이 Universal Link 로 열였을 때, SDK 에 Deeplink 정보를 전달해주세요.

<CodeGroup>
  ```objective-c Objective-C lines theme={"theme":{"light":"github-dark-dimmed","dark":"github-dark-dimmed"}}
  -  (BOOL)application:(UIApplication*)application
  continueUserActivity:(NSUserActivity*)userActivity
    restorationHandler:(void (^)(NSArray* _Nullable))restorationHandler
  {
      [AirBridge.deeplink handleUserActivity:userActivity];
      return YES;
  }
  ```

  ```swift Swift lines theme={"theme":{"light":"github-dark-dimmed","dark":"github-dark-dimmed"}}
  func application(_ application: UIApplication,
                   continue userActivity: NSUserActivity,
                   restorationHandler: @escaping ([UIUserActivityRestoring]?) -> Void) -> Bool
  {
      AirBridge.deeplink()?.handle(userActivity)

      return true
  }
  ```
</CodeGroup>

<Note>
  SceneDelegate를 사용하는 프로젝트의 경우 AppDelegate가 아닌 SceneDelegate로 URL이 전달됩니다. SceneDelegate로 URL을 받는 방법은 다음 섹션인 SceneDelegate를 사용하는 경우를 참고해주세요.
</Note>

###### SceneDelegate를 사용하는 경우

iOS 13 및 이후 버전을 지원하는 앱 중 `SceneDelegate`를 사용할 경우 다음 메소드로 딥링크가 전달됩니다.

* 앱이 Not running 상태에서 로드 될 경우: `scene(_:willConnectTo:options:)`
* 이외의 경우(ex. background)
  * Universal link : `scene(_:continue:)`
  * Scheme link : `scene(_:openURLContexts:)`

```swift lines theme={"theme":{"light":"github-dark-dimmed","dark":"github-dark-dimmed"}}
import UIKit
import AirBridge

@available(iOS 13, *)
class SceneDelegate: UIWindowSceneDelegate {
    var window: UIWindow?

    // Receive links after the app's killed 
    func scene(_ scene: UIScene, willConnectTo session: UISceneSession, options connectionOptions: UIScene.ConnectionOptions) {
        if let schemeLinkURL = connectionOptions.urlContexts.first?.url {
            // Scheme
            AirBridge.deeplink()?.handleURLSchemeDeeplink(schemeLinkURL)
        } else if let userActivity = connectionOptions.userActivities.first {
            // Universal
            AirBridge.deeplink()?.handle(userActivity)
        }
        
        // ...
    }
  
    // Receive universal link
    func scene(_ scene: UIScene, continue userActivity: NSUserActivity) {
        AirBridge.deeplink().handle(userActivity)
        // ...
    }
  
    // Receive scheme link
    func scene(_ scene: UIScene, openURLContexts URLContexts: Set<UIOpenURLContext>) {
        guard let schemeLinkURL = URLContexts.first?.url else {
             return
        }
        
        AirBridge.deeplink().handleURLSchemeDeeplink(schemeLinkURL)
        // ...
    }
}
```

##### AppDelegate와 SceneDelegate를 사용하지 않는 경우(`SwiftUI`)

SwiftUI를 사용하며 `SceneDelegate`를 사용하지 않는 경우 `onOpenUrl`로 딥링크를 전달받습니다. SDK 초기화와 마찬가지로 `@main`이 존재하는 App 클래스에 해당 메소드를 추가합니다.

```swift lines theme={"theme":{"light":"github-dark-dimmed","dark":"github-dark-dimmed"}}
import SwiftUI
import AirBridge

@main
@available(iOS 14, *)
struct OnlyUIApp: App {

    ...
    
    var body: some Scene {
        WindowGroup {
            ContentView()
                .onOpenURL { url in
                    if url.scheme != "http" && url.scheme != "https" {
                        // Scheme Link
                        AirBridge.deeplink()?.handleURLSchemeDeeplink(url)
                    }
                    else {
                        // Universal Link
                        let userActivity = NSUserActivity(activityType: NSUserActivityTypeBrowsingWeb)
                        userActivity.webpageURL = url
                        AirBridge.deeplink().handle(userActivity)
                    }
                }
        }
    }
}
```

<Danger>
  SwiftUI를 사용하여 SceneDelegate가 존재하는 프로젝트의 경우 onOpenUrl을 사용할 수 없습니다. 이 경우 위의 **SceneDelegate를 사용하는 경우**를 참고하세요.
</Danger>

#### 딥링크 콜백 설정

##### `AppDelegate`를 사용하는 경우

1. `ios/[프로젝트 이름]/AppDelegate`파일을 열어주세요.
2. `AppDelegate`의 `application(_:didFinishLaunchingWithOptions:)`에서 `setDeeplinkCallback`함수를 사용해 딥링크로 App이 열렸을 때, 호출할 콜백을 설정해주세요.

<CodeGroup>
  ```objective-c Objective-C lines theme={"theme":{"light":"github-dark-dimmed","dark":"github-dark-dimmed"}}
  - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary*)launchOptions {
      [AirBridge getInstance:@"YOUR_APP_SDK_TOKEN" appName:@"YOUR_APP_NAME" withLaunchOptions:launchOptions];
      [AirBridge.deeplink setDeeplinkCallback:^(NSString* deeplink) {
          // 딥링크로 앱이 열리는 경우 작동할 코드
          // Airbridge 를 통한 Deeplink = YOUR_SCHEME://...
          NSLog(@"DeeplinkCallback : %@", deeplink);
      }];
  }
  ```

  ```swift Swift lines theme={"theme":{"light":"github-dark-dimmed","dark":"github-dark-dimmed"}}
  func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey:
  Any]?) -> Bool {
      AirBridge.getInstance("YOUR_APP_SDK_TOKEN", appName: "YOUR_APP_NAME", withLaunchOptions: launchOptions)

      AirBridge.deeplink()?.setDeeplinkCallback({ deeplink in
          // 딥링크로 앱이 열리는 경우 작동할 코드
          // Airbridge 를 통한 Deeplink = YOUR_SCHEME://...
          NSLog("DeeplinkCallback : %@", deeplink)
      })

      return true
  }
  ```
</CodeGroup>

##### `AppDelegate`를 사용하지 않는 경우 (`SwiftUI`)

SDK 초기화와 마찬기지로 `@main`이 존재하는 App 클래스의 생성자에 해당 메소드를 추가합니다.

```swift lines theme={"theme":{"light":"github-dark-dimmed","dark":"github-dark-dimmed"}}
import SwiftUI
import AirBridge

@main
@available(iOS 14, *)
struct OnlyUIApp: App {
    init() {
        AirBridge.getInstance("YOUR_APP_SDK_TOKEN", appName: "YOUR_APP_NAME")
        AirBridge.deeplink()?.setDeeplinkCallback { deeplink in
            print(deeplink)
        }
    }
    
    var body: some Scene {
        WindowGroup {
            ContentView()
        }
    }
}
```

* Airbridge iOS SDK `v1.10.0 ~ v1.10.9`를 사용하는 경우 : `Airbridge Deeplink`는 `https://YOUR_APP_NAME.airbridge.io/...`형태로 전달됩니다.
* Airbridge iOS SDK `~ v1.9.10`를 사용하는 경우 : `Airbridge Deeplink`는 `https://YOUR_APP_NAME.airbridge.io/...`또는 `YOUR_SCHEME://...`형태로 전달됩니다.

#### 디퍼드 딥링크 설정

딥링크 콜백를 설정하면 디퍼드 딥링크에 대한 정보도 해당 딥링크 콜백으로 전달됩니다. 디퍼드 딥링크 콜백 설정은 [딥링크 콜백 설정](/ko/developers/deprecated-ios-sdk-v1#딥링크-콜백-설정)을 참고해 주세요.

디퍼드 딥링크 콜백은 앱을 설치한 이후에 단 1번만 제공됩니다.

### 딥링크 설정 확인

Airbridge 대시보드의 `iOS URI Scheme` 에 입력한 `YOUR_SCHEME://...` 형태의 딥링크를 클릭하였을 때, 앱이 열리고 Deeplink 이벤트가 전송되는지 확인해주세요.

1. 딥링크를 클릭해주세요.
2. `Airbridge 대시보드` > `Raw Data`> `App Real-time Logs`에서 Deeplink 이벤트가 존재하는지 확인해주세요.

## 사용자 설정

### 사용자 식별자 설정

SDK 에 사용자 식별자 정보를 전달하여 이후 수집되는 모든 이벤트에 입력되도록 할 수 있습니다.

<CodeGroup>
  ```objective-c Objective-C lines theme={"theme":{"light":"github-dark-dimmed","dark":"github-dark-dimmed"}}
  [AirBridge.state setUserID:@"testID"];
  [AirBridge.state setUserEmail:@"testID@ab180.co"];
  [AirBridge.state setUserPhone:@"000-0000-0000"];

  // 입력된 dictionary 로 user alias 가 교체됩니다.
  [AirBridge.state setUserAlias:@{@"key": @"value"}];
  // 기존의 user alias 에 해당 key, value 가 추가됩니다.
  [AirBridge.state addUserAliasWithKey:@"key" value:@"value"];
  ```

  ```swift Swift lines theme={"theme":{"light":"github-dark-dimmed","dark":"github-dark-dimmed"}}
  AirBridge.state()?.setUserID("testID")
  AirBridge.state()?.setUserEmail("testID@ab180.co")
  AirBridge.state()?.setUserPhone("000-0000-0000")

  // 입력된 dictionary 로 user alias 가 교체됩니다.
  AirBridge.state()?.setUserAlias(["key": "value"])
  // 기존의 user alias 에 해당 key, value 가 추가됩니다.
  AirBridge.state()?.addUserAlias(withKey: "key", value: "value")
  ```
</CodeGroup>

| 이름    | 설명           | 제한                                                                                                                                                      |
| ----- | ------------ | ------------------------------------------------------------------------------------------------------------------------------------------------------- |
| id    | 사용자 ID       | -                                                                                                                                                       |
| email | 사용자 Email    | 자동으로 SHA256 으로 Hash 됨 (옵션으로 해제가능)                                                                                                                       |
| phone | 사용자 전화번호     | 자동으로 SHA256 으로 Hash 됨 (옵션으로 해제가능)                                                                                                                       |
| alias | 사용자의 또 다른 ID | - 최대 10개 입니다.<br />- key 는 NSString 타입이며, 최대 128자 입니다.<br />- key 는 ^ \{<br />"h-0": "이름"\*\$ 정규식을 만족해야 합니다.<br />- value 는 NSString 타입이며, 최대 128자 입니다. |

### 사용자 속성 설정

MTA(Multi-Touch Attribution) 분석의 정확도 향상, 내부 데이터 분석, 서드파티(3rd Party) 솔루션 연동 등의 목적으로 사용자의 추가 속성 데이터를 설정할 수 있습니다.

<CodeGroup>
  ```objective-c Objective-C lines theme={"theme":{"light":"github-dark-dimmed","dark":"github-dark-dimmed"}}
  // 입력된 dictionary 로 user attributes 가 교체됩니다.
  [AirBridge.state setUserAttributes:@{@"key": @"value"}];
  // 기존의 user attributes 에 해당 key, value 가 추가됩니다.
  [AirBridge.state addUserAttributesWithKey:@"key" value:@"value"];
  ```

  ```swift Swift lines theme={"theme":{"light":"github-dark-dimmed","dark":"github-dark-dimmed"}}
  // 입력된 dictionary 로 user attributes 가 교체됩니다.
  AirBridge.state()?.setUserAttributes(["key": "value" as NSObject])
  // 기존의 user attributes 에 해당 key, value 가 추가됩니다.
  AirBridge.state()?.addUserAttributes(withKey: "key", value: "value" as NSObject)
  ```
</CodeGroup>

| 이름         | 설명     | 제한                                                                                                                                                                                                    |
| ---------- | ------ | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| attributes | 사용자 속성 | - 최대 100개 입니다.<br />- key 는 NSString 타입이며, 최대 128자 입니다.<br />- key 는 ^ \{<br />"h-0": "이름"\*\$ 정규식을 만족해야 합니다.<br />- value 는 NSString 또는 NSNumber 타입입니다.<br />- value 는 NSString 타입일 경우 최대 1024자 입니다. |

### 사용자 설정 확인

사용자 설정을 완료한 후, SDK 를 통해 Event 를 전송하고, 해당 Event 에 설정한 사용자 정보가 있는지 확인해주세요.

1. 사용자 설정을 해주세요.
2. SDK 를 통해 Event 를 전송해주세요.
3. `Airbridge 대시보드` > `Raw Data`> `App Real-time Logs`에서 전송한 Event 를 클릭하여 JSON 속 user 부분에 설정한 사용자 정보가 있는지 확인해주세요.

## 디바이스 설정

### 디바이스 식별자 설정

SDK에 디바이스 식별자 정보를 설정해 이후 수집되는 모든 이벤트에 디바이스 식별정보를 포함시킬 수 있습니다. 디바이스 식별자가 설정되면 별도로 삭제하지 않을 경우 앱 종료 여부에 관계없이 계속 유지됩니다.

<CodeGroup>
  ```objective-c Objective-C lines theme={"theme":{"light":"github-dark-dimmed","dark":"github-dark-dimmed"}}
  [AirBridge.state setDeviceAliasWithKey: "ADD_YOUR_KEY", value: "AND_YOUR_VALUE"];
  [AirBridge.state removeDeviceAliasWithKey: "DELETE_THIS_KEY"];
  [AirBridge.state clearDeviceAlias];
  ```

  ```swift Swift lines theme={"theme":{"light":"github-dark-dimmed","dark":"github-dark-dimmed"}}
  AirBridge.state()?.setDeviceAlias(key: "ADD_YOUR_KEY", value: "AND_YOUR_VALUE")
  AirBridge.state()?.removeDeviceAlias(key: "DELETE_THIS_KEY")
  AirBridge.state().clearDeviceAlias()
  ```
</CodeGroup>

| 메소드                                            | 설명                                                                 |
| ---------------------------------------------- | ------------------------------------------------------------------ |
| setDeviceAlias(withKey: String, value: String) | 전달한 Key와 Value 쌍을 디바이스 식별자에 추가합니다.                                 |
| removeDeviceAlias(withKey: String)             | 전달한 Key에 해당하는 디바이스 식별자를 삭제합니다. 만약 해당하는 식별자가 없을 경우 아무런 동작을 하지 않습니다. |
| clearDeviceAlias()                             | 모든 디바이스 식별자를 삭제합니다.                                                |

## 이벤트 설정

사용자의 중요한 행동들이 발생할 때, 인앱 이벤트를 전송해 유입 경로별 성과를 측정할 수 있습니다.

모든 이벤트의 파라미터는 선택적으로 추가할 수 있습니다. 그러나 이벤트에 대한 많은 정보는 정확한 통계 제공에 도움이 됨으로 추가하는 것을 권장합니다.

### 이벤트 전송

SDK를 통해 서비스 내에서 발생하는 다양한 이벤트를 Airbridge로 전송하여 마케팅의 성과로 측정할 수 있습니다.

<Danger>
  **주의하세요**

  이벤트 전송을 위해 `setCategory` 함수는 필수적으로 호출되어야 합니다.
</Danger>

<CodeGroup>
  ```objective-c Objective-C lines theme={"theme":{"light":"github-dark-dimmed","dark":"github-dark-dimmed"}}
  #import <AirBridge/ABInAppEvent.h>

  ABInAppEvent* event = [[ABInAppEvent alloc] init];

  [event setCategory:@"category"];
  [event setAction:@"action"];
  [event setLabel:@"label"];
  [event setValue:@(123)];
  [event setCustoms:@{@"key": @"value"}];

  // Semantic Attributes Option 1
  ABSemanticAttributes* semanticAttributes = [[ABSemanticAttributes alloc] init];
  semanticAttributes.transactionID = @"transaction_123";
  [event setSemanticAttributes:semanticAttributes];

  // Semantic Attributes Option 2
  // For more details, please check following page
  // https://developers.airbridge.io/docs/event-structure#semantic-attributes
  [event setSemantics:@{@"transactionID": @"transaction_123"}];

  [event send];
  ```

  ```swift Swift lines theme={"theme":{"light":"github-dark-dimmed","dark":"github-dark-dimmed"}}
  let event = ABInAppEvent()

  event?.setCategory("category")
  event?.setAction("action")
  event?.setLabel("label")
  event?.setValue(123)
  event?.setCustoms(["key": "value"])

  // Semantic Attributes Option 1
  let semanticAttributes = ABSemanticAttributes()
  semanticAttributes?.transactionID = "transaction_123"
  event?.setSemanticAttributes(semanticAttributes)

  // Semantic Attributes Option 2
  // For more details, please check following page
  // https://developers.airbridge.io/docs/event-structure#semantic-attributes
  event?.setSemantics(["transactionID": "transaction_123"])

  event?.send()
  ```
</CodeGroup>

| 파라미터         | 설명                |
| ------------ | ----------------- |
| setCategory  | 이벤트 이름 (required) |
| setAction    | 이벤트 하위 분류 1       |
| setLabel     | 이벤트 하위 분류 2       |
| setValue     | 이벤트 커스텀 값         |
| setCustoms   | 이벤트 커스텀 정보        |
| setSemantics | 이벤트 시맨틱 정보 (Map)  |

### 스탠다드 이벤트 전송

#### 회원가입

<CodeGroup>
  ```objective-c Objective-C lines theme={"theme":{"light":"github-dark-dimmed","dark":"github-dark-dimmed"}}
  #import <AirBridge/ABUser.h>
  #import <AirBridge/ABInAppEvent.h>
  #import <AirBridge/ABCategory.h>

  ABUser* user = [[ABUser alloc] init];
  user.ID = @"testID";
  user.email = @"testID@ab180.co";
  user.phone = @"000-0000-0000";
  user.alias = @{
      @"key": @"value",
  };
  user.attributes = @{
      @"key": @"value",
  };

  [AirBridge.state setUser:user];

  ABInAppEvent* event = [[ABInAppEvent alloc] init];
  [event setCategory:ABCategory.signUp];

  [event send];
  ```

  ```swift Swift lines theme={"theme":{"light":"github-dark-dimmed","dark":"github-dark-dimmed"}}
  let user = ABUser()
  user.id = "testID"
  user.email = "testID@ab180.co"
  user.phone = "000-0000-0000"
  user.attributes = [
      "key": "value" as NSObject,
  ]
  user.alias = [
      "key": "value",
  ]

  AirBridge.state().setUser(user)

  let event = ABInAppEvent()
  event?.setCategory(ABCategory.signUp)
  event?.send()
  ```
</CodeGroup>

#### 로그인

<CodeGroup>
  ```objective-c Objective-C lines theme={"theme":{"light":"github-dark-dimmed","dark":"github-dark-dimmed"}}
  #import <AirBridge/ABUser.h>
  #import <AirBridge/ABInAppEvent.h>
  #import <AirBridge/ABCategory.h>

  ABUser* user = [[ABUser alloc] init];
  user.ID = @"testID";
  user.email = @"testID@ab180.co";
  user.phone = @"000-0000-0000";
  user.alias = @{
      @"key": @"value",
  };
  user.attributes = @{
      @"key": @"value",
  };

  [AirBridge.state setUser:user];

  ABInAppEvent* event = [[ABInAppEvent alloc] init];
  [event setCategory:ABCategory.signIn];

  [event send];
  ```

  ```swift Swift lines theme={"theme":{"light":"github-dark-dimmed","dark":"github-dark-dimmed"}}
  let user = ABUser()
  user.id = "testID"
  user.email = "testID@ab180.co"
  user.phone = "000-0000-0000"
  user.attributes = [
      "key": "value" as NSObject,
  ]
  user.alias = [
      "key": "value",
  ]

  AirBridge.state().setUser(user)

  let event = ABInAppEvent()
  event?.setCategory(ABCategory.signIn)
  event?.send()
  ```
</CodeGroup>

#### 로그아웃

<CodeGroup>
  ```objective-c Objective-C lines theme={"theme":{"light":"github-dark-dimmed","dark":"github-dark-dimmed"}}
  #import <AirBridge/ABInAppEvent.h>
  #import <AirBridge/ABCategory.h>

  ABInAppEvent* event = [[ABInAppEvent alloc] init];
  [event setCategory:ABCategory.signOut];

  [AirBridge.state setUser:[[ABUser alloc] init]];
  ```

  ```swift Swift lines theme={"theme":{"light":"github-dark-dimmed","dark":"github-dark-dimmed"}}
  let event = ABInAppEvent()
  event?.setCategory(ABCategory.signOut)
  event?.send()

  AirBridge.state().setUser(ABUser())
  ```
</CodeGroup>

#### 홈 화면 조회

<CodeGroup>
  ```objective-c Objective-C lines theme={"theme":{"light":"github-dark-dimmed","dark":"github-dark-dimmed"}}
  #import <AirBridge/ABInAppEvent.h>
  #import <AirBridge/ABCategory.h>
    
  ABInAppEvent* event = [[ABInAppEvent alloc] init];
  [event setCategory:ABCategory.viewHome];

  [event send];
  ```

  ```swift Swift lines theme={"theme":{"light":"github-dark-dimmed","dark":"github-dark-dimmed"}}
  let event = ABInAppEvent()
  event?.setCategory(ABCategory.viewHome)
  event?.send()
  ```
</CodeGroup>

#### 상품 상세 조회

<CodeGroup>
  ```objective-c Objective-C lines theme={"theme":{"light":"github-dark-dimmed","dark":"github-dark-dimmed"}}
  #import <AirBridge/ABProduct.h>
  #import <AirBridge/ABInAppEvent.h>
  #import <AirBridge/ABCategory.h>
  #import <AirBridge/ABSemanticsKey.h>

  ABProduct* product1 = [[ABProduct alloc] init];
  product1.idx = @"idx1";
  product1.name = @"name1";
  product1.price = @100;
  product1.currency = @"USD";
  product1.orderPosition = @1;
  product1.quantity = @1;

  ABInAppEvent* event = [[ABInAppEvent alloc] init];
  [event setCategory:ABCategory.viewProductDetail];
  [event setSemantics:@{
      ABSemanticsKey.products: @[product1.toDictionary],
  }];

  [event send];
  ```

  ```swift Swift lines theme={"theme":{"light":"github-dark-dimmed","dark":"github-dark-dimmed"}}
  let product1 = ABProduct()
  product1.idx = "idx1"
  product1.name = "name1"
  product1.price = 100
  product1.currency = "USD"
  product1.orderPosition = 1
  product1.quantity = 1

  let event = ABInAppEvent()
  event?.setCategory(ABCategory.viewProductDetail)
  event?.setSemantics([
      ABSemanticsKey.products: [
          product1.toDictionary(),
      ],
  ])
  event?.send()
  ```
</CodeGroup>

#### 상품 리스트 조회

<CodeGroup>
  ```objective-c Objective-C lines theme={"theme":{"light":"github-dark-dimmed","dark":"github-dark-dimmed"}}
  #import <AirBridge/ABProduct.h>
  #import <AirBridge/ABInAppEvent.h>
  #import <AirBridge/ABCategory.h>
  #import <AirBridge/ABSemanticsKey.h>

  ABProduct* product1 = [[ABProduct alloc] init];
  product1.idx = @"idx1";
  product1.name = @"name1";
  product1.price = @100;
  product1.currency = @"USD";
  product1.orderPosition = @1;
  product1.quantity = @1;

  ABProduct* product2 = [[ABProduct alloc] init];
  product2.idx = @"idx2";
  product2.name = @"name2";
  product2.price = @200;
  product2.currency = @"USD";
  product2.orderPosition = @2;
  product2.quantity = @2;

  ABInAppEvent* event = [[ABInAppEvent alloc] init];
  [event setCategory:ABCategory.viewProductList];
  [event setSemantics:@{
      ABSemanticsKey.products: @[
          product1.toDictionary,
          product2.toDictionary,
      ],
      ABSemanticsKey.productListID: @"listID",
  }];

  [event send];
  ```

  ```swift Swift lines theme={"theme":{"light":"github-dark-dimmed","dark":"github-dark-dimmed"}}
  let product1 = ABProduct()
  product1.idx = "idx1"
  product1.name = "name1"
  product1.price = 100
  product1.currency = "USD"
  product1.orderPosition = 1
  product1.quantity = 1

  let product2 = ABProduct()
  product2.idx = "idx2"
  product2.name = "name2"
  product2.price = 200
  product2.currency = "USD"
  product2.orderPosition = 2
  product2.quantity = 2

  let event = ABInAppEvent()
  event?.setCategory(ABCategory.viewProductList)
  event?.setSemantics([
      ABSemanticsKey.products: [
          product1.toDictionary(),
          product2.toDictionary(),
      ],
      ABSemanticsKey.productListID: "productListID",
  ])
  event?.send()
  ```
</CodeGroup>

#### 검색 결과 조회

<CodeGroup>
  ```objective-c Objective-C lines theme={"theme":{"light":"github-dark-dimmed","dark":"github-dark-dimmed"}}
  #import <AirBridge/ABProduct.h>
  #import <AirBridge/ABInAppEvent.h>
  #import <AirBridge/ABCategory.h>
  #import <AirBridge/ABSemanticsKey.h>

  ABProduct* product1 = [[ABProduct alloc] init];
  product1.idx = @"idx1";
  product1.name = @"name1";
  product1.price = @100;
  product1.currency = @"USD";
  product1.orderPosition = @1;
  product1.quantity = @1;

  ABProduct* product2 = [[ABProduct alloc] init];
  product2.idx = @"idx2";
  product2.name = @"name2";
  product2.price = @200;
  product2.currency = @"USD";
  product2.orderPosition = @2;
  product2.quantity = @2;

  ABInAppEvent* event = [[ABInAppEvent alloc] init];
  [event setCategory:ABCategory.viewSearchResult];
  [event setSemantics:@{
      ABSemanticsKey.products: @[
          product1.toDictionary,
          product2.toDictionary,
      ],
      ABSemanticsKey.query: @"query",
  }];

  [event send];
  ```

  ```swift Swift lines theme={"theme":{"light":"github-dark-dimmed","dark":"github-dark-dimmed"}}
  let product1 = ABProduct()
  product1.idx = "idx1"
  product1.name = "name1"
  product1.price = 100
  product1.currency = "USD"
  product1.orderPosition = 1
  product1.quantity = 1

  let product2 = ABProduct()
  product2.idx = "idx2"
  product2.name = "name2"
  product2.price = 200
  product2.currency = "USD"
  product2.orderPosition = 2
  product2.quantity = 2

  let event = ABInAppEvent()
  event?.setCategory(ABCategory.viewSearchResult)
  event?.setSemantics([
      ABSemanticsKey.products: [
          product1.toDictionary(),
          product2.toDictionary(),
      ],
      ABSemanticsKey.query: "query",
  ])
  event?.send()
  ```
</CodeGroup>

#### 장바구니 담기

<CodeGroup>
  ```objective-c Objective-C lines theme={"theme":{"light":"github-dark-dimmed","dark":"github-dark-dimmed"}}
  #import <AirBridge/ABProduct.h>
  #import <AirBridge/ABInAppEvent.h>
  #import <AirBridge/ABCategory.h>
  #import <AirBridge/ABSemanticsKey.h>

  ABProduct* product1 = [[ABProduct alloc] init];
  product1.idx = @"idx1";
  product1.name = @"name1";
  product1.price = @100;
  product1.currency = @"USD";
  product1.orderPosition = @1;
  product1.quantity = @1;

  ABProduct* product2 = [[ABProduct alloc] init];
  product2.idx = @"idx2";
  product2.name = @"name2";
  product2.price = @200;
  product2.currency = @"USD";
  product2.orderPosition = @2;
  product2.quantity = @2;

  ABInAppEvent* event = [[ABInAppEvent alloc] init];
  [event setCategory:ABCategory.addToCart];
  [event setSemantics:@{
      ABSemanticsKey.products: @[
          product1.toDictionary,
          product2.toDictionary,
      ],
      ABSemanticsKey.cartID: @"cartID",
      ABSemanticsKey.currency: @"currency"
  }];

  [event setValue:@300];

  [event send];
  ```

  ```swift Swift lines theme={"theme":{"light":"github-dark-dimmed","dark":"github-dark-dimmed"}}
  let product1 = ABProduct()
  product1.idx = "idx1"
  product1.name = "name1"
  product1.price = 100
  product1.currency = "USD"
  product1.orderPosition = 1
  product1.quantity = 1;

  let product2 = ABProduct()
  product2.idx = "idx2"
  product2.name = "name2"
  product2.price = 200
  product2.currency = "USD"
  product2.orderPosition = 2
  product2.quantity = 2;

  let event = ABInAppEvent()
  event?.setCategory(ABCategory.addToCart)
  event?.setSemantics([
      ABSemanticsKey.products: [
          product1.toDictionary(),
          product2.toDictionary(),
      ],
      ABSemanticsKey.cartID: "cartID",
      ABSemanticsKey.currency: "KRW",
  ])

  event.setValue(300)

  event?.send()
  ```
</CodeGroup>

#### 결제

<CodeGroup>
  ```objective-c Objective-C lines theme={"theme":{"light":"github-dark-dimmed","dark":"github-dark-dimmed"}}
  #import <AirBridge/ABProduct.h>
  #import <AirBridge/ABInAppEvent.h>
  #import <AirBridge/ABCategory.h>
  #import <AirBridge/ABSemanticsKey.h>

  ABProduct* product1 = [[ABProduct alloc] init];
  product1.idx = @"coke_zero";
  product1.name = @"Coke Zero";
  product1.price = @100;
  product1.currency = @"USD";
  product1.orderPosition = @1;
  product1.quantity = @1;

  ABProduct* product2 = [[ABProduct alloc] init];
  product2.idx = @"burger_cheese_double";
  product2.name = @"Double Cheeseburger";
  product2.price = @200;
  product2.currency = @"USD";
  product2.orderPosition = @2;
  product2.quantity = @2;

  ABInAppEvent* event = [[ABInAppEvent alloc] init];
  [event setCategory:ABCategory.purchase];
  [event setSemantics:@{
      ABSemanticsKey.products: @[
          product1.toDictionary,
          product2.toDictionary,
      ],
      ABSemanticsKey.transcationID: @"transcationID",
      ABSemanticsKey.currency: @"currency",
      ABSemanticsKey.inAppPurchased: @YES
  }];

  [event setValue:@300];

  [event send];
  ```

  ```swift Swift lines theme={"theme":{"light":"github-dark-dimmed","dark":"github-dark-dimmed"}}
  let product1 = ABProduct()
  product1.idx = "coke_zero"
  product1.name = "Coke Zero"
  product1.price = 100
  product1.currency = "USD"
  product1.orderPosition = 1
  product1.quantity = 1

  let product2 = ABProduct()
  product2.idx = "burger_cheese_double"
  product2.name = "Double Cheeseburger"
  product2.price = 200
  product2.currency = "USD"
  product2.orderPosition = 2
  product2.quantity = 2

  let event = ABInAppEvent()
  event?.setCategory(ABCategory.purchase)
  event?.setSemantics([
      ABSemanticsKey.products: [
          product1.toDictionary(),
          product2.toDictionary(),
      ],
      ABSemanticsKey.transactionID: "transactionID",
      ABSemanticsKey.currency: "KRW",
      ABSemanticsKey.inAppPurchased: true
  ])

  event?.setValue(300)

  event?.send()
  ```
</CodeGroup>

### 이벤트 전송 확인

SDK 를 통해 Event 를 전송하고, 에어브릿지 대시보드에 해당 Event 가 존재하는지 확인해주세요.

1. SDK 를 통해 Event 를 전송해주세요.
2. Airbridge 대시보드 > `Raw Data`> `App Real-time Logs`에서 전송한 Event 가 존재하는지 확인해주세요.

## 고급 설정

### Restricted SDK

개인정보보호법 등으로 인해 IDFA 수집이 불가능 한 경우 기존 SDK 대신 IDFA 수집 기능이 제거된 restricted SDK 를 사용 할 수 있습니다. restricted SDK 는 `v1.34.9` 부터 지원됩니다.

#### CocoaPods 설치

1. 아래와 같은 명령어로 `Podfile` 파일을 생성해주세요.

```bash lines theme={"theme":{"light":"github-dark-dimmed","dark":"github-dark-dimmed"}}
cd path/to/project
touch Podfile
```

2. Podfile 파일 내용을 아래와 같이 채워주세요.

```ruby Podfile lines theme={"theme":{"light":"github-dark-dimmed","dark":"github-dark-dimmed"}}
target '[Project Name]' do
    pod 'AirBridgeRestricted'
end
```

<Note>
  Airbridge iOS SDK 1.18.0 이상은 CocoaPods 1.11.0 이상이 필요합니다.
</Note>

3. 터미널을 여시고 아래와 같은 명령어를 입력해주세요.

```bash lines theme={"theme":{"light":"github-dark-dimmed","dark":"github-dark-dimmed"}}
cd path/to/project
pod install --repo-update
```

<Note>
  pod 명령어가 없을 경우, cocoapods 를 설치해주세요.

  * `sudo gem install cocoapods`
</Note>

#### 직접 설치

AirBridge.framework(restricted) : [다운로드](https://sdk-download.airbridge.io/frameworks/AirBridgeRestricted.xcframework-1.40.0.zip)

### SDK Signature 설정

SDK Signature 를 설정하는 것으로 SDK 를 SDK Spoofing 으로 부터 보호할 수 있습니다.

SDK 를 초기화하는 코드 상단에 `setSDKSignatureSecret` 함수를 호출해 설정을 변경하실 수 있습니다.

<CodeGroup>
  ```objective-c Objective-C lines theme={"theme":{"light":"github-dark-dimmed","dark":"github-dark-dimmed"}}
  [AirBridge setSDKSignatureSecretWithID: "YOUR_SDK_SIGNATURE_SECRET_ID", secret: "YOUR_SDK_SIGNATURE_SECRET"];
  [AirBridge getInstance:@"YOUR_APP_SDK_TOKEN" appName:@"YOUR_APP_NAME" withLaunchOptions:launchOptions];
  ```

  ```swift Swift lines theme={"theme":{"light":"github-dark-dimmed","dark":"github-dark-dimmed"}}
  AirBridge.setSDKSignatureSecret(id: "YOUR_SDK_SIGNATURE_SECRET_ID", secret: "YOUR_SDK_SIGNATURE_SECRET")
  AirBridge.getInstance("YOUR_APP_SDK_TOKEN", appName:"YOUR_APP_NAME", withLaunchOptions:launchOptions)
  ```
</CodeGroup>

<Note>
  SDK Signature를 설정하기 위해서는 SDK Signature 보안 정보가 필요합니다. SDK Signature 보안 정보를 생성하기 위한 자세한 내용은 [에어브릿지 가이드](/ko/guides/sdk-signature#sdk-시그니처-보안-정보-생성하기)를 참고해 주세요.
</Note>

### 사용자 정보 해시화 설정

유저의 정보 중 email, phone 정보는 자동으로 SHA256 으로 Hash 되어 전송합니다. SDK 를 초기화하는 코드 상단에 `setIsUserInfoHashed` 함수를 호출해 설정을 변경하실 수 있습니다.

<CodeGroup>
  ```objective-c Objective-C lines theme={"theme":{"light":"github-dark-dimmed","dark":"github-dark-dimmed"}}
  // User 정보 Hash 화 해제
  [AirBridge setIsUserInfoHashed:NO];

  [AirBridge getInstance:@"YOUR_APP_SDK_TOKEN" appName:@"YOUR_APP_NAME" withLaunchOptions:launchOptions];
  ```

  ```swift Swift lines theme={"theme":{"light":"github-dark-dimmed","dark":"github-dark-dimmed"}}
  // User 정보 Hash 화 해제
  AirBridge.setIsUserInfoHashed(false) 

  AirBridge.getInstance("YOUR_APP_SDK_TOKEN", appName:"YOUR_APP_NAME", withLaunchOptions:launchOptions)
  ```
</CodeGroup>

### 세션 타임아웃 설정

SDK 를 초기화하는 코드 상단에 `setSessionTimeout` 함수를 호출해 세션 타임아웃을 설정할 수 있습니다.

* 세션 타임아웃은 millisecond 단위이며, 0 이상 604800000 (7일) 이하 인 값이어야 합니다.
* 세션 타임아웃의 기본값은 `1000 * 60 * 5` (5분) 입니다.

<CodeGroup>
  ```objective-c Objective-C lines theme={"theme":{"light":"github-dark-dimmed","dark":"github-dark-dimmed"}}
  [AirBridge setSessionTimeout:1000 * 60 * 5];

  [AirBridge getInstance:@"YOUR_APP_SDK_TOKEN" appName:@"YOUR_APP_NAME" withLaunchOptions:launchOptions];
  ```

  ```swift Swift lines theme={"theme":{"light":"github-dark-dimmed","dark":"github-dark-dimmed"}}
  AirBridge.setSessionTimeout(1000 * 60 * 5)

  AirBridge.getInstance("YOUR_APP_SDK_TOKEN", appName:"YOUR_APP_NAME", withLaunchOptions:launchOptions)
  ```
</CodeGroup>

### 옵트인(Opt-In) 설정하기

해당 기능은 [GDPR](https://gdpr-info.eu/)이나 [CCPA](https://oag.ca.gov/privacy/ccpa)와 같이 고객으로부터 개인정보보호에 대한 동의를 받아 데이터 수집 및 전송을 진행하는 경우에 유용한 기능입니다.

SDK 초기화 코드 이전에 `autoStartTrackingEnabled` 를 false 로 설정하면, SDK 는 `startTracking` 함수가 호출 될 때 까지 이벤트를 전송하지 않습니다.

따라서, 앱이 꺼져있는 상태에서 라이프사이클 이벤트(Deeplink Open 등) 발생 시, `startTracking` 함수 호출보다 해당 이벤트가 먼저 전송되므로 이벤트가 누락될 수 있습니다.

<CodeGroup>
  ```objective-c Objective-C lines theme={"theme":{"light":"github-dark-dimmed","dark":"github-dark-dimmed"}}
  AirBridge.autoStartTrackingEnabled = NO;

  [AirBridge getInstance:@"YOUR_APP_SDK_TOKEN" appName:@"YOUR_APP_NAME" withLaunchOptions:launchOptions];

  [AirBridge startTracking];
  ```

  ```swift Swift lines theme={"theme":{"light":"github-dark-dimmed","dark":"github-dark-dimmed"}}
  AirBridge.setAutoStartTrackingEnabled(false)

  AirBridge.getInstance("YOUR_APP_SDK_TOKEN", appName:"YOUR_APP_NAME", withLaunchOptions:launchOptions)

  AirBridge.startTracking()
  ```
</CodeGroup>

### 옵트아웃(Opt-Out) 설정하기

<Note>
  **알립니다**

  필수 설정 기능이 아닙니다. 필요한 기능인지 확인한 후에 설정해 주세요.
</Note>

옵트아웃(Opt-Out)은 유저가 거부하기 전에 유저 정보를 사용하는 정책입니다.

`setAutoStartTrackingEnabled` 설정을 true로 설정한 후에 이벤트를 수집할 수 없는 시점에 `stopTracking` 함수를 호출합니다. `stopTracking` 함수가 호출된 시점부터 이벤트를 수집하지 않습니다.

<CodeGroup>
  ```objective-c Objective-C lines theme={"theme":{"light":"github-dark-dimmed","dark":"github-dark-dimmed"}}
  #import <AirBridge/AirBridge.h>

  AirBridge.autoStartTrackingEnabled = YES;

  [AirBridge getInstance:@"YOUR_APP_SDK_TOKEN" appName:@"YOUR_APP_NAME" withLaunchOptions:launchOptions];
      
  [AirBridge stopTracking];
  ```

  ```swift Swift lines theme={"theme":{"light":"github-dark-dimmed","dark":"github-dark-dimmed"}}
  import Airbridge

  AirBridge.setAutoStartTrackingEnabled(true)
  AirBridge.getInstance("YOUR_APP_SDK_TOKEN", appName: "YOUR_APP_NAME", withLaunchOptions: launchOptions)
          
  AirBridge.stopTracking()
  ```
</CodeGroup>

### Airbridge 링크만 추적 설정

SDK 는 딥링크로 앱이 열렸을 때, 언제나 딥링크 이벤트를 전송합니다.

SDK 를 초기화하는 코드 상단에 `setIsTrackAirbridgeDeeplinkOnly` 함수를 호출해 true 로 설정하면, `Airbridge 를 통한 딥링크` 로 앱이 열린 경우에만 딥링크 이벤트를 전송할 수 있습니다.

<CodeGroup>
  ```objective-c Objective-C lines theme={"theme":{"light":"github-dark-dimmed","dark":"github-dark-dimmed"}}
  // Airbridge 를 통한 딥링크 로 앱이 열린 경우에만 딥링크 이벤트를 전송
  [AirBridge setIsTrackAirbridgeDeeplinkOnly:YES];

  [AirBridge getInstance:@"YOUR_APP_SDK_TOKEN" appName:@"YOUR_APP_NAME" withLaunchOptions:launchOptions];
  ```

  ```swift Swift lines theme={"theme":{"light":"github-dark-dimmed","dark":"github-dark-dimmed"}}
  // Airbridge 를 통한 딥링크 로 앱이 열린 경우에만 딥링크 이벤트를 전송
  AirBridge.setIsTrackAirbridgeDeeplinkOnly(true)

  AirBridge.getInstance("YOUR_APP_SDK_TOKEN", appName:"YOUR_APP_NAME", withLaunchOptions:launchOptions)
  ```
</CodeGroup>

### 페이스북 디퍼드 앱링크 설정

아래 설정을 통해 Facebook 의 Deferred App Link 를 SDK 에서 수집할 수 있습니다.

1. 아래 페이스북 개발자 가이드를 참고하여 Facebook SDK 를 설치해주세요.
   * [https://developers.facebook.com/docs/ios/getting-started](https://developers.facebook.com/docs/ios/getting-started)
2. `ios/[프로젝트 이름]/AppDelegate`파일을 열어주세요.
3. SDK 초기화 코드 이전에 `setIsFacebookDeferredAppLinkEnabled`함수를 호출해주세요.

`isFacebookDeferredAppLinkEnabled` 값이 `YES` 이고, Facebook SDK 가 설치되어 있을 때, SDK 가 Facebook Deferred App Link 를 수집합니다.

<CodeGroup>
  ```objective-c Objective-C lines theme={"theme":{"light":"github-dark-dimmed","dark":"github-dark-dimmed"}}
  [AirBridge setIsFacebookDeferredAppLinkEnabled:YES];

  [AirBridge getInstance:@"YOUR_APP_SDK_TOKEN" appName:@"YOUR_APP_NAME" withLaunchOptions:launchOptions];
  ```

  ```swift Swift lines theme={"theme":{"light":"github-dark-dimmed","dark":"github-dark-dimmed"}}
  AirBridge.setIsFacebookDeferredAppLinkEnabled(true)

  AirBridge.getInstance("YOUR_APP_SDK_TOKEN", appName: "YOUR_APP_NAME", withLaunchOptions: launchOptions)
  ```
</CodeGroup>

### 앱 삭제 추적 설정

앱 삭제 추적 설정은 [해당 페이지](/ko/developers/uninstall-tracking-deprecated-ios-sdk-v1)를 참조해 주세요.

### 푸시 알림 딥링크 추적 설정

푸시 알림이 클릭되었을 때, `handleNotificationDeeplink` 함수를 호출해 푸시 알림 페이로드의 딥링크를 SDK 에 전달해주세요.

<CodeGroup>
  ```objective-c Objective-C lines theme={"theme":{"light":"github-dark-dimmed","dark":"github-dark-dimmed"}}
  - (void)application:(UIApplication *)application 
  didReceiveRemoteNotification:(NSDictionary *)userInfo 
        fetchCompletionHandler:(void (^)(UIBackgroundFetchResult))completionHandler 
  {
      if (UIApplication.sharedApplication.applicationState == UIApplicationStateInactive) {
          NSURL* url = // 푸시 알림 페이로드의 딥링크
          
          [AirBridge.deeplink handleNotificationDeeplink:url];
      }
  }

  - (void)userNotificationCenter:(UNUserNotificationCenter *)center 
  didReceiveNotificationResponse:(UNNotificationResponse *)response 
           withCompletionHandler:(void (^)(void))completionHandler API_AVAILABLE(ios(10.0)) 
  {
      if ((UIApplication.sharedApplication.applicationState == UIApplicationStateInactive || UIApplication.sharedApplication.applicationState == UIApplicationStateBackground)
          && [response.actionIdentifier isEqual:UNNotificationDefaultActionIdentifier])
      {
          NSURL* url = // 푸시 알림 페이로드의 딥링크
          
          [AirBridge.deeplink handleNotificationDeeplink:url];
      }
  }
  ```

  ```swift Swift lines theme={"theme":{"light":"github-dark-dimmed","dark":"github-dark-dimmed"}}
  func application(_ application: UIApplication, 
                   didReceiveRemoteNotification userInfo: [AnyHashable : Any], 
                   fetchCompletionHandler completionHandler: @escaping (UIBackgroundFetchResult) -> Void) 
  {
      if UIApplication.shared.applicationState == .inactive {
          let url = // 푸시 알림 페이로드의 딥링크
              
          AirBridge.deeplink()?.handleNotificationDeeplink(url)
      }
  }

  @available(iOS 10.0, *)
  func userNotificationCenter(_ center: UNUserNotificationCenter, 
                              didReceive response: UNNotificationResponse, withCompletionHandler 
                              completionHandler: @escaping () -> Void) 
  {
      if UIApplication.shared.applicationState == .inactive || UIApplication.shared.applicationState == .background,
         response.actionIdentifier == UNNotificationDefaultActionIdentifier
      {
          let url = // 푸시 알림 페이로드의 딥링크
              
          AirBridge.deeplink()?.handleNotificationDeeplink(url)
      }
  }
  ```
</CodeGroup>

### Tracking Authorize Prompt 설정

앱 추적 투명성(App Tracking Transparency, ATT) 정책에 따라 iOS 버전 14.5 이상에서 IDFA를 수집하기 위해서는 반드시 [AppTrackingTransparency.framework](https://developer.apple.com/documentation/apptrackingtransparency)를 사용한 팝업창으로 개인정보 사용에 관한 유저 동의를 받아야 합니다. 해당 프레임워크를 사용한 팝업창에서 개인정보 사용에 동의한 유저의 IDFA만 수집할 수 있습니다.

<CodeGroup>
  ```objective-c Objective-C lines theme={"theme":{"light":"github-dark-dimmed","dark":"github-dark-dimmed"}}
  if (@available(iOS 14, *)) {
      [ATTrackingManager requestTrackingAuthorizationWithCompletionHandler:^(ATTrackingManagerAuthorizationStatus status) {
          NSLog(@"ATTrackingManagerAuthorizationStatus: %lu", (unsigned long)status);    
      }];
  }
  ```

  ```swift Swift lines theme={"theme":{"light":"github-dark-dimmed","dark":"github-dark-dimmed"}}
  if #available(iOS 14, *) {
      ATTrackingManager.requestTrackingAuthorization { status in
          print(status.rawValue)
      }
  }
  ```
</CodeGroup>

### Tracking Authorize Timeout 설정

[AppTrackingTransparency.framework](https://developer.apple.com/documentation/apptrackingtransparency) 를 사용해 `추적 허용 선택창` 을 표시하는 경우, `추적 허용` 을 선택하더라도 선택하기 이전에 설치 이벤트가 전송되기 때문에 설치 이벤트에서 IDFA 수집이 불가능합니다.

SDK 초기화 코드 이전에 `trackingAuthorizeTimeout` 에 `timeout` 을 설정하면, 설치 이벤트를 전송하기 전에 `timeout` 만큼 `추적 허용 선택창` 이 선택될 때 까지 기다립니다.

* `trackingAuthorizeTimeout` 은 millisecond 단위입니다.
* `trackingAuthorizeTimeout` 만큼 설치 이벤트가 늦게 전송될 수 있습니다.
* `trackingAuthorizeTimeout` App 재시작 마다 초기화됩니다.

ATT 상태가 선택되거나, timeout 이 발생했을 때 deferred deeplink 가 callback 에 전달됩니다.

App 재시작마다 timeout 을 초기화하지 않기 위해서는 `isRestartTrackingAuthorizeTimeout` 을 false 로 설정해 주세요.

<CodeGroup>
  ```objective-c Objective-C lines theme={"theme":{"light":"github-dark-dimmed","dark":"github-dark-dimmed"}}
  AirBridge.setting.trackingAuthorizeTimeout = 30 * 1000;
  AirBridge.setting.isRestartTrackingAuthorizeTimeout = NO;

  [AirBridge getInstance:@"YOUR_APP_SDK_TOKEN" appName:@"YOUR_APP_NAME" withLaunchOptions:launchOptions];
  ```

  ```swift Swift lines theme={"theme":{"light":"github-dark-dimmed","dark":"github-dark-dimmed"}}
  AirBridge.setting()?.trackingAuthorizeTimeout = 30 * 1000
  AirBridge.setting()?.isRestartTrackingAuthorizeTimeout = false

  AirBridge.getInstance("YOUR_APP_SDK_TOKEN", appName:"YOUR_APP_NAME", withLaunchOptions:launchOptions)
  ```
</CodeGroup>

<Danger>
  **주의하세요**

  위 코드 중 `trackingAuthorizeTimeout` 값은 SDK 버전이 1.32.1+ 이상인 iOS SDK의 기본값(30초)입니다. 실제로 활용할 때는 반드시 앱의 UX(사용자 경험)와 ATT 프롬프트 설정에 맞게 값을 바꿔야 합니다.
</Danger>

### 이벤트 버퍼 제한 설정

Airbridge SDK 는 이벤트를 전송할 수 없는 환경인 경우에 대비해서 이벤트를 스토리지에 저장하고 재시도하는 기능을 가지고 있습니다. 이 기능을 통해 Airbridge 가 이벤트를 저장하는데 사용하는 스토리지를 제한할 수 있습니다. 설정된 제한은 다음 SDK 초기화 부터 적용됩니다.

<CodeGroup>
  ```objective-c Objective-C lines theme={"theme":{"light":"github-dark-dimmed","dark":"github-dark-dimmed"}}
  // Event count limit
  [AirBridge.setting setEventMaximumBufferCount:newValue]
  // Event size limit (Byte)
  [AirBridge.setting setEventMaximumBufferSize:newValue]
  ```

  ```swift Swift lines theme={"theme":{"light":"github-dark-dimmed","dark":"github-dark-dimmed"}}
  // Event count limit
  AirBridge.setting().setEventMaximumBufferCount(newValue)
  // Event size limit (Byte)
  AirBridge.setting().setEventMaximumBufferSize(newValue)
  ```
</CodeGroup>

### 이벤트 전송 주기 설정

Airbridge SDK 는 이벤트를 전송하는 최소 주기를 설정할 수 있습니다. 이벤트를 1회 전송하는데 성공하면 설정한 주기 만큼은 이벤트가 전송되지 않게 됩니다. 기본 이벤트 전송 주기는 0 millisecond 입니다.

<CodeGroup>
  ```objective-c Objective-C lines theme={"theme":{"light":"github-dark-dimmed","dark":"github-dark-dimmed"}}
  // 이벤트 전송 주기 (Millisecond 단위)
  [AirBridge.setting setEventTransmitInterval:newValue]
  ```

  ```swift Swift lines theme={"theme":{"light":"github-dark-dimmed","dark":"github-dark-dimmed"}}
  // 이벤트 전송 주기 (Millisecond 단위)
  AirBridge.setting().setEventTransmitInterval(newValue)
  ```
</CodeGroup>

### 미처리된 이벤트 삭제 설정

Airbridge 초기화 시 내부 저장소에 저장된 모든 이벤트를 삭제하는 기능입니다. Airbridge는 이벤트 전송 시 손실을 최소화하기 위해 전송되지 않은 이벤트를 내부 저장소에 저장합니다. 하지만 이 기능이 활성화되어있을 경우, Airbridge가 초기화될 때 저장소에 있는 이벤트를 모두 삭제합니다.

<CodeGroup>
  ```swift Swift lines theme={"theme":{"light":"github-dark-dimmed","dark":"github-dark-dimmed"}}
  // 활성화
  Airbridge.setResetEventBufferEnabled(true)

  // 비활성화
  Airbridge.setResetEventBufferEnabled(false)
  ```
</CodeGroup>

<Danger>
  **주의하세요**

  해당 함수는 Airbridge이 트래킹을 시작하기 전에 실행되어야 합니다. 즉, `autoStartTracking`이 `true`로 설정되어 있을 경우 `getInstance`이전, `false`로 설정되어 있을 경우 `startTracking`이전에 실행되어야 합니다. 그렇지 않을 경우 해당 기능은 동작하지 않습니다.
</Danger>

### 앱에서 **트래킹 링크 사용하기**

<Danger>
  **주의하세요**

  에어브릿지의 iOS SDK 1.24.0 이상에서 인앱에서 트래킹 링크 활용하기를 설정하면 앱에서 트래킹 링크를 사용할 때마다 딥링크 페이지뷰(Deeplink Pageview)가 [타겟 이벤트](/ko/guides/airbridge-attribution-model#타겟-이벤트)로 집계됩니다. 딥링크 실행(Deeplink Open) 직후에 딥링크 페이지뷰가 빈번하게 발생하면 딥링크 실행 성과에 영향을 줄 수 있습니다.

  딥링크 페이지뷰의 어트리뷰션 윈도우 기본 설정은 3일입니다. 딥링크 페이지뷰의 어트리뷰션 윈도우 변경을 원하는 고객사는 에어브릿지 CSM에게 요청해 주세요. 담당 CSM이 없는 경우 [문의하기](https://app.airbridge.io/supports)를 통해 요청해 주세요.
</Danger>

앱에서 트래킹 링크를 사용할 수 있습니다. 단, 커스텀 숏 ID를 사용하는 트래킹 링크는 앱에서 사용할 수 없습니다. 해당 기능을 사용하면 외부 브라우저를 거치지 않고 앱에서 같은 앱의 다른 페이지로 이동할 수 있습니다.

<CodeGroup>
  ```swift Swift lines theme={"theme":{"light":"github-dark-dimmed","dark":"github-dark-dimmed"}}
  Airbridge.placement().click("https://abr.ge/~~~")
  Airbridge.placement().impression("https://abr.ge/~~~")
  ```
</CodeGroup>

###### click

해당 트래킹 링크가 클릭되었을 때 호출합니다. 그 후 트래킹 링크의 click 통계를 추가하고 설정된 App, Web 또는 Fallback으로 이동합니다.

###### impression

해당 트래킹 링크가 UI에 표시 되었을 때 호출합니다. 그 후 트래킹 링크의 impression 통계를 1개 추가합니다.

### Attribution Result 콜백 설정

에어브릿지 iOS SDK에서 어트리뷰션 결과를 확인하기 위해서는 `attributionCallback`에 콜백 클로저를 전달해야 합니다.

Attribution Result 콜백은 앱을 설치한 이후에 단 1번만 제공됩니다.

<CodeGroup>
  ```swift Swift lines theme={"theme":{"light":"github-dark-dimmed","dark":"github-dark-dimmed"}}
  AirBridge.setting().attributionCallback = { (attribution: [String : String]) in
      // Process attribution data...

  }
  ```

  ```objective-c Objective-C lines theme={"theme":{"light":"github-dark-dimmed","dark":"github-dark-dimmed"}}
  [AirBridge.setting setAttributionCallback:^(NSDictionary<NSString *,NSString *> * _Nonnull attribution) {
      // Process attribution data...
          
  }];
  ```
</CodeGroup>

* 결과로 다음과 같은 데이터를 받을 수 있습니다:

| 필드명                        | 설명               |
| -------------------------- | ---------------- |
| attributedChannel          | 채널 (String)      |
| attributedCampaign         | 캠페인 (String)     |
| attributedAdGroup          | 광고 그룹 (String)   |
| attributedAdCreative       | 광고 소재 (String)   |
| attributedContent          | 콘텐츠 (String)     |
| attributedTerm             | 키워드 (String)     |
| attributedSubPublisher     | 하위매체 (String)    |
| attributedSubSubPublisher1 | 하하위매체 1 (String) |
| attributedSubSubPublisher2 | 하하위매체 2 (String) |
| attributedSubSubPublisher3 | 하하위매체 3 (String) |

* 기여 결과가 없는 경우 `attributedChannel`항목에 대해 `unattributed`데이터가 전달됩니다.

```json lines theme={"theme":{"light":"github-dark-dimmed","dark":"github-dark-dimmed"}}
  {
    "attributedChannel": "unattributed"
  }
```

<Danger>
  **Attribution 값 사용에 대한 가이드라인**

  * **기여 결과가 존재하는 경우**
    1. Attribution 값은 SDK 초기화 후 대체로 40초 내외에 콜백으로 전달됩니다.
    2. 앱이 종료되어 이전에 Attribution 값을 전달받지 못한 경우, 다음 앱 실행 시 SDK 초기화 후 40초 내외에 Attribution 값이 전달됩니다.
    3. 드물게 최대 5분까지 전달이 지연될 수 있습니다.
  * **기여 결과가 존재하지 않는 경우**

  SDK를 초기화한 이후, 최소 3시간이 경과한 후 앱 재실행 시 Attribution 값이 전달됩니다.

  `실시간 처리가 필요한 부분에는 콜백으로 전달되는 Attribution 값을 활용하는 것은 권장하지 않습니다.`
</Danger>

### Airbridge 비활성화 설정

Airbridge의 전체 동작을 비활성화 할 수 있는 기능입니다. 앱 라이프 사이클 추적, 이벤트 전송 등 Airbridge의 모든 기능이 비활성화 됩니다.

<CodeGroup>
  ```swift Swift lines theme={"theme":{"light":"github-dark-dimmed","dark":"github-dark-dimmed"}}
  // 활성화
  Airbridge.setSDKEnabled(true)

  // 비활성화
  Airbridge.setSDKEnabled(false)
  ```
</CodeGroup>

<Danger>
  **주의하세요**

  해당 함수는 Airbridge의 초기화 코드(`getInstance`)보다 먼저 실행되어야 합니다. 그렇지 않을 경우 해당 기능은 동작하지 않습니다.
</Danger>

### iOS Extension에서 이벤트 수집

iOS Extension 의 Airbridge SDK 의 활용이 가능합니다. iOS Extension 의 `viewDidLoad` 함수에서 SDK 를 초기화 해주시고 [이벤트 전송 함수](/ko/developers/deprecated-ios-sdk-v1#이벤트-전송)를 이용하여 이벤트를 수집하실 수 있습니다.

```swift lines theme={"theme":{"light":"github-dark-dimmed","dark":"github-dark-dimmed"}}
override func viewDidLoad() {
  super.viewDidLoad()
    AirBridge.getInstance("YOUR_APP_SDK_TOKEN", appName:"YOUR_APP_NAME", withLaunchOptions:launchOptions)
}
```

<Danger>
  **주의하세요**

  iOS Extension 에서 Airbridge SDK 활용에 있어서 아래와 같은 제약이 존재합니다.

  * iOS Extension 에서는 Install, Open, Deeplink Open, Foreground 등 생명주기 이벤트들은 수집되지 않습니다.
  * iOS Extension 에서 이벤트를 전송하는 도중 해당 프로세스가 종료되는 경우, 이벤트는 전송되지 않고 다음에 Extension 이 실행되었을 때 다시 전송을 시도하게 됩니다. (App 이 실행되었을 때 다시 전송을 시도하지 않습니다.)
  * iOS Extension 에 Airbridge SDK 를 활용하시는 경우, SKAdNetwork 의 전환값 측정이 제대로 작동하지 않게 되기 때문에 SKAdNetwork 기능을 사용하지 않으셔야 합니다.
</Danger>

### 디지털 시장법(DMA) 준수를 위한 설정

디지털 시장법(DMA)를 준수하기 위해서는 유저 응답 정보(User Consent)를 에어브릿지에 전달해야 합니다. DMA와 적용 대상 등에 대한 자세한 내용은 [에어브릿지 가이드](/ko/guides/supporting-the-updated-google-eu-user-consent-policy)를 참고해 주세요.

EEA(유럽 경제 지역)이라면 유저의 유럽 경제 지역 여부와 유저 응답 정보를 항상 에어브릿지에 전달해야 합니다.

1. 앱을 실행한 유저의 지역을 확인합니다. 유저가 앱을 실행한 지역이 EEA(`eea=1)`라면 기존에 수집한 유저 응답 정보가 있는지 확인합니다. 수집한 유저 응답 정보가 있다면 3번을 진행합니다.

유저가 앱을 실행한 지역이 EEA가 아니라면 유저 응답 정보를 수집하지 않아도 됩니다.

<Info>
  **알립니다**

  에어브릿지는 유저 동의 정보 저장과 프롬프트 구현 방식 등에 관해 도움을 드릴 수 없습니다. 법률 자문사와 함께 검토해 주세요.
</Info>

2. 수집한 유저 응답 정보가 없다면 프롬프트 등으로 유저 응답 정보를 수집합니다. 해당 단계에서 수집해야 하는 정보는 `adPersonalization`, `adUserData`입니다.

<Accordion title="에어브릿지 SDK에 전달해야하는 유저 응답 정보">
  | <span style={{ display: 'inline-block', minWidth: '80px' }}>에어브릿지 필드 이름</span> | <span style={{ display: 'inline-block', minWidth: '80px' }}>구글 필드 이름</span> | <span style={{ display: 'inline-block', minWidth: '160px' }}>설명</span>                                       |
  | ------------------------------------------------------------------------------ | --------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------ |
  | `eea`<br />\<string>                                                           | `eea`                                                                       | 디지털 시장법 준수 지역 여부.<br />- `0`: 디지털 시장법 준수와 관계 없는 지역. EEA 지역에 해당하지 않음.<br />- `1`: 디지털 시장법 준수 지역. EEA 지역에 해당함. |
  | `adPersonalization`<br />\<string>                                             | `ad_personalization`                                                        | 개인 맞춤형 광고 제공을 위한 정보 수집에 대한 동의 여부.<br />- `0`: 유저가 정보 수집에 동의하지 않음.<br />- `1`: 유저가 정보 수집에 동의함.                |
  | `adUserData`<br />\<string>                                                    | `ad_user_data`                                                              | 유저 데이터를 구글에 전송하는 것에 대한 동의 여부.<br />- `0`: 유저가 전송에 동의하지 않음.<br />- `1`: 유저가 전송에 동의함.                          |
</Accordion>

3. 에어브릿지 SDK를 초기화하고 유저 정보를 수집하기 전에 유저 응답 정보를 에어브릿지에 전달합니다.

<Danger>
  **주의하세요**

  유저 동의 정보를 에어브릿지 SDK에 전달 시, 반드시 에어브릿지에서 지정한 필드명과 값을 사용해야합니다. 에어브릿지 SDK에 전달해야하는 유저 동의 정보를 참고하세요.
</Danger>

<CodeGroup>
  ```swift Swift lines theme={"theme":{"light":"github-dark-dimmed","dark":"github-dark-dimmed"}}
  // AppDelegate.swift
  func application(
      _ application: UIApplication,
      didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey : Any]?
  ) {
      AirBridge.setAutoStartTrackingEnabled(false)
      AirBridge.getInstance("YOUR_APP_SDK_TOKEN", appName:"YOUR_APP_NAME", withLaunchOptions:launchOptions)

      // Based on actual region
      AirBridge.state()?.UserAlias(withKey:"eea", value:"0" or "1")
      
      // Based on actual user consent
      AirBridge.state()?.UserAlias(withKey:"adPersonalization", value:"0" or "1")
      AirBridge.state()?.UserAlias(withKey:"adUserData", value:"0" or "1")
      
      AirBridge.startTracking()
  }
  ```

  ```objective-c Objective-C lines theme={"theme":{"light":"github-dark-dimmed","dark":"github-dark-dimmed"}}
  // AppDelegate.m
  - (BOOL)          application:(UIApplication *)application
  didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
  {
      AirBridge.autoStartTrackingEnabled = NO;
      [AirBridge getInstance:@"YOUR_APP_SDK_TOKEN" appName:@"YOUR_APP_NAME" withLaunchOptions:launchOptions];

      // Based on actual region
      [AirBridge.state addUserAliasWithKey:@"eea" value:"0" or "1"];
      
      // Based on actual user consent
      [AirBridge.state addUserAliasWithKey:@"adPersonalization" value:"0" or "1"];
      [AirBridge.state addUserAliasWithKey:@"adUserData" value:"0" or "1"];
      
      [AirBridge startTracking];
  }
  ```
</CodeGroup>

## 하이브리드 앱 설정

### WebView 환경 이벤트 전송

WebView 의 웹사이트에 설치된 Web SDK 가 전송하는 Event 를 iOS SDK가 대신 전송할 수 있습니다.

아래와 같이 WebView 의 configuration 의 controller 에 airbridge web interface 를 주입해주세요.

<CodeGroup>
  ```objective-c Objective-C lines theme={"theme":{"light":"github-dark-dimmed","dark":"github-dark-dimmed"}}
  WKWebViewConfiguration* configuration = [[WKWebViewConfiguration alloc] init];

  WKUserContentController* controller = [[WKUserContentController alloc] init];
  [AirBridge.webInterface injectTo:controller withWebToken:@"YOUR_WEB_TOKEN"];

  configuration.userContentController = controller;
      
  WKWebView* webview = [[WKWebView alloc] initWithFrame:CGRectZero configuration:configuration];
  ```

  ```swift Swift lines theme={"theme":{"light":"github-dark-dimmed","dark":"github-dark-dimmed"}}
  let configuration = WKWebViewConfiguration()
          
  let controller = WKUserContentController()
  AirBridge.webInterface()?.inject(to: controller, withWebToken: "YOUR_WEB_TOKEN")
          
  configuration.userContentController = controller
          
  webView = WKWebView(frame: .zero, configuration: configuration)
  ```
</CodeGroup>

`YOUR_WEB_TOKEN` 은 대시보드의 `Settings > Tokens > 웹 SDK 토큰`에서 확인할 수 있습니다.

## Troubleshooting

### Webcredentials

App 에서 [Autofill](https://developer.apple.com/documentation/security/password-autofill) 기능을 사용해 비밀번호를 저장하는 경우 `webcredentials:...` 설정이 되어 있지 않으면 비밀번호가 `applinks:YOUR_APP_NAME.airbridge.io` 또는 `applinks:YOUR_APP_NAME.abr.ge` 의 도메인에 저장됩니다.

비밀번호가 저장되는 도메인을 변경하고 싶다면, `example.com` 을 `설정할 도메인` 으로 변경해서 아래와 같이 설정해주세요.

1. `https://example.com/.well-known/apple-app-site-association`주소에서 아래 내용을 호스팅 합니다.

```json lines theme={"theme":{"light":"github-dark-dimmed","dark":"github-dark-dimmed"}}
{
    "webcredentials": {
        "apps": ["TEAM_ID.APP_BUNDLE_ID"]
    }
}
```

예) 9JA89QQLNQ.com.apple.wwdc

2. Xcode > Project 파일 > Signing & Capabilities > Associated Domains 로 이동해주세요.
3. `+`버튼을 눌러 `webcredentials:example.com`을 추가해주세요.

### Bitcode 컴파일 에러

Airbridge iOS SDK 는 1.28.0 버전 부터 Bitcode 를 지원하지 않습니다. (Xcode 14 부터 Bitcode 가 deprecate 되었습니다.) 하지만 App 프로젝트에서 Bitcode 를 사용하는 경우 아래와 같은 컴파일에러가 발생할 수 있습니다.

```html Text lines theme={"theme":{"light":"github-dark-dimmed","dark":"github-dark-dimmed"}}
Textld: XCFrameworkIntermediates/AirBridge/AirBridge.framework/AirBridge(AirBridge-arm64-master.o)' does not contain bitcode. You must rebuild it with bitcode enabled (Xcode setting ENABLE_BITCODE)
```

이 문제를 해결하기 위해서는 Podfile 파일에 아래와 같은 내용을 추가하거나 Xcode 에서 `ENABLE_BITCODE` 설정을 `NO`로 설정해주시면 됩니다.

```html Podfile lines theme={"theme":{"light":"github-dark-dimmed","dark":"github-dark-dimmed"}}
installer.pods_project.targets.each do |target|
    target.build_configurations.each do |configuration|
        configuration.build_settings['ENABLE_BITCODE'] = 'NO'
    end
end
```

Xcode 에서 ENABLE\_BITCODE 설정을 NO 로 설정해주시면 됩니다.

<Note>
  Apple Appstore 에서는 Bitcode 를 Deprecate 하여 Bitcode 를 사용하는 `.ipa` 파일이 제출되어도 자동으로 Bitcode 를 제거합니다.
</Note>

### Xcode 13 에서 빌드가 안되는 문제

Airbridge iOS SDK 는 1.28.0 버전 부터 Xcode 13 및 iOS 9, 10 을 지원하지 않습니다. 해당 지원이 필요하신 경우, Airbridge iOS SDK 1.27.0 이하 버전을 사용해주셔야 합니다.

### Tuist fetch 와 SPM 으로 설치하면 iOS 14.2 미만에서 크래시가 발생하는 문제

Airbridge iOS SDK 는 여러 iOS 내장 Framework 를 활용합니다. 그 중 AdServices 는 iOS 14.2 이상을 필요로 합니다. 그런데 Swift Package Manager 에는 `Link 될 Framework 의 Minimum OS Version` 이 `Target 의 Minimum OS Version` 보다 높으면 자동으로 `Optional` 로 Link 하는 기능이 있지만, Swift Package Manager 를 사용하지 않고 Metadata 만 가져와서 Swift Package Manager 의 동작을 대신하는 Tuist fetch 에는 무조건 `Required` 로 Link 해서 이 이슈가 발생합니다. ([문제가 되는 Tuist 코드](https://github.com/tuist/tuist/blob/93a06710b6ce738247436958a762c7ca282a790d/Sources/TuistDependencies/SwiftPackageManager/Utils/PackageInfoMapper.swift#L869))

이 경우, Tuist 에서 제공하는 \`Xcode Native Package Manager Support\` [방법](https://docs.tuist.io/guides/third-party-dependencies)을 따라 SDK 를 설치하시거나, 아래와 같이 AirBridge.xcframework 직접 다운로드 받아 추가하시면 문제가 해결됩니다.

```swift lines theme={"theme":{"light":"github-dark-dimmed","dark":"github-dark-dimmed"}}
.xcframework(path: "${YOUR_PATH}/AirBridge.xcframework")
.sdk(name: "AdSupport", type: .framework, status: .optional)
.sdk(name: "iAd", type: .framework, status: .optional)
.sdk(name: "AdServices", type: .framework, status: .optional)
.sdk(name: "CoreTelephony", type: .framework, status: .optional)
.sdk(name: "StoreKit", type: .framework, status: .optional)
.sdk(name: "AppTrackingTransparency", type: .framework, status: .optional)
.sdk(name: "WebKit", type: .framework, status: .optional)
```

## 마이그레이션 가이드

SDK 업데이트 시, \`이전버전\` \~ \`이후버전\` 사이에 해당하는 버전들에 해당하는 내용들을 고려해주세요.

#### 1.36.0

### 프로젝트 설정

2023년 9월 4일 이후에 생성된 에어브릿지 앱의 경우, 딥링크 콜백에서 제공하는 딥링크 URL 이 에어브릿지 대시보드에 입력된 내용을 2번 디코딩하여 제공하는 문제가 1.34.0 \~ 1.35.1 에 있었던 것이 해결되었습니다.

#### 1.34.0

2023년 9월 4일 이후에 생성된 에어브릿지 앱의 경우, 딥링크 콜백에서 제공하는 딥링크 URL 에 더이상 airbridge\_referrer 가 추가되지 않게 됩니다.

#### 1.33.0

1.33.0 미만 버전을 사용하시는 유저가 업데이트하시는 경우, 마지막으로 계산된 SKAdNetwork Conversion Value 로 확정되고, 추가적으로 계산하지 않습니다.

* 1.33.0 미만 버전에서는 SKAdNetwork Conversion Value 를 최대 24시간 동안만 계산합니다.
* 새로 설치하시는 유저에 대해서는 문제되지 않습니다.

#### 1.32.1

trackingAuthorizeTimeout 의 기본값이 30초로 변경됩니다.

<link rel="alternate" hrefLang="en" href="https://help.airbridge.io/en/developers/deprecated-ios-sdk-v1" />

<link rel="alternate" hrefLang="ko" href="https://help.airbridge.io/ko/developers/deprecated-ios-sdk-v1" />

#### 직접 설치

<Accordion title="에어브릿지 SDK에 전달해야하는 유저 응답 정보">
  | <span style={{ display: 'inline-block', minWidth: '80px' }}>에어브릿지 필드 이름</span> | <span style={{ display: 'inline-block', minWidth: '80px' }}>구글 필드 이름</span> | <span style={{ display: 'inline-block', minWidth: '160px' }}>설명</span>                                       |
  | ------------------------------------------------------------------------------ | --------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------ |
  | `eea`<br />\<string>                                                           | `eea`                                                                       | 디지털 시장법 준수 지역 여부.<br />- `0`: 디지털 시장법 준수와 관계 없는 지역. EEA 지역에 해당하지 않음.<br />- `1`: 디지털 시장법 준수 지역. EEA 지역에 해당함. |
  | `adPersonalization`<br />\<string>                                             | `ad_personalization`                                                        | 개인 맞춤형 광고 제공을 위한 정보 수집에 대한 동의 여부.<br />- `0`: 유저가 정보 수집에 동의하지 않음.<br />- `1`: 유저가 정보 수집에 동의함.                |
  | `adUserData`<br />\<string>                                                    | `ad_user_data`                                                              | 유저 데이터를 구글에 전송하는 것에 대한 동의 여부.<br />- `0`: 유저가 전송에 동의하지 않음.<br />- `1`: 유저가 전송에 동의함.                          |
</Accordion>
