

# IVS iOS Broadcast SDK の開始方法 \$1 Low-Latency Streaming
<a name="broadcast-ios-getting-started"></a>

このドキュメントでは、Amazon IVS Low-Latency Streaming iOS Broadcast SDK の使用を開始するための手順について説明します。

## ライブラリのインストール
<a name="broadcast-ios-install"></a>

Swift Package Manager を介して Broadcast SDK を統合することをお勧めします。(代わりに、フレームワークを手動でプロジェクトに追加することも可能です)。

### 推奨: Broadcast SDK の統合 (Swift Package Manager)
<a name="broadcast-ios-install-swift"></a>

1. Package.swift ファイルを「[https://broadcast.live-video.net/1.40.0/Package.swift](https://broadcast.live-video.net/1.40.0/Package.swift)」からダウンロードしてください。

1. プロジェクトで AmazonIVSBroadcast という名前の新しいディレクトリを作成し、バージョン管理に追加します。

1. ダウンロードした Package.swift ファイルを新しいディレクトリに配置します。

1. Xcode で **[ファイル] > [パッケージの依存関係を追加]** に移動し、**[ローカルに追加]** を選択します。

1. 作成した AmazonIVSBroadcast ディレクトリに移動して選択たら、**パッケージの追加**を選択します。

1. **AmazonIVSBroadcast のパッケージ製品の選択**を求められたら、「**ターゲットに追加**」セクションでアプリケーションターゲットを設定し、**[AmazonIVSBroadcast]** を**パッケージ製品**として選択します。

1. **パッケージの追加**を選択します。

### 代替方法: フレームワークを手動でインストールする
<a name="broadcast-ios-install-manual"></a>

1. 次のリンクから最新バージョンをダウンロードします。[https://broadcast.live-video.net/1.40.0/AmazonIVSBroadcast.xcframework.zip](https://broadcast.live-video.net/1.40.0/AmazonIVSBroadcast.xcframework.zip)

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

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

## IVSBroadcastSession.Delegate の実装
<a name="broadcast-ios-implement-ivsbroadcastsessiondelegate"></a>

`IVSBroadcastSession.Delegate` を実装します。これにより、状態の更新やデバイス変更の通知を受け取ることができます。

```
extension ViewController : IVSBroadcastSession.Delegate {
   func broadcastSession(_ session: IVSBroadcastSession,
                         didChange state: IVSBroadcastSession.State) {
      print("IVSBroadcastSession did change state \(state)")
   }

   func broadcastSession(_ session: IVSBroadcastSession,
                         didEmitError error: Error) {
      print("IVSBroadcastSession did emit error \(error)")
   }
}
```

## 必要なアクセス許可
<a name="broadcast-ios-permissions"></a>

アプリはユーザーのカメラとマイクへのアクセス許可を要求する必要があります。(これは、Amazon IVS に特有なものではなく、カメラやマイクにアクセスする必要があるアプリケーションには必須です。)

ここでは、ユーザーがすでにアクセス許可を付与しているかどうかを確認し、付与していない場合は、許可を求めます。

```
switch AVCaptureDevice.authorizationStatus(for: .video) {
case .authorized: // permission already granted.
case .notDetermined:
   AVCaptureDevice.requestAccess(for: .video) { granted in
       // permission granted based on granted bool.
   }
case .denied, .restricted: // permission denied.
@unknown default: // permissions unknown.
}
```

カメラやマイクにアクセスするには、`.video` と `.audio` の両方のメディアタイプに対してこれを行う必要があります。

また、`NSCameraUsageDescription` と `NSMicrophoneUsageDescription` のエントリを `Info.plist` に追加する必要があります。これを行わずにアクセス許可をリクエストすると、アプリがクラッシュします。

## アプリケーションアイドルタイマーの無効化
<a name="broadcast-ios-disable-idle-timer"></a>

これはオプションですが推奨されます。Broadcast SDK の使用中にデバイスがスリープ状態になり、ブロードキャストが中断されるのを防ぎます。

```
override func viewDidAppear(_ animated: Bool) {
   super.viewDidAppear(animated)
   UIApplication.shared.isIdleTimerDisabled = true
}
override func viewDidDisappear(_ animated: Bool) {
   super.viewDidDisappear(animated)
   UIApplication.shared.isIdleTimerDisabled = false
}
```

## (オプション) AVAudioSession をセットアップする
<a name="broadcast-ios-setup-avaudiosession"></a>

デフォルトでは、Broadcast SDK がアプリケーション `AVAudioSession` をセットアップします。これを自分で管理する場合は、`IVSBroadcastSession.applicationAudioSessionStrategy` を `noAction` に設定します。`AVAudioSession` の制御がなければ、Broadcast SDK はマイクロホンを内部的に管理できません。オプション `noAction` でマイクを使用するには、`IVSCustomAudioSource` を作成し、`AVCaptureSession`、`AVAudioEngine`、または PCM オーディオサンプルを提供する別のツールを介して独自のサンプルを提供できます。

手動で `AVAudioSession` をセットアップするには、少なくとも、カテゴリを `.record` または `.playbackAndRecord` に設定し、それを `active` に設定する必要があります。Bluetooth デバイスからオーディオを録音する場合は、`.allowBluetooth` オプションも設定する必要があります。

```
do {
   try AVAudioSession.sharedInstance().setCategory(.record, options: .allowBluetooth)
   try AVAudioSession.sharedInstance().setActive(true)
} catch {
   print("Error configuring AVAudioSession")
}
```

SDK にこれを処理させることをお勧めします。異なるオーディオデバイスを選択する場合は、ポートを手動で管理する必要があります。

## ブロードキャストセッションの作成
<a name="broadcast-ios-create-session"></a>

ブロードキャストインターフェースは `IVSBroadcastSession` です。以下に示すように、インターフェイスを初期化します。

```
let broadcastSession = try IVSBroadcastSession(
   configuration: IVSPresets.configurations().standardLandscape(),
   descriptors: IVSPresets.devices().frontCamera(),
   delegate: self)
```

「[ブロードキャストセッションの作成 (詳細バージョン)](broadcast-ios-use-cases.md#broadcast-ios-create-session-advanced)」も参照してください。

## プレビュー用に IVSImagePreviewView を設定する
<a name="broadcast-ios-set-imagepreviewview"></a>

アクティブなカメラデバイスのプレビューを表示する場合は、デバイスのプレビュー `IVSImagePreviewView` をビュー階層に追加します。

```
// If the session was just created, execute the following 
// code in the callback of IVSBroadcastSession.awaitDeviceChanges 
// to ensure all devices have been attached.
if let devicePreview = try broadcastSession.listAttachedDevices()
   .compactMap({ $0 as? IVSImageDevice })
   .first?
   .previewView()
{
   previewView.addSubview(devicePreview)
}
```

## ブロードキャストを開始する
<a name="broadcast-ios-start"></a>

`GetChannel` オペレーションの `ingestEndpoint` レスポンスフィールドで受信するホスト名には、`rtmps://` を先頭に追加して `/app` を末尾に追加する必要があります。URL は、`rtmps://{{ ingestEndpoint }}/app` の形式にする必要があります。

```
try broadcastSession.start(with: IVS_RTMPS_URL, streamKey: IVS_STREAMKEY)
```

 iOS Broadcast SDK は RTMPS 取り込みのみをサポートしています (安全ではない RTMP 取り込みはサポートしていません)。

## ブロードキャストを停止する
<a name="broadcast-ios-stop"></a>

```
broadcastSession.stop()
```

## ライフサイクルイベントの管理
<a name="broadcast-ios-lifecycle-events"></a>

### オーディオの中断
<a name="broadcast-ios-audio-interruptions"></a>

Broadcast SDK がオーディオ入力ハードウェアに排他的にアクセスできないシナリオがいくつかあります。処理する必要があるシナリオの例は、次のとおりです。
+ ユーザーが電話または FaceTime 通話を受信する
+ ユーザーが Siri をアクティベートする

Apple では、`AVAudioSession.interruptionNotification` に登録することで、これらのイベントに簡単に対応できるようにしています。

```
NotificationCenter.default.addObserver(
   self,
   selector: #selector(audioSessionInterrupted(_:)),
   name: AVAudioSession.interruptionNotification,
   object: nil)
```

次のような方法でイベントを処理できます。

```
// This assumes you have a variable `isRunning` which tracks if the broadcast is currently live, and another variable `wasRunningBeforeInterruption` which tracks whether the broadcast was active before this interruption to determine if it should resume after the interruption has ended.

@objc
private func audioSessionInterrupted(_ notification: Notification) {
   guard let userInfo = notification.userInfo,
         let typeValue = userInfo[AVAudioSessionInterruptionTypeKey] as? UInt,
         let type = AVAudioSession.InterruptionType(rawValue: typeValue)
   else {
      return
   }
   switch type {
   case .began:
      wasRunningBeforeInterruption = isRunning
      if isRunning {
         broadcastSession.stop()
      }
   case .ended:
      defer {
         wasRunningBeforeInterruption = false
      }
      guard let optionsValue = userInfo[AVAudioSessionInterruptionOptionKey] as? UInt else { return }
      let options = AVAudioSession.InterruptionOptions(rawValue: optionsValue)
      if options.contains(.shouldResume) && wasRunningBeforeInterruption {
         try broadcastSession.start(
            with: IVS_RTMPS_URL,
            streamKey: IVS_STREAMKEY)
      }
   @unknown default: break
   }
}
```

### バックグラウンドに移行したアプリケーションについて
<a name="broadcast-ios-app-to-background"></a>

iOS の標準アプリケーションは、バックグラウンドでカメラを使用することはできません。バックグラウンドでの動画エンコーディングにも制限があります。ハードウェアエンコーダには制限があるため、フォアグラウンドアプリケーションだけがアクセス可能です。このため、Broadcast SDK は自動的にセッションを終了し、`isReady` プロパティを `false` に設定します。アプリケーションがフォアグラウンドに再び移行しようとすると、Broadcast SDK がすべてのデバイスを元の `IVSMixerSlotConfiguration` エントリに再アタッチします。

Broadcast SDK は、`UIApplication.didEnterBackgroundNotification` と `UIApplication.willEnterForegroundNotification` に応答することでこれを行います。

カスタムイメージソースを提供する場合は、これらの通知を処理する準備が必要です。ストリームが終了する前に、それらを破棄するために追加の手順の実行が必要になる場合があります。

アプリケーションがバックグラウンドにあるときにストリーミングを有効にする回避策については、「[バックグラウンドビデオの使用](broadcast-ios-use-cases.md#broadcast-ios-background-video)」を参照してください。

### メディアサービスの消失
<a name="broadcast-ios-media-services-lost"></a>

ごくまれに、iOS デバイス上のメディアサブシステム全体がクラッシュすることがあります。このシナリオでは、ブロードキャストすることができなくなります。これらの通知に適切に応答するかどうかは、アプリケーションに依存します。少なくとも、次の通知を登録してください。
+ [mediaServicesWereLostNotification](https://developer.apple.com/documentation/avfaudio/avaudiosession/1616457-mediaserviceswerelostnotificatio) — ブロードキャストを停止し、 `IVSBroadcastSession` の割り当てを完全に解除することで応答します。ブロードキャストセッションが使用するすべての内部コンポーネントが無効になります。
+ [mediaServicesWereResetNotification](https://developer.apple.com/documentation/avfaudio/avaudiosession/1616540-mediaserviceswereresetnotificati) — ユーザーに再度ブロードキャストできることを通知することによって応答します。ユースケースによっては、この時点でブロードキャストを自動的に開始することができます。