iOS开发ios工作

iOS 麦克风权限:首次询问用户麦克风授权问题

2018-11-15  本文已影响0人  李琪_59dc

今天遇到一个情况,首次安装应用程序,在APP中长按进行语音输入时,检测iPhone麦克风权限时,系统会弹出“XXX想想访问您的麦克风”提示框。点击 好/不允许 之后,发现页面停留在长按的状态下。。。就仿佛按钮长按的手势被打断一样

然后开始研究为什么会出现这种情况。。。

- (void)didLongPress:(UILongPressGestureRecognizer *)gestureRecognizer {
    if (gestureRecognizer.state == UIGestureRecognizerStateBegan) {
        //按下按钮,开始语音识别
        if (self.voiceRecogStart) {
            self.voiceRecogStart(); //对应更改显示文字
        }
    }else if (gestureRecognizer.state == UIGestureRecognizerStateEnded) {
        //松开按钮,语音识别结束
        if (self.voiceRecogEnd) {
            self.voiceRecogEnd();
        }
        self.speechLabel.text = @"长按进行语音输入";
    }
}
voicePopView.voiceRecogStart = ^{
        AVAudioSession *avSession = [AVAudioSession sharedInstance];
        
        if ([avSession respondsToSelector:@selector(requestRecordPermission:)]) {
            
            [avSession requestRecordPermission:^(BOOL available) {
                
                if (available) {
                    
                    [weakSelf startSpeech];
                    
                }else {
                    
                    weakSelf.searchtype = CSSearchingTextSearch;

                    dispatch_async(dispatch_get_main_queue(), ^{
                        UIAlertView *alertView = [[UIAlertView alloc] initWithTitle:@"提示" message:@"麦克风不可用,请在系统“设置”的权限管理中,允许“XXXX”访问麦克风" delegate:weakSelf cancelButtonTitle:@"确定" otherButtonTitles:nil, nil];
                        [alertView show];
                    });
                }
            }];
        }

打断点调试后,发现在上述问题重现过程中,长按开始及结束两种状态都有进入。再打断点到长按开始响应事件中,就发现问题了。。长按状态先是Began-Ended-Ended,但在Ended之后,才接着走Began里的响应事件!!
然后具体看代码,发现是检测用户麦克风授权的问题:

在检测用户麦克风权限时,第一次询问用户要进行特殊处理区分

AVAuthorizationStatus videoAuthStatus = [AVCaptureDevice authorizationStatusForMediaType:AVMediaTypeAudio];
//判断是否询问过用户授权麦克风(否则检测麦克风权限,会被APP询问授权弹窗打断)
if (videoAuthStatus == AVAuthorizationStatusNotDetermined) {
    // 未询问过用户是否授权,进行第一次询问
    //这里是关键 !!!
    AVAudioSession *avSession = [AVAudioSession sharedInstance];
    
    if ([avSession respondsToSelector:@selector(requestRecordPermission:)]) {
        
        [avSession requestRecordPermission:^(BOOL available) {
            
        }];
    }
}else {
    AVAudioSession *avSession = [AVAudioSession sharedInstance];
    
    if ([avSession respondsToSelector:@selector(requestRecordPermission:)]) {
        
        [avSession requestRecordPermission:^(BOOL available) {
            
            if (available) {
                
                [weakSelf startSpeech];
                
            }else {
                
                weakSelf.searchtype = CSSearchingTextSearch;
                
                dispatch_async(dispatch_get_main_queue(), ^{
                    UIAlertView *alertView = [[UIAlertView alloc] initWithTitle:@"提示" message:@"麦克风不可用,请在系统“设置”的权限管理中,允许“南方航空”访问麦克风" delegate:weakSelf cancelButtonTitle:@"确定" otherButtonTitles:nil, nil];
                    [alertView show];
                });
            }
        }];
    }
}

综上,问题关键在于首次询问用户麦克风授权,要区别对待。

等之后有时间,把iOS音频相关内容仔细学习一下.....

上一篇下一篇

猜你喜欢

热点阅读