我们正在尝试与多个用户进行电话会议,因此通过使用 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
中尝试过此链接,但它不要求相机权限。
您是否按照文档中的步骤操作? 最重要的部分是
NSCameraUsageDescription
/ NSMicrophoneUsageDescription
必须存在于 info.plist 文件中
这是 WKWebView 目前已知的限制,请参阅 chrome 问题了解详细信息
这是一个 Bug,WkWebView 对 WebRTC 的支持有限 从 iOS 14.3 版本开始就可以使用了
但是要使其正常工作,您需要设置属性 requireUserActionForMediaPlayback = false 允许InlineMediaPlayback = true
执行以下操作对我有用。
在info.plist中添加NSCameraUsageDescription、NSMicrophoneUsageDescription
确保在之前加载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 初始化之前授予权限。对我来说,即使在网络视图中授予权限后,这对我也有用。
我必须这样做:
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
的消息,上面的代码就会触发访问麦克风的请求
就我而言,我需要打开相机以获取帐户标识符。下面的 webview 设置配置对我有用:
webConfiguration.allowsInlineMediaPlayback = true webConfiguration.mediaTypesRequiringUserActionForPlayback = []