#ios #swift #swiftui #replaykit
#iOS #swift #swiftui #replaykit
Вопрос:
Я пытаюсь реализовать ReplayKit
экранную трансляцию в приложении SwiftUI.
По словам Apple, мне понадобится расширение для широковещательной загрузки для обработки загрузки видео, а также несколько методов делегирования для переноса поведения выбора правильного расширения и запуска трансляции.
Я уже настроил расширение, но у меня возникли проблемы с подключением его к моему простому приложению SwiftUI, которое просто транслирует экран iPad, ничего больше.
Давайте представим, что у меня есть простое приложение SwiftUI:
import SwiftUI
struct BroadcastView: View {
@State private var broadcastStarted = false
var body: some View {
Text("Hello, World!")
Button("Toggle") {
startBroadcast()
}
}
func startBroadcast() {
if broadcastStarted {
// Do something to start
} else {
// Terminate the broadcast
}
broadcastStarted.toggle()
}
}
Если бы я использовал Swift вместо SwiftUI, этого обычно было бы достаточно:
import UIKit
import ReplayKit
class BroadcastViewController: UIViewController, RPBroadcastActivityViewControllerDelegate, RPBroadcastControllerDelegate {
var broadcastController : RPBroadcastController?
override func viewDidLoad() {
super.viewDidLoad()
}
@IBAction func startBroadcast(_ sender: UIButton) {
if sender.isSelected {
sender.isSelected = false
guard (self.broadcastController == nil) else {
self.broadcastController?.finishBroadcast(handler: { (error) in
print(error as Any)
})
return
}
}else{
RPBroadcastActivityViewController .load { (activity, error) in
if error == nil {
activity?.delegate = self as RPBroadcastActivityViewControllerDelegate
self.present(activity!, animated: true, completion: nil)
}
}
}
}
// MARK: - RPBroadcastActivityViewControllerDelegate
func broadcastActivityViewController(_ broadcastAVC: RPBroadcastActivityViewController, didFinishWith broadcastController: RPBroadcastController?, error: Error?) {
self.broadcastController = broadcastController
self.broadcastController?.delegate = self
broadcastAVC.dismiss(animated: true) {
self.broadcastController?.startBroadcast(handler: { error in
print("started broadcast (error)")
})
}
}
// MARK: - RPBroadcastControllerDelegate
func broadcastController(_ broadcastController: RPBroadcastController, didFinishWithError error: Error?) {
}
func broadcastController(_ broadcastController: RPBroadcastController, didUpdateServiceInfo serviceInfo: [String : NSCoding amp; NSObjectProtocol]) {
}
}
Я думаю, мне следует включить контроллер UIViewControllerRepresentable
, чтобы использовать его в моем приложении SwiftUI, но я понятия не имею, как это сделать. Я пробовал несколько подходов, но ни один из них не сработал. Я также посмотрел несколько видеороликов и прочитал несколько статей, но все они в основном объясняют, как показать средство выбора изображений или прикрепить метод делегирования к текстовому полю.
Кто-нибудь пытался использовать широковещательную передачу ReplayKit (не запись) вместе с SwiftUI для передачи трансляции в расширение широковещательной загрузки? Приветствуется любая помощь, связанная с ViewController UIViewControllerRepresentable
.
Комментарии:
1. Если вы знаете, как это сделать (и на самом деле сделали это) с помощью UIKit, зачем вам SwiftUI?
2. @Asperi потому что у меня уже есть работающее приложение, написанное на SwiftUI, и единственная функциональность, которая отсутствует = прямая трансляция. Переписывание приложения на чистом swift ощущается как неудача и будет моим последним средством, если я не найду жизнеспособного решения в SwiftUI
3. SwiftUI предлагает UiVIewControllerRepresentable; для обратной связи с @Asperi, если это сделано в UIKit, вы можете оставить его там и соединить его, не переписывая.