2014-10-02 2 views
14

당신이 사용하는 iOS 장비에 설치된 키보드의 목록을 얻을 수 있습니다 :iOS8에서 사용되는 현재 키보드를 어떻게 찾을 수 있습니까?

{ 
    ... 
    AppleKeyboards =  (
     "[email protected]=US;sw=QWERTY", 
     "[email protected]=Spanish - ISO;sw=QWERTY-Spanish", 
     "[email protected]=Emoji", 
     "com.swiftkey.SwiftKeyApp.Keyboard" 
    ); 
    AppleKeyboardsExpanded = 1; 
    ... 
} 

이 장치가 스페인어, 이모티콘을 가지고 나에게 말한다 :

NSUserDefaults *userDeafaults = [NSUserDefaults standardUserDefaults]; 
NSDictionary * userDefaultsDict = [userDeafaults dictionaryRepresentation]; 
NSLog(@"%@", userDefaultsDict); 

이 같은 콘솔에서 뭔가를 얻을 수 및 SwiftKey 키보드가 설치되어 있지만 키보드가 나타나면 어떤 것이 사용될 지 알려주지 않습니다.

말할 방법이 있습니까?

+0

키보드 또는 언어가 필요합니까? 언어는 가능하지만 공개 API를 사용하여 정확하게 키보드를 사용할 수 없습니다. –

+0

@LeoNatan 어느 키보드. – awolf

+0

회색 영역 또는 비공개 API 솔루션에 관심이 있으십니까? –

답변

10

공개 API가 없지만 API가 일반적으로 노출되지는 않지만 숨길 수있는 경우 "회색 영역 API"가 필요한 "회색 영역 API"가 필요한 해결책을 찾았습니다. 거의 작동하지 않는 상태로). UITextInputMode

이 클래스는 당신에게 사용자가 사용할 수있는 모든 입력 방법을 제공합니다

아이폰 OS는 다음 클래스가 있습니다. 사용

UITextInputMode* inputMode = [[[UITextInputMode activeInputModes] filteredArrayUsingPredicate:[NSPredicate predicateWithFormat:@"isDisplayed = YES"]] lastObject]; 

이 확장의 표시 이름 (또는 일반 애플 키보드)를 얻으려면 :

[inputMode valueForKey:@"displayName"] 
을 다음 쿼리를 사용하면 당신에게 현재 키보드가 열려입니다 경우에만 사용을 줄 것이다

또는

[inputMode valueForKey:@"extendedDisplayName"] 

키보드가 표시되어있는 경우에만 작동합니다. 모니터링해야합니다 그래서 입력 모드는 알림이 내부 구현은 새 값으로 시스템을 업데이트했습니다 키보드 전에 전송 될 때 우리는 실제로, 현재의 입력 모드를 획득 지연 할 필요가

[[NSNotificationCenter defaultCenter] addObserverForName:UITextInputCurrentInputModeDidChangeNotification object:nil queue:[NSOperationQueue mainQueue] usingBlock:^(NSNotification *note) 
{ 
    dispatch_async(dispatch_get_main_queue(), ^{ 
     NSLog(@"%@", [[[[UITextInputMode activeInputModes] filteredArrayUsingPredicate:[NSPredicate predicateWithFormat:@"isDisplayed = YES"]] lastObject] valueForKey:@"extendedDisplayName"]); 
    }); 
}]; 

사용하여 자신을 변경합니다. 다음 runloop에서 얻는 것이 효과적입니다.

+2

레오 감사합니다. 이것은 내 애플 리케이션의 다음 릴리스에서 사용할 것입니다. 그리고 나는 이것이 100 % 정결 한 사람이라고 분명히 말할 것입니다. 앱 스토어 가이드 라인에 – awolf

+0

@awolf 위대한, 다행스럽게 도와 줬어! –

+1

여기에 메모 : "isDisplayed"속성은 iOS 8 이상의 UITextInputMode에만 존재하므로 이전 OS 버전을 지원하는 응용 프로그램에서는 activeInputModes를 반복하고 respondToSelector @ selectlect (isDisplayed)인지 테스트해야합니다 (또는 이것을 실행하지 마십시오. 이전 OS 용 코드). – awolf

3

레오 네탄의 대답은 훌륭하지만 나는 그것에 뭔가를 추가하고 싶습니다. 당신은 실제로 다음과 같이 키보드가 열려 아닌 경우, 언제든지 현재의 입력 모드를 얻을 수 있습니다 :

UITextView *textView = [[UITextView alloc] init]; 
UITextInputMode *inputMode = textView.textInputMode; 

textView.textInputMode 어떤 이유로 이모티콘 키보드 nil주의하시기 바랍니다.

https://github.com/nst/iOS-Runtime-Headers/blob/master/Frameworks/UIKit.framework/UIKeyboardInputMode.h

:

또한, displayNameextendedDisplayName 이외에, 당신은 검색 할 수있는 다른 키와 같은 identifier가, normalizedIdentifier (아이폰 OS 8 이상), hardwareLayout는 ... 여기에 전체 API 참조

는 지금은 ... 멋진

0

@Leo 나탄의 답변을 그 중 하나가 앱 스토어 승인 displayName보다 더 위험하다 사용하는 경우 확실하지 않다하지만 키보드가 DISPL하지 않은 경우는 nil를 반환 할 수 있어요 찬성.

그래서 여기서 문자열을 사용하여 UIKeyboardInputMode의 속성을 찾습니다.

이것이 Apple의 개인 API에서 제공 되었기 때문에 현재 키보드를 찾을 수 있다고 말할 수 있습니다. 여기

코드 :

+ (BOOL)isTheCustomKeyboard 
{ 
    UITextInputMode* inputMode = [UITextInputMode currentInputMode]; 
    if ([inputMode respondsToSelector:NSSelectorFromString(@"identifier")]) 
    { 
     NSString* indentifier = [inputMode performSelector:NSSelectorFromString(@"identifier")]; 
     if ([indentifier isEqualToString: YOUR_APP_ID]) 
     { 
      return YES; 
     } 
    } 
    return NO; 
} 

그리고 더 많은 :

+ (BOOL)isContaintCustomKeyboard 
{ 
    NSArray * inputModes = [UITextInputMode activeInputModes]; 
    for (id inputModel in inputModes) 
    { 
     if ([inputModel respondsToSelector:NSSelectorFromString(@"identifier")]) 
     { 
      NSString* indentifier = [inputModel performSelector:NSSelectorFromString(@"identifier")]; 
      if ([indentifier isEqualToString: YOUR_APP_ID]) 
      { 
       return YES; 
      } 
     } 
    } 
    return NO; 
} 

사실 우리는 또한 displayName 또는 identifier 등을 사용할 수 있습니다.

관련 문제