Использование диктовки - iOS 6 - DidStart?

Как реагировать на запуск диктанта?


Известные способы реагирования на диктовку:

  • dictationRecordingDidEnd - ответить на завершение распознавания надиктованной фразы.

  • dictationRecognitionFailed - ответить на неудачное распознавание диктовки.


Справка: справочник по протоколу UITextInput

Начиная с iOS 5.1, когда пользователь выбирает ввод диктовки на поддерживаемом устройстве, система автоматически вставляет распознанные фразы в текущее текстовое представление. Методы в протоколе UITextInput позволяют вашему приложению реагировать на завершение диктовки, как описано в разделе «Использование диктовки». Вы можете использовать объект класса UIDictationPhrase для получения строки, представляющей фразу, продиктованную пользователем. В случае неоднозначных результатов диктовки объект диктантной фразы предоставляет массив, содержащий альтернативные строки.

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


person Zelko    schedule 22.02.2013    source источник


Ответы (3)


Насколько я могу судить, нет общедоступного 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;
}
person rob mayoff    schedule 26.02.2013

Хотя на этот вопрос есть ответ, я все же хочу добавить свое решение и хочу быть полезным кому-то еще.

Когда вы нажимаете кнопку 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 уже устарел. Это больше не решение.

person zhanglongyang    schedule 17.04.2013
comment
Я мог бы быть отличным решением, но оно не работает, см. мой вопрос, с этим решением я все еще не могу получить избавиться от аварии. - person Marek R; 05.06.2014

Обратите внимание: currentInputMode UITextInputMode устарел с iOS7. Возможно, нам просто придется подождать, пока Apple решит опубликовать API диктовки, чтобы мы могли делать вызовы, которые имеют смысл в соответствии с нашими намерениями.

person user1686700    schedule 18.07.2013