美文网首页iOS开发ios工作
iOS 麦克风权限:首次询问用户麦克风授权问题

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

作者: 李琪_59dc | 来源:发表于2018-11-15 11:10 被阅读0次

    今天遇到一个情况,首次安装应用程序,在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音频相关内容仔细学习一下.....

    相关文章

      网友评论

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

        本文链接:https://www.haomeiwen.com/subject/zhsbxqtx.html