使用听写 – iOS 6 – DidStart?

如何回应开始听写?


已知的听写方式:

  • dictationRecordingDidEnd – 响应已完成的口述短语的识别。

  • dictationRecognitionFailed – 回应失败的听写识别。


参考: UITextInput协议参考

从iOS 5.1开始,当用户在支持的设备上select听写input时,系统会自动将已识别的短语插入到当前的文本视图中。 UITextInput协议中的方法允许您的应用程序响应听写的完成,如“使用听写”中所述。您可以使用UIDictationPhrase类的对象来获取表示用户已经声明的短语的string。 在不明确的听写结果的情况下,听写短语对象提供包含替代string的数组。

http://developer.apple.com/library/ios/#documentation/uikit/reference/UITextInput_Protocol/Reference/Reference.html

据我所知,没有公开的API来检测听写是否已经开始。

如果你真的想要这样做,而且你想要进入App Store,你可能会采取以下的方法,但是完全没有支持或许会被拒绝 ,而且很可能在未来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; } 

以recursion方式遍历视图层次结构检查,以查看其类名包含string“DictationView”的视图。 实际的类名是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; } 

虽然这个问题得到解答,但我还是想加我的解决scheme,希望对别人有所帮助。

当您点击键盘上的MICbutton时, 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已经被弃用了。 这不是一个解决scheme了。

请注意 – 从iOS7起,UITextInputMode的currentInputMode已被弃用。 我们可能要等到苹果公司决定发布听写API,这样我们才能按照我们的意图进行有意义的调用。