iOS WKWebview:始终允许相机权限

5

从iOS 13开始,苹果允许我们在iOS Safari中始终记住允许相机权限标志。(参考此 答案)。 同时,iOS Twitter PWA也具有此功能。

但是有没有办法在WKWebview中启用它?

有人知道如何实现吗?

3个回答

7

默认情况下添加WebView权限决策授予权限

Objective-C:

- (void) webView:(WKWebView *)webView
     requestMediaCapturePermissionForOrigin:(WKSecurityOrigin *)origin
     initiatedByFrame:(WKFrameInfo *)frame type:(WKMediaCaptureType)type
     decisionHandler:(void (^)(WKPermissionDecision decision))decisionHandler
     API_AVAILABLE(ios(15.0))
{
    decisionHandler(WKPermissionDecisionGrant);
 
}

快捷:

func webView(_ webView: WKWebView, 
    requestMediaCapturePermissionFor 
    origin: WKSecurityOrigin,initiatedByFrame
    frame: WKFrameInfo,type: WKMediaCaptureType, 
    decisionHandler: @escaping (WKPermissionDecision) -> Void){
     decisionHandler(.grant)
 }

1
这个按预期完美地工作,但请注意一些修复:decisionhandler 应该是 decisionHandler(H 大写),而在 iOS 15 中 .allow 应该改为 .grant :-) - Zipelkopf
@Zipelkopf,可以告诉我你是怎么做到的吗?我复制了你带有注释的完整答案,但是并没有成功...应用程序一直在要求授予相机访问权限。 - Khris Vandal
@KhrisVandal,假设您在Info.plist中设置了媒体权限(即相机、麦克风),并且一旦授予所请求的权限,您的应用程序就可以正常工作,那么只需将带有2个修改的代码复制到ViewConotroller类中即可。如果没有这段代码,您的Web应用程序会在初始时要求两次权限(Web应用程序+ iOS),然后每次都要求一次。有了这段代码,假设用户先前已经授予了这两个权限,用户将不会再次被提示权限。我只在iOS 15上编码,无法确定向后兼容性。干杯 - Zipelkopf
1
在我的情况下,添加“decideMediaCapturePermissionsFor”是有效的。正如文档中所述:https://developer.apple.com/videos/play/wwdc2021/10032/ - Khris Vandal
1
没有提到重要的事情.... 在 ViewController 类中必须添加 WKUIDelegatewebView.uiDelegate = selfwebViewConfiguration.allowsInlineMediaPlayback = true。如果没有这些,它将无法正常工作。请参考我的答案:https://dev59.com/Hb_qa4cB1Zd3GeqPMKMb#76838976 - mikep

2

在stackoverflow上,必须满足的条件比现有答案和其他答案要多得多。我附上了一个简化的ViewController来展示需要添加的所有内容。

ViewController.swift

class ViewController: UIViewController, WKUIDelegate {
    var webView: WKWebView!;

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

        let webViewConfiguration = WKWebViewConfiguration();
        webViewConfiguration.allowsInlineMediaPlayback = true;

        webView = WKWebView(frame:.zero , configuration: webViewConfiguration);

        webView.uiDelegate = self;

    }

    override func viewDidLoad() {
        super.viewDidLoad();

        webView.load(...);
    }

    @available(iOS 15.0, *)
    func webView(_ webView: WKWebView,
        decideMediaCapturePermissionsFor origin: WKSecurityOrigin,
        initiatedBy frame: WKFrameInfo,
        type: WKMediaCaptureType) async -> WKPermissionDecision {
            return .grant;
    }
}

-1

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接