ログイン機能をテストするUIテストがあります(そしてそれを使用して他のものをテストします)が、フォーカスが1つのフィールドから別のフィールドに変更されると、キーボードが非表示になり、カーソルがフィールドで点滅しているのに_field.typeText
_-_no focused fields to fill
_。
どういうわけか、_Hardware -> Keyboard -> toggle software keyboard
_をクリックするとキーボードが画面に表示され続けるので、テストがうまく機能していることに気付きました。ただし、任意のテストデバイス、任意の開発者マシンで動作させる必要があるため、プロジェクトのreadmeで「テストが失敗した場合は、…に移動して…手動で設定」することなく、プログラムでこのオプションを設定したいと思います。
出来ますか?
シミュレーターの.plistファイルが変更され、複数のシミュレーターのサポートが追加されました。 ConnectHardwareKeyboardブール値がデバイスのUDIDの下にネストされるようになりました。幸いにも、このUDIDはplistファイルにも保存されます。このコードは、UITestターゲットのビルドフェーズで「スクリプトの実行」を使用して追加できます。
Xcode 9の回答:
#grab the UDID from the plist
UDID=$(defaults read com.Apple.iphonesimulator CurrentDeviceUDID)
#overwrite the existing value with false
#OR if the plist doesn't have that value add it in
/usr/libexec/PlistBuddy -c "Set :DevicePreferences:$UDID:ConnectHardwareKeyboard
false" ~/Library/Preferences/com.Apple.iphonesimulator.plist
||
/usr/libexec/PlistBuddy -c "Add :DevicePreferences:$UDID:ConnectHardwareKeyboard
bool false" ~/Library/Preferences/com.Apple.iphonesimulator.plist
または、この他のコードを使用して、すべてのシミュレーターに影響を与えることができます。
/usr/libexec/PlistBuddy -c "Print :DevicePreferences" ~/Library/Preferences/com.Apple.iphonesimulator.plist | Perl -lne 'print $1 if /^ (\S*) =/' | while read -r a; do /usr/libexec/PlistBuddy -c "Set :DevicePreferences:$a:ConnectHardwareKeyboard
false" ~/Library/Preferences/com.Apple.iphonesimulator.plist || /usr/libexec/PlistBuddy -c "Add :DevicePreferences:$a:ConnectHardwareKeyboard
bool false" ~/Library/Preferences/com.Apple.iphonesimulator.plist; done
Xcode 9より前のバージョンでは、Simulator.appでハードウェアキーボードを無効にすることで回避できます。これにより、ソフトウェアキーボードが常に表示されます。例えば:
defaults write com.Apple.iphonesimulator ConnectHardwareKeyboard -bool NO
Xcode10.3およびXcode11でテスト済み。以下のスニペットは、アプリターゲット(テストバンドルではない)に配置する必要があります—たとえば、AppDelegate.Swift。 UIKeyboardInputMode
のautomaticHardwareLayout
プロパティをnil
に設定することにより、ハードウェアキーボードが自動的に接続されないようにします。
????シミュレータの設定に依存しません。
???? 注:これはSimulator 11.0(Xcode 11)で修正されたようです。
#if targetEnvironment(simulator)
// Disable hardware keyboards.
let setHardwareLayout = NSSelectorFromString("setHardwareLayout:")
UITextInputMode.activeInputModes
// Filter `UIKeyboardInputMode`s.
.filter({ $0.responds(to: setHardwareLayout) })
.forEach { $0.perform(setHardwareLayout, with: nil) }
#endif
またはObjective-c:
#if TARGET_IPHONE_SIMULATOR
SEL setHardwareLayout = NSSelectorFromString(@"setHardwareLayout:");
for (UITextInputMode *inputMode in [UITextInputMode activeInputModes]) {
if ([inputMode respondsToSelector:setHardwareLayout]) {
// Note: `performSelector:withObject:` will complain, so we have to use some black magic.
((void (*)(id, SEL, id))[inputMode methodForSelector:setHardwareLayout])(inputMode, setHardwareLayout, NULL);
}
}
#endif
Brooksのすばらしい答えに従って、これはすべてのシミュレータで機能します。
/usr/libexec/PlistBuddy -c "Print :DevicePreferences" ~/Library/Preferences/com.Apple.iphonesimulator.plist | Perl -lne 'print $1 if /^ (\S*) =/' | while read -r a; do /usr/libexec/PlistBuddy -c "Set :DevicePreferences:$a:ConnectHardwareKeyboard
false" ~/Library/Preferences/com.Apple.iphonesimulator.plist || /usr/libexec/PlistBuddy -c "Add :DevicePreferences:$a:ConnectHardwareKeyboard
bool false" ~/Library/Preferences/com.Apple.iphonesimulator.plist; done
Xcode 10.1でテストしました。さまざまなアプローチを試しましたが、シミュレーターUDIDを取得する方法を解決するものはありませんでした。
#Find the UDID of the booted simulator
#And use PlistBuddy to change the flag to true or false
#Set the variable useHardwareKeyboard with the desired result
#Relaunch the simulator
useHardwareKeyboard=false
export UDID=$(xcrun simctl list devices | grep "(Booted)" | grep -E -o -i "([0-9a-f]{8}-([0-9a-f]{4}-){3}[0-9a-f]{12})")
/usr/libexec/PlistBuddy -c "Set :DevicePreferences:$UDID:ConnectHardwareKeyboard ${useHardwareKeyboard}" ~/Library/Preferences/com.Apple.iphonesimulator.plist
xcrun simctl shutdown $UDID
xcrun simctl boot $UDID
これらの変更を確認することもできます。
シミュレーターUDIDを見つけます:(詳細はこちら: https://nshipster.com/simctl/ )
xcrun simctl list devices | grep "(Booted)" | grep -E -o -i "([0-9a-f]{8}-([0-9a-f]{4}-){3}[0-9a-f]{12})"
これらのコマンドの1つを実行し、上からのUDIDに基づいて変更を見つけます。
defaults read com.Apple.iphonesimulator
#OR
open ~/Library/Preferences/com.Apple.iphonesimulator.plist
Xcode 10.2では、これらのソリューションはどれも機能しません。plist
は正しく変更されますが、キーボードは非表示になります。キーボードが表示されない場合は、シミュレータでoascriptを使用してCtrl + Shift + Kを押す必要があります。それは美しさではありませんが、機能する唯一の回避策です。
tell application "Simulator" to activate
tell application "System Events"
keystroke "K" using {command down, shift down}
end tell