반응형
해당 글에서는 화면 공유 기술 중 “인 앱(In-App) 화면 녹화 및 공유 기능”과 관련되어 이해하고 개발하는 과정에 대해서 작성하였습니다.
1) ReplayKit 정의 및 주요 기술들
💡ReplayKit 이란?
- ReplayKit은 iOS 9 이후 버전에서 사용 가능한 화면 공유를 지원하는 기술입니다.
- 이 기능을 사용하면 앱 내에서 사용자가 수행하는 작업을 다른 사용자와 공유할 수 있습니다.
1. Screen Recording(IOS 9 이상)
💡 실행 중인 앱을 녹화하고 미리 보기 컨트롤러에서 사진 및 공유로 저장하는 기술입니다.
💡 RPScreenRecorder, RPPreviewViewController 기능을 주된 기술로 사용합니다.
2. In-App Screen Capture(IOS 11 이상)
💡 실행 중인 앱을 녹화한 영상 및 음성 획득하는 기술입니다.
💡 RPScreenRecorder 기능을 주로 사용합니다
3. Live Broadcast(IOS 11 이상)
💡 실행중인 앱 이외에 IOS 화면도 전송가능게 하는 기술입니다.
💡 RPBroadcastActivityViewController 기능을 주된 기술로 사용합니다.
💡Target의 Broadcast Upload Extension을 추가하여 사용하는 기술입니다.
2) In-App Screen Capture
💡 해당 페이지에서는 인앱(In-APP) 기술로 In-App Screen Capture를 이용하여 “실행 중인 앱을 녹화하고 공유로 저장하는 기능”을 구현합니다.
1.1. RPScreenRecorder
💡 RPScreenRecorder란?
- ReplayKit의 클래스 중 하나로 앱의 오디오 및 비디오를 녹음하는 기능을 제공하는 공유 레코더 개체입니다.
- 이를 사용하면 앱 내에서 발생하는 이벤트들을 녹화할 수 있습니다. 그래서 이 기능은 앱을 벗어나면 동작하지 않습니다. 이를 해결하기 위해서는 foreground service를 사용하는 방법이 있습니다.
💡 해당 클래스는 NSObject로부터 상속을 받아서 사용할 수 있습니다.
RPScreenRecorder | Apple Developer Documentation
💡 RPScreenRecorder 개체의 메서드
메서드 | 설명 |
startCapture | 녹화를 시작합니다. |
stopCapture | 녹화를 중지합니다. |
discardRecording | 녹화를 중지하고 녹화 세션을 삭제합니다. |
startMicCaptureWithHandler | 마이크 오디오 캡처를 시작하고 핸들러를 호출합니다. |
stopMicCapture | 마이크 오디오 캡처를 중지합니다. |
isMicrophoneEnabled | 마이크 오디오 캡처가 현재 활성화되어 있는지 여부를 반환합니다. |
isRecording | 녹화가 현재 진행 중인지 여부를 반환합니다. |
isAvailable | RPScreenRecorder가 사용 가능한지 여부를 반환합니다. |
2) 실제 구현하기 : 앱 내에서만 화면 공유 기술 (ReplayKit)
💡 해당 기능은 앱을 벗어나는 경우 녹화가 되지 않지만 앱 내에서 처리되는 화면 공유 기술입니다.
1. 앱 내에서만 화면 공유 기술 : ReplayKit
💡 해당 기능은 앱을 벗어나는 경우 녹화가 되지 않지만 앱 내에서 처리되는 화면 공유 기술입니다.
1. 초기화면에서 “Start Recording” 버튼을 누릅니다.
💡 Start Recording 버튼을 누르면 아래의 함수가 호출이 됩니다.
import ReplayKit
import SwiftUI
/**
* 화면 녹화 기능
*/
func startRecording() {
let recorder = RPScreenRecorder.shared()
recorder.isMicrophoneEnabled = true
recorder.isCameraEnabled = true
recorder.startRecording(handler: { (error) in
if let unwrappedError = error {
print(unwrappedError.localizedDescription)
} else {
print("Started Recording Successfully")
}
})
isRecording = true
}
2. 해당 팝업이 출력되고 “화면 기록” 버튼을 누르면 시작이 됩니다
3. “Stop Recording” 버튼을 누르면 아래와 같은 앱 내에서 활동이 공유가 됩니다.
💡 Stop Recording 버튼을 누르면 아래의 함수가 수행이 됩니다. 아래의 함수가 수행되면 Preview를 호출하게 됩니다.
/**
* 화면 녹화 중지 기능
*/
func stopRecording() {
let recorder = RPScreenRecorder.shared()
recorder.stopRecording { [unowned self] (preview, error) in
if let unwrappedPreview = preview {
unwrappedPreview.previewControllerDelegate = self // 녹화 종료 버튼을 눌렀을 경우 Preview 화면이 출력됩니다.
UIApplication.shared.windows.first?.rootViewController?.present(unwrappedPreview, animated: true, completion: nil)
}
if let unwrappedError = error {
print(unwrappedError.localizedDescription)
}
}
isRecording = false
}
💡 녹화를 종료하게 되는 경우 아래의 preview가 출력이 됩니다.
/**
* ReplayKit으로 녹화를 종료하고 녹화된 동영상의 Preview를 보여주는 화면에서 "취소" 버튼이나 "저장" 버튼을 눌렀을 때 호출되는 함수입니다.
*/
func previewControllerDidFinish(_ previewController: RPPreviewViewController) {
print("previewControllerDidFinish 시점" )
previewController.dismiss(animated: true)
}
/**
* ReplayKit으로 녹화를 종료하고 "저장" 버튼을 눌렀을 때 호출되는 함수입니다.
*/
func previewController(_ previewController: RPPreviewViewController, didFinishWithActivityTypes activityTypes: Set<String>) {
print("previewController 시점" )
previewController.dismiss(animated: true)
}
[참고] 내 앨범에 동영상을 저장하기 위해서는 권한을 허용해야 합니다
# Key
Privacy - Photo Library Additions Usage Description
오늘도 감사합니다. 😀
반응형
'Swift > 이해하기' 카테고리의 다른 글
[Swift] 화면 공유 기술 - 3 : 전체 시스템 화면 공유 개발 (3) | 2023.03.10 |
---|---|
[Swift] 화면 공유 기술 - 2 : 전체 시스템 화면 공유 구축 (0) | 2023.03.10 |
[Swift] SwiftUI에서 Storyboard(UIKit) 화면을 불러오는 방법 : UIViewControllerRepresentable (0) | 2023.03.06 |
[Swift] 서버와 IOS 모바일 API 통신 방법 : URLSession, Alamofire (0) | 2023.02.28 |
[Swift] 카메라 & 음성 권한 요청 팝업: info.plist / info - Target (0) | 2023.02.23 |