2013-02-22 63 views
6

如何迴應開始聽寫?


已知響應聽寫的方式:使用聽寫 - 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

回答

10

據我所知,有一個爲聽寫的時候已經開始檢測沒有公共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; 
} 
10

雖然這個問題得到解答,但我仍然希望添加我的解決方案並希望對其他人有所幫助。

當您點擊鍵盤上的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); 
} 

UPDATE: 就像什麼@ user1686700說,currentInputMode已經被棄用。這不再是一個解決方案。

+0

偉大的解決方案。 – AriX 2014-01-21 17:42:59

+0

我可能是一個很好的解決方案,但它不工作,請參閱[我的問題](http://stackoverflow.com/q/24041181/1387438),與此解決方案,我仍然無法擺脫崩潰。 – 2014-06-05 09:03:42

4

請注意 - UITextInputMode的currentInputMode從iOS7開始已棄用。 我們可能只需等到蘋果決定發佈聽寫API,以便我們可以根據我們的意圖進行調用。