WKWebView 不允许在应用程序中访问相机

问题描述 投票:0回答:6

我们正在尝试与多个用户进行电话会议,因此通过使用 Kurento 服务器我们已经实现了这一目标,并且它正在 safari 浏览器上运行。但是当涉及到

WebView
/
WKWebView
中的实施时。它甚至不请求许可。

@IBOutlet weak var webViewContainer: UIView!
var webView: WKWebView!

override open func loadView() {
    super.loadView()

    let webConfiguration = WKWebViewConfiguration()
    webConfiguration.ignoresViewportScaleLimits = true
    webConfiguration.suppressesIncrementalRendering = true
    webConfiguration.allowsInlineMediaPlayback = true
    webConfiguration.allowsAirPlayForMediaPlayback = false
    webConfiguration.allowsPictureInPictureMediaPlayback = true
    webConfiguration.mediaTypesRequiringUserActionForPlayback = .all
    webConfiguration.requiresUserActionForMediaPlayback = true
    webView = WKWebView(frame: webViewContainer.frame, configuration: webConfiguration)
    webView.uiDelegate = self
    webView.navigationDelegate = self
    webView.sizeToFit()
    webView.backgroundColor = .black
    webView.isOpaque = false
    self.webViewContainer.addSubview(webView)

}

func webContentController()-> WKUserContentController {
    let contentController = WKUserContentController()
    let script = try! String(contentsOf: Bundle.main.url(forResource: "WebRTC", withExtension: "js")!, encoding: String.Encoding.utf8)
    contentController.addUserScript(WKUserScript(source: script, injectionTime: WKUserScriptInjectionTime.atDocumentStart, forMainFrameOnly: true))
    contentController.add(self, name: "callbackHandler")
    return contentController
}

override func viewDidLoad() {
    super.viewDidLoad()
    guard let url = URL (string: urlStr) else { return
    }
    let myRequest = URLRequest(url: url)
    self.webView.load(myRequest)
}

我什至在

safariViewController
中尝试过此链接,但它不要求相机权限。

ios swift webrtc wkwebview kurento
6个回答
4
投票

这个

您是否按照文档中的步骤操作? 最重要的部分是

NSCameraUsageDescription
/
NSMicrophoneUsageDescription
必须存在于 info.plist 文件中


1
投票

这是 WKWebView 目前已知的限制,请参阅 chrome 问题了解详细信息


1
投票

这是一个 Bug,WkWebView 对 WebRTC 的支持有限 从 iOS 14.3 版本开始就可以使用了

但是要使其正常工作,您需要设置属性 requireUserActionForMediaPlayback = false 允许InlineMediaPlayback = true


0
投票

执行以下操作对我有用。

  1. 在info.plist中添加NSCameraUsageDescriptionNSMicrophoneUsageDescription

  2. 确保在之前加载theurl添加这些配置。

    let config = WKWebViewConfiguration()
    config.userContentController = contentController
    
    config.allowsInlineMediaPlayback = true
    if #available(iOS 14.0, *) {
        config.mediaTypesRequiringUserActionForPlayback = []
    } else {
        config.requiresUserActionForMediaPlayback = false
    }
    self.webview = WKWebView(frame: .zero, configuration: config)
    self.webview.load(URLRequest(url: url!))
    

如果它不适合你。尝试在 webview 初始化之前授予权限。对我来说,即使在网络视图中授予权限后,这对我也有用。


-1
投票

我必须这样做:

import AVFoundation

@main
class AppDelegate: UIResponder, UIApplicationDelegate {

    func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
        
        AVCaptureDevice.requestAccess(for: .audio) { haveMicAccess in
            print("Access to Microphone: \(haveMicAccess)")
        }

        return true
    }

    ...

}

每次我在页面脚本中使用带有 getUserMedia() 的相机时,它仍然会询问我。但如果没有上面的代码,getUserMedia 就是 null。只要您在 info.plist 中提供

NSMicrophoneUsageDescription

的消息,上面的代码就会触发访问麦克风的请求

-1
投票

就我而言,我需要打开相机以获取帐户标识符。下面的 webview 设置配置对我有用:

webConfiguration.allowsInlineMediaPlayback = true webConfiguration.mediaTypesRequiringUserActionForPlayback = []

© www.soinside.com 2019 - 2024. All rights reserved.