With mobile web use on the rise, the chance of your site's visitors being on a cell phone are ever increasing. To make it easy to contact you, you may want to add a link to your site to allow your users to send you a text. Perhaps you wrote part of a render array that looks like this:
$build['sms'] = [ '#type' => 'link', '#title' => t('Send us a text!'), '#url' => Url::fromUri('sms:1234567890'), ];
But there's one problem with this: Drupal will give you an exception!
InvalidArgumentException: The URI 'sms:' is invalid. You must use a valid URI scheme. Use base: for a path, e.g., to a Drupal file that needs the base path. Do not use this for internal paths controlled by Drupal. in Drupal\Core\Utility\UnroutedUrlAssembler->assemble() (line 65 of core/lib/Drupal/Core/Utility/UnroutedUrlAssembler.php).
This is for a good reason. Drupal filters any links it outputs so that malicious HTTP schemas can't be embedded in your site. The list of allowed schemas can be found in your sites/default/services.yml file under filter_protocols. This is the default list:
filter_protocols: - http - https - ftp - news - nntp - tel - telnet - mailto - irc - ssh - sftp - webcal - rtsp
To allow SMS links, simply add an "sms" entry at the end of this list.