uni-app ios应用在webview授权麦克风后,第二次进入会重复提示授权

uni-app ios应用在webview授权麦克风后,第二次进入会重复提示授权

问题描述

uniapp ios正常整个应用都是使用wkwebview渲染的,查看工程代码里面有原生的配置,allowsInlineMediaPlayback = true,使wkwebview可以从应用继承权限,这里的权限继承并没有问题。

但是在app里面使用webview相当于wkwebview里面再嵌套webview/frame: 例如<web-view :src="/hybrid/html/index"></web-view> 在该h5页面调用webRTC的接口,授权麦克风/摄像头成功后,下一次进入webview页面又重复提示授权。

问题参考:

https://ask.dcloud.net.cn/question/174238

如何让webview页面只授权一次?或者说如何让webview页面继承父级权限?

以上问题若有具体解决办法,请联系我,有偿提问。【赏金更新】【200】

思路:

是否可以参考以下代码,给WKWebview创建frame的时候赋予grant权限实现效果?

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

更多关于uni-app ios应用在webview授权麦克风后,第二次进入会重复提示授权的实战教程也可以访问 https://www.itying.com/category-93-b0.html

12 回复

赏金 100

更多关于uni-app ios应用在webview授权麦克风后,第二次进入会重复提示授权的实战教程也可以访问 https://www.itying.com/category-93-b0.html


好诱人

回复 3***@qq.com: 赏金不多,对于处理过这个问题的人来说应该很简单。

可以在h5使用webrtc-adapter-latest库解决兼容、权限问题 https://github.com/webrtcHacks/adapter

我的h5项目有使用这个库,它只能帮我兼容各个浏览器请求权限的问题,并不能处理继承父级权限

uniapp ios 中的webview在原生是不是一个iframe?可能是wkwebview创建iframe的时候没有把配置附带过去?有大神能解决这个问题的吗?

官方有人不?能看看这个问题?

同求解决方案

请问解决了吗,同求解决方案

https://developer.apple.com/videos/play/wwdc2021/10032/ 官方ios15的解决方案,但是不知道到了uniapp这边怎么写,感觉得有个原生插件支持,同求

我解决了,需要的话可以+Q1343066628

在处理uni-app的iOS应用在WebView中授权麦克风的问题时,确保不会重复提示授权,通常涉及到对权限请求的管理。下面是一个可能的解决方案,通过使用JavaScript与iOS原生代码交互,记录用户已授权的状态,并避免重复请求权限。

步骤1:iOS原生代码部分

首先,在你的iOS项目中,创建一个用于管理权限请求的单例类(如PermissionManager),并在其中记录麦克风权限的状态。

// PermissionManager.h
#import <Foundation/Foundation.h>

@interface PermissionManager : NSObject

+ (instancetype)sharedManager;
- (BOOL)isMicrophonePermissionGranted;
- (void)requestMicrophonePermissionWithCompletion:(void (^)(BOOL granted))completion;

@end

// PermissionManager.m
#import "PermissionManager.h"

@implementation PermissionManager

+ (instancetype)sharedManager {
    static dispatch_once_t onceToken;
    static PermissionManager *instance;
    dispatch_once(&onceToken, ^{
        instance = [[self alloc] init];
    });
    return instance;
}

- (BOOL)isMicrophonePermissionGranted {
    // 实现检查麦克风权限的逻辑
    // 假设使用AVFoundation框架
    AVAuthorizationStatus authStatus = [AVCaptureDevice authorizationStatusForMediaType:AVMediaTypeAudio];
    return authStatus == AVAuthorizationStatusAuthorized;
}

- (void)requestMicrophonePermissionWithCompletion:(void (^)(BOOL granted))completion {
    // 如果已授权,直接回调
    if ([self isMicrophonePermissionGranted]) {
        completion(YES);
        return;
    }
    
    // 请求权限
    [AVCaptureDevice requestAccessForMediaType:AVMediaTypeAudio completionHandler:^(BOOL granted) {
        completion(granted);
    }];
}

@end

步骤2:uni-app中的JavaScript代码

在uni-app中,通过plus.bridge.exec调用iOS原生方法,检查并请求权限。

function checkAndRequestMicrophonePermission() {
    plus.bridge.exec('PermissionManager', 'isMicrophonePermissionGranted', [], function(event) {
        if (event.message) {
            // 已授权
            console.log('Microphone permission already granted.');
        } else {
            // 未授权,请求权限
            plus.bridge.exec('PermissionManager', 'requestMicrophonePermissionWithCompletion', [], function(event) {
                if (event.message) {
                    console.log('Microphone permission granted.');
                } else {
                    console.error('Microphone permission denied.');
                }
            });
        }
    });
}

// 在页面加载或需要时调用
document.addEventListener('plusready', function() {
    checkAndRequestMicrophonePermission();
});

结论

上述代码通过iOS原生代码管理权限状态,并在uni-app中通过JavaScript调用原生方法进行检查和请求权限,避免了重复提示的问题。确保在实际项目中,根据具体需求调整和完善代码。

回到顶部