2. 플레이어 실행하기
라이브 ID 하나로 플레이어를 띄웁니다. UIKit 앱은 앱이 준 UIViewController 안에 자식으로 넣고, SwiftUI 앱은 .sauceLivePlayer 로 전체 화면에 띄웁니다.
UIKit 화면에서는 새 화면을 띄우지 않습니다. 컨테이너 화면(UIViewController)을 넘기면 플레이어가 그 안에 자식으로 들어갑니다.
SwiftUI 앱은 아래 SwiftUI 앱에서 띄우기를 씁니다. SwiftUI 화면(UIHostingController)을 컨테이너로 넘기면 그 안에 붙이지 않고 별도 창에 전체 화면으로 띄웁니다.
콜백은 Event handler 의 SauceClient.setLivePlayerCallback 으로 앱 전체에 한 번 등록합니다.
SauceClient.startLivePlayer(broadcastID: "라이브 ID", token: nil, from: self)
플레이어별로 다른 콜백을 주거나 closePlayer() 로 직접 닫으려면 아래처럼 인스턴스를 만듭니다.
import SauceSDK class LivePlayerVC: UIViewController { private var player: SauceLivePlayerClient? override func viewDidLoad() { super.viewDidLoad() let player = SauceLivePlayerClient.getInstance( broadcastID: "라이브 ID", token: nil, // 게스트 모드 — 회원 연동은 다음 단계에서 viewController: self ) // ⚠️ 콜백을 먼저 등록한 뒤 startPlayer() 를 호출합니다 player.onClose = { [weak self] in self?.dismiss(animated: true) } player.startPlayer() self.player = player } }
startPlayer() 보다 먼저 등록하세요 — 순서가 바뀌면 실행 직후에 발생한 이벤트를 놓칠 수 있습니다.
closePlayer() 로 직접 닫을 때도 이 참조가 필요합니다.
띄울 화면에 .sauceLivePlayer 를 붙이고, isPresented 를 true 로 바꾸면 플레이어가 전체 화면으로 뜹니다.
시청자가 닫으면 SDK 가 isPresented 를 false 로 되돌립니다. 앱이 false 로 바꾸면 플레이어를 닫습니다.
import SwiftUI import SauceSDK struct LiveButton: View { @State private var showPlayer = false var body: some View { Button("라이브 보기") { showPlayer = true } .sauceLivePlayer(isPresented: $showPlayer, broadcastID: "라이브 ID", token: nil) .onSauceProductClick { info in // 앱의 상품 화면으로 이동 return true } } }
콜백은 .onSauce… modifier 로 받습니다. 같은 화면 계층 어디에 붙여도 됩니다. 각 modifier 는 인스턴스 클로저와 같은 콜백입니다(예: onSauceProductClick 은 onProductClick).
| modifier | 받는 것 |
|---|---|
onSauceClose | 플레이어가 닫힘. 원인이 함께 옵니다. isPresented 는 이미 false 로 바뀐 뒤입니다 |
onSauceLoginRequest | 로그인 요청. 로그인 뒤 SauceClient.updateAccessToken 으로 회원 전환합니다 |
onSauceProductClick | 상품 클릭. 앱이 처리했으면 true 를 돌려줍니다 |
onSauceRewardClick | 리워드 보상 이동. 반환 규칙은 상품 클릭과 같습니다 |
onSauceBannerClick | 배너 클릭. true 면 SDK 가 열지 않습니다 |
onSauceCouponLinkClick | 쿠폰 링크. true 면 SDK 가 열지 않습니다 |
onSauceShare | 공유 버튼. true 면 SDK 가 공유 시트를 띄우지 않습니다 |
onSauceOpenLink | 로고 · 상담 · 전화 등 링크. true 면 SDK 가 열지 않습니다 |
onSauceCouponDownload | 쿠폰 발급 요청 |
onSauceCouponCustom | 어드민에 등록한 쿠폰 문자열 |
onSauceCart | 장바구니 담기 |
onSauceTurnOnNotification | 방송 알림 신청 |
onSauceTurnOffNotification | 방송 알림 해제 |
onSdkAuthFailed)와 onProductLayerClick 은 SauceClient.setLivePlayerCallback 으로 앱 전체에 등록합니다. modifier 를 붙이지 않은 콜백도 이 객체가 받습니다. onSauceError 는 선언만 있고 호출되지 않습니다.
호출 두 개로 끝나지만, 내부에서는 아래 순서로 진행됩니다.
화면이 뜨지 않을 때 어디까지 진행됐는지 가늠하는 데 도움이 됩니다.
-
1
getInstance가 SDK 초기화 상태를 확인합니다. 초기화하지 않았으면 여기서 앱이 종료됩니다. appKey 가 거부된 상태면startPlayer()가 화면을 띄우지 않고onSdkAuthFailed를 다시 알립니다. -
2
startPlayer가 플레이어를 컨테이너의 자식 화면으로 추가하고 컨테이너 크기를 그대로 채웁니다. -
3토큰을 확인합니다.
nil이면 게스트 계정을 자동 발급받습니다. -
4방송 정보를 받아 영상·채팅·상품 목록을 구성합니다. 이 단계에서 실패하면 시청자 화면에 오류가 표시되고 콘솔에 로그가 남습니다.
시청자가 플레이어의 닫기 버튼을 누르면 onClose 가 호출됩니다.
화면을 내리는 것은 앱이 해야 합니다. SDK 는 자기 자신만 정리합니다.
| 상황 | 설명 |
|---|---|
| 시청자가 닫기 버튼을 누름 | onClose 가 호출됩니다.앱이 dismiss 또는 popViewController 로 화면을 내립니다 |
| 앱이 직접 닫아야 함 | player.closePlayer() 를 호출합니다.플레이어가 정리되고 컨테이너에서 제거됩니다 |
| 방송을 열 수 없어 닫힘 | onClose(reason: .unavailable) 이 호출됩니다.비밀번호 입력 취소, 취소된 방송 등이 해당합니다 |
순서대로 확인하세요. 대부분 앞의 두 가지입니다.
appKey 문제는 onSdkAuthFailed 로 코드가 옵니다 — Error codes.
| 증상 | 확인할 것 |
|---|---|
| 화면이 비어 있다 | onSdkAuthFailed 가 호출됐는지 확인합니다. appKey 인증이 실패했을 수 있습니다 → 확인 방법 |
| 방송이 없다고 나온다 | apiHost 를 확인합니다. .stage 로 두면 테스트 서버에 붙으므로 실제 방송은 보이지 않습니다 |
| 진행 중인 방송이 안 보인다 | 라이브 ID 가 맞는지, 그 방송이 지금 송출 중인지 확인합니다 |
| 앱이 종료된다 | initInstance 보다 먼저 getInstance 를 불렀습니다. SauceClient.isInitialized 로 먼저 확인하세요 |
라이브 ID 는 소스 어드민에서 확인합니다.
라이브를 편성한 뒤 라이브 송출 정보 확인에서 값을 복사해 broadcastId 에 그대로 전달하세요.
broadcastId 자리에 VOD ID 를 전달합니다. 호출 방법은 동일합니다.
Updated about 19 hours ago
