이어보기

TV SDK의 이어보기(Resume Playback) 기능을 사용하여 사용자가 마지막으로 시청한 위치부터 재생하는 방법을 안내합니다.

동작 원리

SDK는 onExit 콜백으로 종료 시 재생 정보를 제공하고,initialPosition으로 시작 위치를 지정합니다. 저장/복원 로직은 앱에서 구현합니다.

PlayerExitInfo

onExit 콜백에서 전달되는 정보입니다.

type PlayerExitInfo = {
    currentTime: number;    // 현재 재생 위치 (초)
    duration: number;       // 총 길이 (초)
    playIndex: number;      // 현재 플레이리스트 인덱스
    sourceUri: string;      // 현재 재생 중인 URL
};

전체 예제

import React, { useRef, useState, useEffect, useCallback } from 'react';
import { View, StyleSheet } from 'react-native';
import AsyncStorage from '@react-native-async-storage/async-storage';
import { VpePlayer } from '@sgrsoft/vpe-reactnative-tv-sdk';
import type { PlayerHandle, PlayerExitInfo } from '@sgrsoft/vpe-reactnative-tv-sdk';

export default function ResumePlayer() {
    const playerRef = useRef<PlayerHandle>(null);
    const [initialPosition, setInitialPosition] = useState<number | undefined>();
    const [ready, setReady] = useState(false);

    const sourceUri = 'https://example.com/video.m3u8';

    useEffect(() => {
        AsyncStorage.getItem(`resume:${sourceUri}`).then(val => {
            if (val) {
                const saved = JSON.parse(val);
                // 완료 근처(5초 이내)면 처음부터
                if (saved.time >= saved.duration - 5) {
                    setInitialPosition(0);
                } else {
                    setInitialPosition(saved.time);
                }
            }
            setReady(true);
        });
    }, []);

    const handleExit = useCallback((info: PlayerExitInfo) => {
        AsyncStorage.setItem(`resume:${info.sourceUri}`, JSON.stringify({
            time: info.currentTime,
            duration: info.duration,
        }));
    }, []);

    if (!ready) return <View style={styles.container} />;

    return (
        <View style={styles.container}>
            <VpePlayer
                ref={playerRef}
                accessKey="YOUR_ACCESS_KEY"
                options={{
                    playlist: [{ file: sourceUri }],
                    autostart: true,
                }}
                initialPosition={initialPosition}
                onExit={handleExit}
                onBack={() => { /* navigation.goBack() */ }}
            />
        </View>
    );
}

const styles = StyleSheet.create({
    container: { flex: 1, backgroundColor: '#000' },
});
TV SDK