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

в 3:42, , рубрики: Песочница, метки: ,

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

Как упомянуто в Xcode Release Notes, 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» (достаточно хорошее подробное описание можно найти, например, здесь).

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

  • написать категорию для класса 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

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


* - обязательные к заполнению поля


https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js