ReplayKit RPBroadcastActivityViewController не отображается iPhone - PullRequest
0 голосов
/ 15 апреля 2019

Я пытаюсь использовать широковещательное расширение для потоковой передачи из моего приложения.Проблема в том, что RPBroadcastActivityViewController не работает.Когда я представляю его, я получаю всплывающее окно с вопросом «AppName хотел бы транслировать на BroadcastExtensionSetupUI» вместо ожидаемого представления выбора.После этого, если я смотрю на viewDebugger, я вижу, что RPBroadcastActivityViewController находится сверху, но на 100% прозрачен, delegate для UIActivityViewController никогда не вызывается и приложение кажется замороженным.Обратите внимание, что я могу транслировать, если я начну с яблочного интерфейса в центре управления.

   var accessToken : String

   @objc public init(accessToken : String) {
        self.accessToken = accessToken

        super.init()

        RPScreenRecorder.shared().delegate = self

        NotificationCenter.default.addObserver(forName: UIScreen.capturedDidChangeNotification, object: UIScreen.main, queue: OperationQueue.main) { (notification) in
            if self.broadcastPickerView != nil && self.screenTrack == nil {
                //let isCaptured = UIScreen.main.isCaptured

            }
        }
    }

    deinit {
        NotificationCenter.default.removeObserver(self)
    }


    @available(iOS 12.0, *)
    func setupPickerView(view : UIView) {
        // Swap the button for an RPSystemBroadcastPickerView.
        #if !targetEnvironment(simulator)
        let pickerView = RPSystemBroadcastPickerView(frame: CGRect(x: 0,
                                                                   y: 0,
                                                                   width: view.bounds.width,
                                                                   height: 80))
        pickerView.translatesAutoresizingMaskIntoConstraints = false
        pickerView.preferredExtension = TLScreenSharingHelper.kBroadcastExtensionBundleId

        // Theme the picker view to match the white that we want.
        if let button = pickerView.subviews.first as? UIButton {
            button.imageView?.tintColor = UIColor.white
        }

        view.addSubview(pickerView)

        self.broadcastPickerView = pickerView


        let centerX = NSLayoutConstraint(item:pickerView,
                                         attribute: NSLayoutConstraint.Attribute.centerX,
                                         relatedBy: NSLayoutConstraint.Relation.equal,
                                         toItem: view,
                                         attribute: NSLayoutConstraint.Attribute.centerX,
                                         multiplier: 1,
                                         constant: 0);
        view.addConstraint(centerX)
        let centerY = NSLayoutConstraint(item: pickerView,
                                         attribute: NSLayoutConstraint.Attribute.centerY,
                                         relatedBy: NSLayoutConstraint.Relation.equal,
                                         toItem: view,
                                         attribute: NSLayoutConstraint.Attribute.centerY,
                                         multiplier: 1,
                                         constant: -10);
        view.addConstraint(centerY)
        let width = NSLayoutConstraint(item: pickerView,
                                       attribute: NSLayoutConstraint.Attribute.width,
                                       relatedBy: NSLayoutConstraint.Relation.equal,
                                       toItem: view,
                                       attribute: NSLayoutConstraint.Attribute.width,
                                       multiplier: 0.75,
                                       constant: 0);
        view.addConstraint(width)
        let height = NSLayoutConstraint(item: pickerView,
                                        attribute: NSLayoutConstraint.Attribute.height,
                                        relatedBy: NSLayoutConstraint.Relation.equal,
                                        toItem: view,
                                        attribute: NSLayoutConstraint.Attribute.height,
                                        multiplier: 0.75,
                                        constant: 0);
        view.addConstraint(height)
        #endif
    }


    //MARK: Start screen share entry point
    @objc public func startScreenBroadcast(fromViewController vc: UIViewController) {

        // Use RPSystemBroadcastPickerView when available (iOS 12+ devices).
        if #available(iOS 12.0, *) {
            self.setupPickerView(view:vc.view)
        }

        //set token for the extension to use
        let sharedUserDefaults = UserDefaults(suiteName: kSharedUserDefaultsKey)
        sharedUserDefaults?.set(accessToken, forKey: kSharedUserDefaultsAccessTokenKey)
        sharedUserDefaults?.synchronize()

        if let controller = self.broadcastController {
            controller.finishBroadcast { [unowned self] error in
                DispatchQueue.main.async {
                    self.broadcastController = nil
                }
            }
        } else {
            // This extension should be the broadcast upload extension UI, not broadcast update extension
            RPBroadcastActivityViewController.load(withPreferredExtension:TLScreenSharingHelper.kBroadcastExtensionSetupUiBundleId) {
                (broadcastActivityViewController, error) in
                if let broadcastActivityViewController = broadcastActivityViewController {
                    broadcastActivityViewController.delegate = self
                    broadcastActivityViewController.modalPresentationStyle = .popover
                    vc.present(broadcastActivityViewController, animated: true)
                }
            }
        }
    }

    //MARK: RPBroadcastActivityViewControllerDelegate
    public func broadcastActivityViewController(_ broadcastActivityViewController: RPBroadcastActivityViewController, didFinishWith broadcastController: RPBroadcastController?, error: Error?) {

        DispatchQueue.main.async {
            self.broadcastController = broadcastController
            self.broadcastController?.delegate = self


            broadcastActivityViewController.dismiss(animated: true) {
                self.startBroadcast()
            }
        }
    }

    func startBroadcast() {
        self.broadcastController?.startBroadcast {  error in
            DispatchQueue.main.async {
                if let theError = error {
                    print("Broadcast controller failed to start with error:", theError as Any)
                } else {
                    print("Broadcast controller started.")
                }
            }
        }
    }

Это от вспомогательного класса, который получает UIViewController, который должен представлять UIPickerView.

Любые идеи, почему это UIPickerView будет прозрачным?

...