From 604fc6f818f4e3ffe18ce4c0548bf65131cb384e Mon Sep 17 00:00:00 2001 From: YangJH Date: Tue, 12 Mar 2024 01:11:11 +0900 Subject: [PATCH] refactor: add permission checker --- ios/Video/Features/RCTVideoCapture.swift | 20 ++++++++++++++++++-- 1 file changed, 18 insertions(+), 2 deletions(-) diff --git a/ios/Video/Features/RCTVideoCapture.swift b/ios/Video/Features/RCTVideoCapture.swift index c70bd13bba..8005c081a8 100644 --- a/ios/Video/Features/RCTVideoCapture.swift +++ b/ios/Video/Features/RCTVideoCapture.swift @@ -1,8 +1,10 @@ import AVFoundation +import Photos // MARK: - CaptureError enum CaptureError: Error { + case permissionDenied case emptyPlayerItem case emptyPlayerItemOutput case emptyBuffer @@ -22,12 +24,11 @@ enum RCTVideoCapture { ) { DispatchQueue.global(qos: .userInitiated).async { do { + try RCTVideoCapture.checkPhotoAddPermission() let playerItem = try playerItem ?? { throw CaptureError.emptyPlayerItem }() let playerOutput = try playerOutput ?? { throw CaptureError.emptyPlayerItemOutput }() let currentTime = playerItem.currentTime() - let settings = [kCVPixelBufferPixelFormatTypeKey as String: kCVPixelFormatType_32BGRA] - let output = AVPlayerItemVideoOutput(pixelBufferAttributes: settings) let buffer = try playerOutput.copyPixelBuffer(forItemTime: currentTime, itemTimeForDisplay: nil) ?? { throw CaptureError.emptyBuffer }() let ciImage = CIImage(cvPixelBuffer: buffer) @@ -50,4 +51,19 @@ enum RCTVideoCapture { } } } + + static private func checkPhotoAddPermission() throws { + var status: PHAuthorizationStatus? + if #available(iOS 14, *) { + status = PHPhotoLibrary.authorizationStatus(for: .addOnly) + } else { + status = PHPhotoLibrary.authorizationStatus() + } + switch status { + case .restricted, .denied: + throw CaptureError.permissionDenied + default: + return; + } + } }