Как и большинство разработчиков, я недавно обновил 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
Интересно отметить, что данное решение имеет весьма полезное побочное действие. Наличие данное категории в проекте обязывает присутствовать клавиатуру ввода для любой выбранной локазализии в списке ввода приложения независимо от того, добавлена ли она в системных настройках. Так что теперь можно смело сбрасывать настройки симулятора, просто собирать проект и сразу иметь по рукой русскую раскладку (или любую другую).