iOS 18 부터 AVPlayer 재생 안되는 문제 해결하기
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)
}
}
}