- PVSM.RU - https://www.pvsm.ru -

Решение проблемы ввода текста на русском (и любом другом) языке в iOS8.1 Simulator

Как и большинство разработчиков, я недавно обновил xCode до версии 6.1 и сразу немного пожалел об этом.

Как упомянуто в Xcode Release Notes [1], iOS8.1 симулятор содержит ошибку локализации:

Localization and Keyboard settings (including 3rd party keyboards) are not correctly honored by Safari, Maps, and developer apps in the iOS 8.1 Simulator. [NSLocale currentLocale] returns en_US and only the English and Emoji keyboards are available

По-русски говоря, iOS8.1 симулятор поддерживает ввод только с английский клавиатуры и таблицы смайлов Emoji, независмо от системных настроек и кол-ва подключенных клавиатур. Время решения этого вопрос пока не обозначено.

Но спасибо Apple за наводку на решение данной проблемы программным путем. Выше написано, что [NSLocale currentLocale] всегда возвращает en_US. Так давайте заставим ее возвращать то, что нужно нам, например, ru_RU. Для этого у нас в руках есть незаменимый инструмент «method swizzling» (достаточно хорошее подробное описание можно найти, например, здесь [2]).

Итак, все что нам нужно, — это:

  • написать категорию для класса NSLocale, где мы переопределим поведение метода класса + (NSLocale *)currentLocale;
  • добавить категорию в .pch файл проекта
  • не забыть очистить проект перед сборкой

//  NSLocale+iOS8.h
//  Created by Alexey Matveev on 01.11.2014.
//  Copyright (c) 2014 Alexey Matveev. All rights reserved.

#if TARGET_IPHONE_SIMULATOR

#define LOCALE_IDENTIFIER @"ru_RU"

@interface NSLocale (iOS8)
@end

#endif

//  NSLocale+iOS8.m
//  Created by Alexey Matveev on 01.11.2014.
//  Copyright (c) 2014 Alexey Matveev. All rights reserved.

#if TARGET_IPHONE_SIMULATOR

#import "NSLocale+iOS8.h"
#import <objc/runtime.h>

@implementation NSLocale (iOS8)

+ (void)load
{
    Method originalMethod = class_getClassMethod(self, @selector(currentLocale));
    Method swizzledMethod = class_getClassMethod(self, @selector(swizzled_currentLocale));
    method_exchangeImplementations(originalMethod, swizzledMethod);
}

+ (NSLocale*)swizzled_currentLocale
{
    return [NSLocale localeWithLocaleIdentifier:LOCALE_IDENTIFIER];
}

@end

#endif

Интересно отметить, что данное решение имеет весьма полезное побочное действие. Наличие данное категории в проекте обязывает присутствовать клавиатуру ввода для любой выбранной локазализии в списке ввода приложения независимо от того, добавлена ли она в системных настройках. Так что теперь можно смело сбрасывать настройки симулятора, просто собирать проект и сразу иметь по рукой русскую раскладку (или любую другую).


Сайт-источник PVSM.RU: https://www.pvsm.ru

Путь до страницы источника: https://www.pvsm.ru/pesochnitsa/73711

Ссылки в тексте:

[1] Xcode Release Notes: https://developer.apple.com/library/ios/releasenotes/DeveloperTools/RN-Xcode/Chapters/Introduction.html

[2] здесь: http://nshipster.com/method-swizzling/