如何响应开始听写
已知的听写响应方式:
-
听写RecordingDidEnd-响应完成对听写的识别短语
-
听写识别失败-响应失败的听写识别。
参考:UITextInput协议参考
从iOS 5.1开始,当用户在支持的设备上选择听写输入时,系统会自动将识别的短语插入当前文本视图。UITextInput协议中的方法允许您的应用程序响应听写的完成,如"使用听写"中所述。您可以使用UIDictationPhrase类的对象来获取表示用户听写的短语的字符串。在听写结果不明确的情况下,听写短语对象提供一个包含替代字符串的数组。
http://developer.apple.com/library/ios/#documentation/uikit/reference/UITextInput_Protocol/Reference/Reference.html
据我所知,没有公共的API来检测听写何时开始。
如果您真的想这样做,并且您想进入应用商店,您可能可以通过以下方法逃脱惩罚,但它完全不受支持,无论如何都可能会被拒绝并且很可能会在未来版本的iOS中崩溃。
文本系统在更改为听写"键盘"后发布一些未记录的通知。其中两个都发布在对其的更改和的更改上,名称如下:
UIKeyboardCandidateCorrectionDidChangeNotification
UIKeyboardLayoutDidChangedNotification
请注意,第二个有一个奇怪的动词变位。这不是打字错误。(嗯,这不是我的打字错误。)
这些通知也在其他时间发布,所以你不能只是观察它们并假设听写状态已经改变。当你收到通知时,你需要做更多的检查。因此,将自己添加为其中一个通知的观察者。第一个似乎不太可能在未来消失或重新命名。
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(checkForDictationKeyboard:)
name:@"UIKeyboardCandidateCorrectionDidChangeNotification"
object:nil];
...
当你收到通知时,你会想看看听写视图是否显示:
- (void)checkForDictationKeyboard:(NSNotification *)note {
if ([self isShowingDictationView]) {
NSLog(@"showing dictation view");
} else {
NSLog(@"not showing dictation view");
}
}
要查看它是否显示,请检查除您自己的应用程序窗口之外的每个窗口。通常,唯一的其他窗口是文本系统的窗口。
- (BOOL)isShowingDictationView {
for (UIWindow *window in [UIApplication sharedApplication].windows) {
if (window == self.window)
continue;
if (containsDictationView(window))
return YES;
}
return NO;
}
递归遍历视图层次结构,检查类名包含字符串"DictionView"的视图。实际的类名是UIDictationView
,但如果不使用完整的名称,你就不太可能被App Store拒绝。
static BOOL containsDictationView(UIView *view) {
if (strstr(class_getName(view.class), "DictationView") != NULL)
return YES;
for (UIView *subview in view.subviews) {
if (containsDictationView(subview))
return YES;
}
return NO;
}
尽管这个问题已经得到了回答,但我仍然想添加我的解决方案,并希望对其他人有所帮助。
当您点击键盘上的MIC按钮时,primaryLanguage
将变为dictation
。你可以这样检测:
[[NSNotificationCenter defaultCenter]
addObserver:self
selector:@selector(handleCurrentInputModeDidChange:)
name:UITextInputCurrentInputModeDidChangeNotification
object:nil];
- (void) handleCurrentInputModeDidChange:(NSNotification *)notification
{
NSString *primaryLanguage = [UITextInputMode currentInputMode].primaryLanguage;
NSLog(@"current primaryLanguage is: %@", primaryLanguage);
}
更新:正如@user1686700所说,currentInputMode
已经被弃用。这不再是一个解决方案。
请注意-UITextInputMode的currentInputMode自iOS7起已弃用。我们可能只需要等到苹果决定发布听写API,这样我们就可以根据我们的意图进行合理的调用。