🧑‍💻/Swift

iOS 18 부터 AVPlayer 재생 안되는 문제 해결하기

유리맥 2024. 11. 15. 13:27
반응형

AVPlayer를 사용한 동영상 재생이 iOS 18로 업데이트 후 재생이 안되는 문제가 발생했습니다.
같은 앱인데 iOS 17에서는 정상 동작하는데, iOS 18 기기만 재생이 안됩니다.

재생에 실패하면 이런 이미지가 뜹니다.

 

재생이 안될 땐 2가지를 확인해 보아야 하는데

1. AVPlayerItem.status

if let status = player.currentItem?.status {
    print("AVPlayerItem status: \(status.rawValue)")
}

AVPlayer에 설정한 AVPlayerItem의 status를 찍어보니 failed (2)가 나오더라구요.

2. AVPlayerItem.error

if let error = player.currentItem?.error {
    print("AVPlayerItem error: \(error)")
}

마찬가지로 error 변수가 있어서 찍어 보았습니다.

Domain=NSCocoaErrorDomain Code=257 "해당 파일을 볼 수 있는 권한이 없기 때문에 열 수 없습니다." UserInfo={NSUnderlyingError=0x302f994d0 {Error Domain=NSOSStatusErrorDomain Code=-12203 "(null)"}

 

저는 다음과 같이 AVAsset을 사용해서 AVPlayerItem을 만들고 AVPlayer에 주입했었습니다.
여기서 videoPath은 기기 내부의 영상 URL을 지정했었는데 이 부분이 보안 업데이트가 된 듯 했습니다.

(다시 생각해보면 로컬 파일에 URL로 직접 접근하는 건 보안 상 위험한 방식이었습니다. iOS 18부터 보안이 개선되었네요.)

let videoPath = "로컬 비디오 파일 URL"
let avAsset = AVAsset(url: URL(fileURLWithPath: videoPath))
let avPlayerItem = AVPlayerItem(asset: avAsset)
player.replaceCurrentItem(with: avPlayerItem)

 

Photos의 PHImageManager를 사용해서 PHAsset을 AVAsset로 변환한 뒤,
AVPlayerItem을 생성하니 문제가 해결되었습니다.

PHAsset은 아이폰 사진, 동영상과 같은 미디어 타입입니다. 사용자가 허용한 범위 내에서 미디어를 불러올 수 있습니다.

import Photos
import AVFoundation

func requestAVAsset(from phAsset: PHAsset, completion: @escaping (AVAsset?) -> Void) {
    let options = PHVideoRequestOptions()
    options.deliveryMode = .highQualityFormat  // 품질 설정 옵션
    
    // PHImageManager를 통해 AVAsset 요청
    PHImageManager.default().requestAVAsset(forVideo: phAsset, options: options) { avAsset, audioMix, info in
        // 요청된 AVAsset을 completion handler로 전달
        DispatchQueue.main.async {
            completion(avAsset)
        }
    }
}
반응형