Updated January 22, 2022:
While reading the Virtual Keyboard API document here: https://github.com/MicrosoftEdge/MSEdgeExplainers/blob/main/VirtualKeyboardPolicy/explainer.md I noticed that it referred to an inputmode attribute that could be used to change what type of Virtual Keyboard layout should be shown (numeric, telephone, numeric, etc).
Within this document, they mentioned that a value of none could be used to hide the Virtual Keyboard, and after looking up the attribute in the MDN documents, sure enough, the none value is meant to be used when the page (in this case the Mobile App) implements its own keyboard: https://developer.mozilla.org/en-US/docs/Web/HTML/Global_attributes/inputmode#values

Unlike the other solutions, this attribute will retain the focus on the input element and will still permit the user to perform multi-selections and context menu actions (i.e. copy/paste, select all, etc).
This attribute can be used on inputs:
<input inputmode="none">
As well as on any element that is made editable through the contenteditable attribute:
<div inputmode="none" contenteditable />
I tested this functionality both on the iOS (XCode) and Android (Android Studio) simulators/emulators and it worked on both!
Original Answer January 15: 2022:
Thankfully it looks like a new Web API is in the works called the Virtual Keyboard API.
I won't elaborate much on the new API itself, because I already did so in another Stack Overflow answer.
The new API introduced a new attribute called virtualKeyboardPolicy which can be set to auto or manual.
When set to manual the Virtual Keyboard will not show up automatically when an input element is focused, but unlike the other solutions, the input will remain focused and permit the user to perform multi-character selections, copy/paste, etc.
The feature was shipped in Chromium v94 (which was released on September 21, 2021), so  I did some testing in a couple of Chromium based browsers, and it seems that the new attribute already works!
<input
  virtualkeyboardpolicy="auto"
  value="Auto Virtual Keyboard"
>
 

Notice that the Virtual Keyboard is hidden in the following images!
<input
  virtualkeyboardpolicy="manual"
  value="Manual Virtual Keyboard"
>
 

My hope is that the Virtual Keyboard API will eventually be implemented in the Web Views that Ionic uses to run on Native devices which will enable us to use it in our Mobile Apps!