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