Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

disable iOS simulator 'connect hardware keyboard' programmatically

I'm writing XCUITests for view has 2 UITextField and by defualt the simulator has hardware keyboard connected, hence the software one is not being presented.

Is it possible to set some settings (maybe in schema?) to force-disable connecting hardware keyboard by the simulator before test runs.

I went through few links but none seems to be helpful. iOS simulator - disable connect hardware keyboard programmatically

Disable Hardware Keyboard for iOS Simulator using UIAutomation

When i try this on xcode local it works but, XCUItest runs on CI and i configured fastlane file for this called enable keyboard script before Test execution starts. But it throws error

Set: Entry, ":DevicePreferences::ConnectHardwareKeyboard ", Does Not Exist

Any help would be really appreciated

like image 645
Nitisha Sharma Avatar asked Apr 25 '19 08:04

Nitisha Sharma


Video Answer


2 Answers

To disable iOS Simulators Connect Hardware Keyboard setting (Simulator -> Hardware -> Connect Hardware Keyboard), add this sniped in AppDelegate. ref link

#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
like image 82
Omer Faruk Ozturk Avatar answered Oct 17 '22 17:10

Omer Faruk Ozturk


Went through the same problem. Found a simple solution to add a prescript in the UI tests scheme.

First, this is image of the plist file opened with Xcode. This is located at ~/Library/Preferences/com.apple.iphonesimulator.plist

enter image description here

Now here is the prescript I added to my ui tests scheme. Read the comments in script for further explanation.

enter image description here

killall Simulator
defaults write com.apple.iphonesimulator ConnectHardwareKeyboard -bool false

How it works First the simulator is killed. Next the "defaults" command writes the key/value into the simulators plist. Now when the tests start, they launch the simulator which takes into account the value we wrote in plist.

Hope it works for you too. :)

like image 41
Hasaan Ali Avatar answered Oct 17 '22 16:10

Hasaan Ali