据我所知,没有用于检测听写何时开始的公共 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;
}
递归遍历视图层次结构,检查其类名包含字符串“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;
}