Расширение для широковещательной загрузки ReplayKit с помощью SwiftUI

#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, вы можете оставить его там и соединить его, не переписывая.