

# 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. Package.swift ファイルを「[https://player.live-video.net/1.50.0/Package.swift](https://player.live-video.net/1.50.0/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.50.0/AmazonIVSPlayer.xcframework.zip](https://player.live-video.net/1.50.0/AmazonIVSPlayer.xcframework.zip)

1. アーカイブの内容を抽出します。`AmazonIVSPlayer.xcframework` には、デバイスとシミュレータの両方の SDK が含まれています。

1. アプリケーションターゲットの [**全般**] タブの、[**Frameworks, Libraries, and Embedded Content (フレームワーク、ライブラリ、埋め込みコンテンツ)**] のセクションに `AmazonIVSPlayer.xcframework` をドラッグして埋め込みます。  
![\[アプリケーションターゲットの [全般] タブの[Frameworks, Libraries, and Embedded Content (フレームワーク、ライブラリ、埋め込みコンテンツ)] セクション。\]](http://docs.aws.amazon.com/ja_jp/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>

以下の単純なビューコントローラーのスニペットは、プレイヤー画面に URL をロードし、再生します。`playerView` プロパティは、XIB/ストーリーボードから初期化され、そのクラスは [IIdentity Inspector のカスタムクラスのセクションを使用して](https://developer.apple.com/tutorials/SwiftUI)インターフェイスビルダーの `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
```

------