Симулятор iOS 8.1 всегда использует американскую раскладку клавиатуры, несмотря на немецкую аппаратную клавиатуру

По какой-то причине я больше не могу вводить текст с помощью своей родной немецкой клавиатуры в iOS Simulator.

После загрузки Xcode 6.1 (который содержит iOS 8.1) я застрял с американским макетом.

Я пробовал такие вещи, как изменение всех настроек оборудования / клавиатуры, удаление ~/Library/Preferences/com.apple.iphonesimulator.plistи сброс симулятора iOS.

Ничего не помогло!

Должен ли я переустановить весь пакет?

8 ответов

Решение

Это ошибки симулятора iOS 8.1.

Я мог проверить язык, установив "Язык приложения" в используемой схеме.

Перейдите в Product > Scheme > Edit Scheme... или нажмите cmd + Y.

Источник: Ответ Йошихиро Сакамото в Apple Dev Forum

Это известная проблема со временем выполнения симулятора iOS 8.1, о которой говорится в примечаниях к выпуску Xcode 6.1:

Настройки локализации и клавиатуры, включая сторонние клавиатуры, неправильно учитываются Safari, Картами и приложениями для разработчиков в имитаторе iOS 8.1. [NSLocale currentLocale] возвращает en_US, и доступны только английская и Emoji клавиатуры. (18418630, 18512161)

То же самое относится и к другим настройкам, которые должны влиять на все приложения, а не только на локаль (например, настройки клавиатуры).

Как упоминалось в примечаниях к выпуску iOS SDK 8.2 beta 2, эта проблема должна быть решена в iOS 8.2:

Исправлено в бета-версии 2 Дополнительные клавиатуры, в том числе сторонние, могут не отображаться в Safari, Картах или сторонних приложениях в iOS Simulator

Если вам нужно использовать iOS 8.1, вы сможете использовать немецкий макет в некоторых приложениях, но не в других. Например, Safari и Карты - два примера приложений, с которыми он не будет работать.

Прежде чем Apple исправит, можно использовать следующее проверенное решение на основе NSLocale swizzling,

На самом деле нам нужно только заменить неправильное currentLocale который сломан в симуляторе iOS8.1.

Прикрепите категорию к проектам и добавьте ее в .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 here your locale identifier: de_DE, ru_RU, etc
#define LOCALE_IDENTIFIER @"de_DE"

@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

Надеюсь, теперь вы видите то же самое

Скриншот симулятора iOS8 с немецкой клавиатурой

Еще одна вещь, используя этот подход, вы получаете один приятный побочный эффект: клавиатура, выбранная с помощью языкового стандарта категории, всегда используется и не зависит от системных настроек и добавленных клавиатур. Таким образом, сброс настроек симулятора не требует добавления клавиатуры снова.

Категориальный подход позволяет переопределить языковые и региональные настройки для всех целей одновременно, не внося изменений в эти параметры в каждой целевой схеме отдельно.

На вашей цели перейдите на схему редактирования -> выберите язык приложения и регион приложения (немецкий). Клавиатура с программным обеспечением в порядке, аппаратного обеспечения нет)

Есть еще одна известная проблема с 8.1, из-за которой клавиатуры не отображаются в симуляторе.

Известные проблемы с клавиатурой Дополнительные клавиатуры, в том числе сторонние клавиатуры, могут не отображаться в Safari, Картах или сторонних приложениях на Симуляторе.

Обходной путь: Клавиатуры должны быть тестируемыми в Календаре, Центре внимания, Контактах и ​​Фото.

Я понимаю, что ваше приложение не будет работать. Моя клавиатура не отображается в Safari или в Картах, но отлично работает в панели поиска фотографий.

Решение @malex', быстро добавив currentLocale и добавив его в файл.pch, практически помогло мне. Он включил языковую клавиатуру (датский), но не сделал ее клавиатурой по умолчанию.

Чтобы сделать его клавиатурой по умолчанию, мне также пришлось переключить метод предпочитаемого языка в NSLocale.

Спасибо @malex.

В итоге все получилось:

@interface NSLocale (iOS8)
@end

@implementation NSLocale (iOS8)

+ (void)load
{
    Method originalCurrentLocale = class_getClassMethod(self, @selector(currentLocale));
    Method swizzledCurrentLocale = class_getClassMethod(self, @selector(swizzled_currentLocale));
    method_exchangeImplementations(originalCurrentLocale, swizzledCurrentLocale);

    Method originalPreferredLanguages = class_getClassMethod(self, @selector(preferredLanguages));
    Method swizzledPreferredLanguages = class_getClassMethod(self, @selector(swizzled_preferredLanguages));
    method_exchangeImplementations(originalPreferredLanguages, swizzledPreferredLanguages);
}

+ (NSLocale *)swizzled_currentLocale
{
    return [NSLocale localeWithLocaleIdentifier:@"da_DK"];
}

+ (NSArray *)swizzled_preferredLanguages
{
    return @[@"da"];
}

@end

В приложении "Настройки" в разделе "Основные"> "Клавиатура"> "Клавиатуры" нажмите (нажмите) Добавить новую клавиатуру:

Если вы имеете в виду, что симулятор не будет принимать ввод с вашей аппаратной клавиатуры, вам нужно подключить его (command-shift-K):

Это в меню Hardware > Keyboard.

В качестве альтернативы упомянутым выше исправлениям можно использовать переменные среды в качестве обходного пути.

Добавьте переменную окружения, скажем "myLocale" в разделе: изменить схему> аргументы> переменные окружения в Xcode.

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

В своем коде вы можете добавить условие, чтобы проверить, включена ли переменная среды.

NSString *locale = [[[NSProcessInfo processInfo] environment] objectForKey:@"myLocale"];
if (locale) {
    NSLog(@"Using environment variable for locale");
} else{
    NSLog(@"Using locale configured from settings");
}
Другие вопросы по тегам