# Livestream

The UIKit now supports live stream posts so you can create and watch live streams.

### Installation

To enable live stream functionalities easily, we’ve provided `AmityUIKitLiveStream`, which is built on top of social.plus UIKit and social.plus SDK.

The plugin provides:

* `LiveStreamBroadcastViewController` to create and broadcast live stream posts
* `LiveStreamPlayerViewController` to watch live streams

The live stream plugin can be installed via Swift Package Manager with these steps:

1. In Xcode, select **File** > **Swift Packages** > **Add Package Dependency**.
2. Specify the Repository: <https://github.com/AmityCo/Amity-Social-Cloud-UIKit-LiveStream-iOS-SwiftPM>.
3. Select **Up to Next Major**, then click **Next**.
4. Select `AmityUIKitLiveStream, then` click **Finish**.

After successfully installing the plugin, you must override the live stream behaviors with these steps:

1. Create `AmityEventHandler` subclass, and override live stream functions.

   ```swift
   import UIKit
   import AVKit
   import AmityUIKit
   import AmitySDK
   import AmityUIKitLiveStream
   import AmityVideoPlayerKit

   class CustomEventHandler: AmityEventHandler {

       override func createLiveStreamPost(
           from source: AmityViewController,
           targetId: String?,
           targetType: AmityPostTargetType,
           destinationToUnwindBackAfterFinish: UIViewController
       ) {

           let broadcastVC =
               LiveStreamBroadcastViewController(client: AmityUIKitManager.client, targetId: targetId, targetType: targetType)
           broadcastVC.destinationToUnwindBackAfterFinish = destinationToUnwindBackAfterFinish
           broadcastVC.modalPresentationStyle = .fullScreen
           source.present(broadcastVC, animated: true, completion: nil)

       }

       override func openLiveStreamPlayer(from source: AmityViewController, postId: String, streamId: String) {

           let playerVC = LiveStreamPlayerViewController(streamIdToWatch: streamId)
           source.present(playerVC, animated: true, completion: nil)

       }

       override func openRecordedLiveStreamPlayer(from source: AmityViewController, postId: String, stream: AmityStream) {
           let player = AmityRecordedStreamPlayer(client: AmityUIKitManager.client, stream: stream)
           let playerViewController = AVPlayerViewController()
           playerViewController.player = player
           source.present(playerViewController, animated: true) { [weak player] in
               player?.play()
           }
       }

   }
   ```
2. Set the custom event handler for `social.plus UIKit`.

   ```
   AmityUIKitManager.set(eventHandler: CustomEventHandler())
   ```

### App Permissions

`LiveStreamBroadcastViewController` requires these permissions:

1. Camera Permission - to broadcast live stream video
2. Microphone Permission - to broadcast live stream audio

After `LiveStreamBroadcastViewController` is presented, it will prompt to ask permission automatically if needed. You must include these permission keys in your app’s Info.plist file:

1. `NSCameraUsageDescription`
2. `NSMicrophoneUsageDescription`
