Я использую ReplayKit для сохранения записи экрана, и как только это будет сделано, она выводится на URL-адрес.
Когда я распечатайте URL-адрес, я получаю локальное значение, что-то вроде:
file:///private/var/mobile/Containers/Data/Application/E1A1A2CD-53A7-4FE0-894A-3F52377EAE72/tmp/D886623A-A42A-4D8D-ADD4-2D8705BC032F-recording.mov
В этот момент я хочу попросить пользователя сохранить или поделиться данными, расположенными по этому URL-адресу. Для этого я использую UIActivityViewController, и он отлично работает для коротких записей (несколько секунд).
Моя проблема в том, что он просто не работает для более длительных записей. (т.е. файлы большего размера). Кажется, он начинает ломаться где-то через 30 секунд. Нет никакого вывода вообще, никаких предупреждений, никаких сбоев.
- Это предел ReplayKit? Я по-прежнему вижу создание URL-адреса, даже для больших файлов, поэтому похоже, что это не так.
- Это предел UIActivityViewController?
Подробнее о коде
Я использую SwiftUI, поэтому использую это:
struct ActivityViewController: UIViewControllerRepresentable {
var activityItems: [Any]
var applicationActivities: [UIActivity]? = nil
func makeUIViewController(context: UIViewControllerRepresentableContext) -> UIActivityViewController {
let controller = UIActivityViewController(activityItems: activityItems, applicationActivities: applicationActivities)
return controller
}
func updateUIViewController(_ uiViewController: UIActivityViewController, context: UIViewControllerRepresentableContext) {}
}
Тогда представление выглядит следующим образом (для обсуждения я упростил код):
struct RecordButton: View {
@State var showShareSheet = false
@State var url: URL?
@State var recording: Bool = false
let recorder = RPScreenRecorder.shared()
var body: some View {
Button(action: {
if(recording) {
Task {
do {
self.url = try await stopRecording()
showShareSheet = true
} catch {
print("Error")
}
}
} else {
startRecording()
}
}) {
Text("Record")
}.sheet(isPresented: $showShareSheet, content: {
ActivityViewController(activityItems: [url!])
})
}
func startRecording() {
recorder.startRecording( handler: { error in
if let error = error {
return
}
})
}
func stopRecording() async throws -> URL {
let name = UUID().uuidString + "-recording.mov"
let url = FileManager.default.temporaryDirectory.appendingPathComponent(name)
try await recorder.stopRecording(withOutput: url)
return url
}
Подробнее здесь: https://stackoverflow.com/questions/783 ... le-sharing
Мобильная версия