-
iOS 18 부터 AVPlayer 재생 안되는 문제 해결하기🧑💻/Swift 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) } } }
반응형