API: Etc

    API: Etc


    기사 요약

    mute

    현재 재생 중인 영상을 음소거 합니다.

    func mute()

    Sample code

    ShopLive.mute()


    unmute

    현재 재생 중인 영상을 음소거를 해제합니다.

    func unmute()

    Sample code

    ShopLive.unmute()


    getCampaigns

    accessKey 에 속한 캠페인(방송) 목록과 각 캠페인의 현재 상태를 조회합니다. 호출 전에 ShopLive.configure(with:) 로 accessKey 를 설정해야 합니다. iOS SDK 1.8.15 이상에서 사용할 수 있습니다.

    extension ShopLive.API {
    
        // completion
        @discardableResult
        static func getCampaigns(_ request: ShopLiveCampaignListRequest = ShopLiveCampaignListRequest(),
                                 completion: @escaping (Result<ShopLiveCampaignListResponse, ShopLiveCommonError>) -> Void) -> ShopLiveCancellable
    
        // async/await (iOS 13+)
        static func getCampaigns(_ request: ShopLiveCampaignListRequest = ShopLiveCampaignListRequest()) async throws -> ShopLiveCampaignListResponse
    }

    참고

    • completion 은 main thread 에서 호출됩니다.

    • 반환값 ShopLiveCancellablecancel() 로 진행 중인 요청을 취소할 수 있습니다. async 버전은 Task 가 취소되면 요청도 함께 취소됩니다.

    • 요청·응답 타입은 ShopliveSDKCommon 모듈에 정의되어 있습니다. 타입 이름을 코드에서 직접 사용할 때는 import ShopliveSDKCommon 이 필요합니다.

    ShopLiveCampaignListRequest

    조회 조건입니다. 모든 파라미터는 선택(optional)이며, 인자 없이 ShopLiveCampaignListRequest() 를 넘기면 서버 기본값으로 전체 상태를 조회합니다.

    Parameter name

    Type

    Description

    page

    Int?

    페이지 번호. 1부터 시작합니다. (Default: 1)

    size

    Int?

    페이지당 캠페인 개수. 최대 20 입니다. (Default: 10)

    statuses

    [ShopLiveCampaignListRequest.Status]

    조회할 상태 필터. 비어 있으면 전체 상태를 조회합니다. .ready(READY) / .onair(ONAIR) / .closed(CLOSED) 3종만 지정할 수 있습니다.

    order

    ShopLiveCampaignListRequest.Order?

    scheduledAt 기준 정렬 방향. .ascending / .descending (Default: .descending, 최신순)

    ShopLiveCampaignListResponse

    조회 결과입니다.

    Property

    Type

    Description

    campaigns

    [ShopLiveCampaign]

    조회된 캠페인 목록

    hasMore

    Bool

    다음 페이지가 있는지 여부. true 이면 page 를 1 증가시켜 다시 조회합니다.

    ShopLiveCampaign

    캠페인 한 건의 정보입니다.

    Property

    Type

    Description

    campaignId

    Int64

    캠페인 ID

    campaignKey

    String

    캠페인 키. ShopLive.play(data:) / ShopLive.preview(data:completion:) 의 campaignKey 로 사용합니다.

    title

    String?

    캠페인 제목

    description

    String?

    캠페인 설명

    campaignUrl

    String?

    캠페인 URL

    rerun

    Bool

    재방송 여부

    archiveStream

    Bool

    아카이브 스트림(다시보기) 제공 여부

    privateLive

    Bool

    프라이빗 방송 여부. 목록에 그대로 포함되므로 노출 여부는 앱에서 판단합니다.

    scheduledAt

    Date?

    방송 예정 시각

    scheduledEndAt

    Date?

    방송 예정 종료 시각

    posterUrl

    String?

    포스터 이미지 URL

    lifecycle

    ShopLiveCampaign.Lifecycle

    상태와 상태 전환 시각

    metrics

    ShopLiveCampaign.Metrics?

    시청 지표. .onair / .closed 상태에서만 내려오며 그 외 상태에서는 nil 입니다.

    ShopLiveCampaign.Lifecycle

    캠페인의 상태와 상태 전환 시각입니다.

    Property

    Type

    Description

    status

    ShopLiveCampaign.Status

    캠페인 상태. 리허설 중은 .ready, 종료 진행 중은 .onair 로 표기됩니다.

    rehearsal

    Bool

    리허설 여부. 리허설 중에도 status 는 .ready 이므로 이 값으로 구분합니다.

    startedAt

    Date?

    방송 시작 시각

    closingAt

    Date?

    종료 진행 시작 시각. status 가 .onair 이고 이 값이 있으면 종료 진행 중입니다.

    endedAt

    Date?

    방송 종료 시각

    ShopLiveCampaign.Status

    캠페인 상태 값입니다. 서버 값이 그대로 매핑되며, 정의되지 않은 값은 .unknown 으로 전달됩니다.

    Case

    Server value

    Description

    .reserved

    RESERVED

    예약된 방송. 요청 필터(statuses)로는 지정할 수 없고 전체 조회 시에만 포함됩니다.

    .ready

    READY

    방송 준비(대기) 중. lifecycle.rehearsal 이 true 이면 리허설 중입니다.

    .onair

    ONAIR

    방송 중. lifecycle.closingAt 이 있으면 종료 진행 중입니다.

    .closed

    CLOSED

    방송 종료

    .unknown(String)

    그 외

    정의되지 않은 서버 상태 값입니다. 향후 추가되는 상태에 대비해 원본 문자열을 그대로 담습니다.

    ShopLiveCampaign.Metrics

    시청 지표입니다. .onair / .closed 상태에서만 제공됩니다.

    Property

    Type

    Description

    userCount

    Int?

    시청자 수

    adoreCount

    Int?

    좋아요(하트) 수

    showUserCount

    Bool

    false 이면 userCount / adoreCount 를 UI 에 노출하지 않아야 합니다.

    에러 처리

    실패 시 ShopLiveCommonError 가 전달됩니다. codes 에 오류 코드가 담기며, message 는 항상 고정 문구 Failed to fetch campaign list. Refer to the error code. 입니다. 원인은 codes 로 판별하세요. 서버가 반환한 오류 코드는 그대로 전달되며, 전체 코드 목록은 Error codes 문서를 참고하세요.

    Code

    Description

    9000

    accessKey 가 설정되지 않았습니다. ShopLive.configure(with:) 를 먼저 호출하세요.

    -200

    존재하지 않는 accessKey 입니다. (Customer Account Not Found)

    그 외 서버 오류 코드

    서버가 반환한 오류 코드가 그대로 전달됩니다. Error codes 문서를 참고하세요.

    HTTP 상태 코드

    서버가 오류 본문 없이 응답한 경우 HTTP 상태 코드(예: 404, 500)가 그대로 전달됩니다.

    9900

    네트워크 연결에 실패했습니다.

    9901

    응답 JSON 파싱에 실패했습니다.

    10000

    예기치 못한 오류입니다.

    Sample code

    import ShopLiveSDK
    import ShopliveSDKCommon
    
    // accessKey 설정 (앱에서 최초 1회)
    ShopLive.configure(with: "{accessKey}")
    
    // 방송 중 · 준비 중인 캠페인을 최신순으로 20개 조회
    let request = ShopLiveCampaignListRequest(page: 1,
                                              size: 20,
                                              statuses: [.onair, .ready],
                                              order: .descending)
    
    let cancellable = ShopLive.API.getCampaigns(request) { result in
        switch result {
        case let .success(response):
            for campaign in response.campaigns {
                switch campaign.lifecycle.status {
                case .reserved:
                    print("예약", campaign.title ?? "")
                case .ready:
                    print(campaign.lifecycle.rehearsal ? "리허설 중" : "준비 중", campaign.title ?? "")
                case .onair:
                    print(campaign.lifecycle.closingAt == nil ? "방송 중" : "종료 진행 중", campaign.title ?? "")
                case .closed:
                    print("종료", campaign.title ?? "")
                case let .unknown(raw):
                    print("알 수 없는 상태", raw)
                }
            }
            if response.hasMore {
                // page 를 1 증가시켜 다음 페이지를 조회합니다.
            }
        case let .failure(error):
            print("getCampaigns failed:", error.codes, error.message ?? "")
        }
    }
    
    // 결과가 더 이상 필요 없으면(화면 이탈 등) 요청을 취소합니다.
    // cancellable.cancel()

    Sample code (async/await)

    // iOS 13+ — Task 가 취소되면 진행 중인 요청도 함께 취소됩니다.
    Task {
        do {
            let response = try await ShopLive.API.getCampaigns(ShopLiveCampaignListRequest(statuses: [.onair]))
            let onair = response.campaigns.filter { $0.lifecycle.closingAt == nil }
            if let campaign = onair.first {
                ShopLive.play(data: ShopLivePlayerData(campaignKey: campaign.campaignKey))
            }
        } catch let error as ShopLiveCommonError {
            print("getCampaigns failed:", error.codes)
        } catch {
            // Task 취소(CancellationError) 등
        }
    }


    What's Next