

# IVS iOS Player SDK 시작하기
<a name="ios-getting-started"></a>

이 문서에서는 Amazon IVS iOS Player SDK 시작하기와 관련된 단계를 안내합니다.

Swift Package Manager를 통해 Player SDK를 통합하는 것이 좋습니다. (또는 프레임워크를 프로젝트에 수동으로 추가할 수 있습니다).

## 권장: Player SDK 통합(Swift Package Manager)
<a name="ios-integrate-sdk-swift"></a>

1. [https://player.live-video.net/1.51.0/Package.swift](https://player.live-video.net/1.51.0/Package.swift)에서 Package.swift 파일을 다운로드합니다.

1. 프로젝트에서 AmazonIVSPlayer라는 새 디렉터리를 생성하여 버전 제어에 추가합니다.

1. 다운로드한 Package.swift 파일을 새 디렉터리에 넣습니다.

1. Xcode에서 **파일 > 패키지 종속성 추가**로 이동하여 **로컬 추가...**를 선택합니다.

1. 생성한 AmazonIVSPlayer 디렉터리로 이동하여 선택하고 **패키지 추가**를 선택합니다.

1. **AmazonIVSPlayer용 패키지 제품 선택**이라는 프롬프트가 표시되면 **대상에 추가** 섹션에서 애플리케이션 대상을 설정하여 **AmazonIVSPlayer**를 **패키지 제품**으로 선택합니다.

1. **패키지 추가**를 선택합니다.

## 대체 방법: 수동으로 프레임워크 설치
<a name="ios-install-framework-manually"></a>

1. [https://player.live-video.net/1.51.0/AmazonIVSPlayer.xcframework.zip](https://player.live-video.net/1.51.0/AmazonIVSPlayer.xcframework.zip)에서 최신 버전을 다운로드합니다.

1. 아카이브 콘텐츠의 압축을 풉니다. `AmazonIVSPlayer.xcframework`에는 디바이스와 시뮬레이터 모두에 대한 SDK가 포함되어 있습니다.

1. `AmazonIVSPlayer.xcframework`를 애플리케이션 대상의 **일반(General)** 탭의 **프레임워크, 라이브러리 및 포함된 콘텐츠(Frameworks, Libraries, and Embedded Content)** 섹션으로 드래그하여 포함시킵니다.  
![\[애플리케이션 대상에 대한 일반(General) 탭의 프레임워크, 라이브러리 및 포함된 콘텐츠(Frameworks, Libraries, and Embedded Content) 섹션.\]](http://docs.aws.amazon.com/ko_kr/ivs/latest/LowLatencyUserGuide/images/iOS_Player_SDK_Guide_xcframework.png)

## 플레이어 생성
<a name="ios-create-player"></a>

플레이어 객체는 `IVSPlayer`입니다. 아래 그림과 같이 초기화할 수 있습니다.

------
#### [ Swift ]

```
import AmazonIVSPlayer

let player = IVSPlayer()
```

------
#### [ Objective-C ]

```
#import <AmazonIVSPlayer/AmazonIVSPlayer.h>

IVSPlayer *player = [[IVSPlayer alloc] init];
```

------

## 대리자 설정
<a name="ios-setup-delegate"></a>

대리자 콜백은 재생 상태, 이벤트 및 오류에 대한 정보를 제공합니다. 모든 콜백은 기본 대기열에서 호출됩니다.

------
#### [ Swift ]

```
// Self must conform to IVSPlayer.Delegate
player.delegate = self
```

------
#### [ Objective-C ]

```
// Self must conform to IVSPlayer.Delegate
player.delegate = self
```

------

## 비디오 표시
<a name="ios-display-video"></a>

플레이어는 사용자 지정 계층(`IVSPlayerLayer`)에서 비디오를 표시합니다. SDK는 이 계층에서 지원하는 하위 클래스 `UIView`(`IVSPlayerView`)도 제공합니다. 애플리케이션 UI에 더 편리한 항목을 사용하세요.

두 경우 모두 `player` 속성을 사용하여 플레이어 인스턴스의 비디오를 표시합니다.

------
#### [ Swift ]

```
// When using IVSPlayerView:
playerView.player = player

// When using IVSPlayerLayer:
playerLayer.player = player
```

------
#### [ Objective-C ]

```
// When using IVSPlayerView:
playerView.player = player;

// When using IVSPlayerLayer:
playerLayer.player = player;
```

------

## 스트림 로드
<a name="ios-load-stream"></a>

플레이어는 스트림을 비동기식으로 로드합니다. 플레이어 상태는 재생할 준비가 되었을 때를 나타냅니다.

------
#### [ Swift ]

```
player.load(url)
```

------
#### [ Objective-C ]

```
[player load:url];
```

------

## 스트림 재생
<a name="ios-play-stream"></a>

플레이어가 준비되면 `play`를 사용하여 재생을 시작합니다. 대리자 인터페이스 또는 `state` 속성에서 키-값 관찰을 사용하여 상태 변경을 관찰합니다. 다음은 대리자 기반 접근 방식의 예입니다.

------
#### [ Swift ]

```
func player(_ player: IVSPlayer, didChangeState state: IVSPlayer.State) {
    if state == .ready {
        player.play()
    }
}
```

------
#### [ Objective-C ]

```
- (void)player:(IVSPlayer *)player didChangeState:(IVSPlayerState)state {
    if (state == IVSPlayerStateReady) {
        [player play];
    }
}
```

------

## 앱 백그라운드에서 일시 중지
<a name="ios-pause-on-app-backgrounding"></a>

앱이 백그라운드에 있는 동안 플레이어는 재생을 지원하지 않지만 완전히 비활성화할 필요는 없습니다. 일시 중지만으로 충분합니다. 아래 예제를 참조하세요.

------
#### [ Swift ]

```
override func viewDidLoad() {
    super.viewDidLoad()

    NotificationCenter.default.addObserver(self,
        selector: #selector(applicationDidEnterBackground(_:)),
        name: UIApplication.didEnterBackgroundNotification,
        object: nil)
}

@objc func applicationDidEnterBackground(_ notification: NSNotification) {
    playerView?.player?.pause()
}
```

------
#### [ Objective-C ]

```
- (void)viewDidLoad {
    [super viewDidLoad];

    NSNotificationCenter *defaultCenter = NSNotificationCenter.defaultCenter;
    [defaultCenter addObserver:self
                      selector:@selector(applicationDidEnterBackground:)
                          name:UIApplicationDidEnterBackgroundNotification
                        object:nil];
}

- (void)applicationDidEnterBackground:(NSNotification *)notification {
    [playerView.player pause];
}
```

------

## 스레드 안전
<a name="ios-thread-safety"></a>

플레이어 API는 스레드 안전 기능이 아닙니다. 애플리케이션 기본 스레드에서 플레이어 인스턴스를 생성하고 사용해야 합니다.

## SDK 크기
<a name="ios-sdk-size"></a>

Amazon IVS Player SDK는 최대한 가볍게 설계되었습니다. SDK 크기에 대한 최신 정보는 [릴리스 정보](release-notes.md)를 참조하세요.

**중요:** 크기 영향을 평가할 때 Xcode에서 생성한 IPA의 크기는 사용자 디바이스에 다운로드되는 앱의 크기를 나타내지 않습니다. App Store에서는 최적화를 통해 앱의 크기를 줄입니다.

## 모두 통합
<a name="ios-putting-together"></a>

다음의 간단한 view-controller 스니펫은 플레이어 뷰에서 URL을 로드하고 재생합니다. `playerView` 속성은 XIB/Storyboard에서 초기화되며, 해당 속성의 클래스는 [Identity Inspector의 Custom Class 섹션](https://developer.apple.com/tutorials/SwiftUI)을 사용하여 Interface Builder에서 `IVSPlayerView`로 설정된다는 점에 유의하세요.

------
#### [ Swift ]

```
import AmazonIVSPlayer

class MyViewController: UIViewController {
...
    // Connected in Interface Builder
    @IBOutlet var playerView: IVSPlayerView!

    override func viewDidLoad() {
        super.viewDidLoad()

        NotificationCenter.default.addObserver(self,
            selector: #selector(applicationDidEnterBackground(_:)),
            name: UIApplication.didEnterBackgroundNotification,
            object: nil)
    }

    @objc func applicationDidEnterBackground(_ notification: NSNotification) {
        playerView?.player?.pause()
    }
...
    // Assumes this view controller is already loaded.
    // For example, this could be called by a button tap.
    func playVideo(url videoURL: URL) {
        let player = IVSPlayer()
        player.delegate = self
        playerView.player = player
        player.load(videoURL)
    }
}

extension MyViewController: IVSPlayer.Delegate {
    func player(_ player: IVSPlayer, didChangeState state: IVSPlayer.State) {
        if state == .ready {
            player.play()
        }
    }
}
```

------
#### [ Objective-C ]

```
// MyViewController.h

@class IVSPlayerView;

@interface MyViewController: UIViewController
...
// Connected in Interface Builder
@property (nonatomic) IBOutlet IVSPlayerView *playerView;
...
@end


// MyViewController.m

#import <AmazonIVSPlayer/AmazonIVSPlayer.h>

@implementation MyViewController <IVSPlayerDelegate>
...

- (void)viewDidLoad {
    [super viewDidLoad];

    NSNotificationCenter *defaultCenter = NSNotificationCenter.defaultCenter;
    [defaultCenter addObserver:self
                      selector:@selector(applicationDidEnterBackground:)
                          name:UIApplicationDidEnterBackgroundNotification
                        object:nil];
}

- (void)applicationDidEnterBackground:(NSNotification *)notification {
    [playerView.player pause];
}

// Assumes this view controller is already loaded.
// For example, this could be called by a button tap.
- (void)playVideoWithURL:(NSURL *)videoURL {
    IVSPlayer *player = [[IVSPlayer alloc] init];
    player.delegate = self;
    playerView.player = player;
    [player load:videoURL];
}

- (void)player:(IVSPlayer *)player didChangeState:(IVSPlayerState)state {
    if (state == IVSPlayerStateReady) {
        [player play];
    }
}

...
@end
```

------