Contact   •   Products   •   Search

Rick Strahl's Web Log

Wind, waves, code and everything in between...
ASP.NET • C# • HTML5 • JavaScript • AngularJs

Prefilling an SMS on Mobile Devices with the sms: Uri Scheme


Popping up the native SMS app from a mobile HTML Web page is a nice feature that allows you to pre-fill info into a text for sending by a user of your mobile site. The syntax is a bit tricky due to some device inconsistencies (and quite a bit of wrong/incomplete info on the Web), but it's definitely something that's fairly easy to do.

In one of my Mobile HTML Web apps I need to share a current location via SMS. While browsing around a page I want to select a geo location, then share it by texting it to somebody. Basically I want to pre-fill an SMS message with some text, but no name or number, which instead will be filled in by the user.

What works

The syntax that seems to work fairly consistently except for iOS is this:

sms:phonenumber?body=message

For iOS instead of the ? use a ';' (because Apple is always right, standards be damned, right?):

sms:phonenumber;body=message

and that works to pop up a new SMS message on the mobile device. I've only marginally tested this with a few devices: an iPhone running iOS 6, an iPad running iOS 7, Windows Phone 8 and a Nexus S in the Android Emulator. All four devices managed to pop up the SMS with the data prefilled.

You can use this in a link:

<a href="sms:1-111-1111;body=I made it!">Send location via SMS</a>

or you can set it on the window.location in JavaScript:

window.location ="sms:1-111-1111;body=" + encodeURIComponent("I made it!");

to make the window pop up directly from code. Notice that the content should be URL encoded - HTML links automatically encode, but when you assign the URL directly in code the text value should be encoded.

Body only

I suspect in most applications you won't know who to text, so you only want to fill the text body, not the number. That works as you'd expect by just leaving out the number - here's what the URLs look like in that case:

sms:?body=message

For iOS same thing except with the ;

sms:;body=message

Here's an example of the code I use to set up the SMS:

var ua = navigator.userAgent.toLowerCase();
var url;
        
if (ua.indexOf("iphone") > -1 || ua.indexOf("ipad") > -1)
    url = "sms:;body=" + encodeURIComponent("I'm at " + mapUrl + " @ " + pos.Address);
else
    url = "sms:?body=" + encodeURIComponent("I'm at " + mapUrl + " @ " + pos.Address);

location.href = url;

and that also works for all the devices mentioned above.

It's pretty cool that URL schemes exist to access device functionality and the SMS one will come in pretty handy for a number of things. Now if only all of the URI schemes were a bit more consistent (damn you Apple!) across devices...

Make Donation
Posted in IOS  JavaScript  HTML5  


Feedback for this Post

 
# re: using 'sms:' Uri Scheme without specifying the phonenumber
by Red Feet October 10, 2013 @ 12:43am
Thanks Rick,

For figuring it out and sharing your findings!

I refactored the javascript to this:

var ua = navigator.userAgent.toLowerCase();
var url = "sms:";
url += (ua.indexOf("iphone") > -1 || ua.indexOf("ipad") > -1) ? ";" : "?";
url += "body=" + encodeURIComponent("I'm at " + mapUrl + " @ " + pos.Address);
location.href = url;
# re: Prefilling an SMS on Mobile Devices with the sms: Uri Scheme
by ez October 10, 2013 @ 11:56am
For me (iPhone 4s with iOS7) this does not prefill the body; however on an older iphone with iOS6 it does work for me. Anyone else with iOS7 iphone try this?
# re: Prefilling an SMS on Mobile Devices with the sms: Uri Scheme
by Rick Strahl October 10, 2013 @ 1:48pm
@ez - I tried this on iPad with iOS 7 and that seemed to work. I assume this is an OS feature not a hardware feature. If it doesn't work - can you try the alternate (proper) syntax with the ?
# re: Prefilling an SMS on Mobile Devices with the sms: Uri Scheme
by ez October 11, 2013 @ 6:36am
I tried it both ways and the body does not prefil.
# re: Prefilling an SMS on Mobile Devices with the sms: Uri Scheme
by Rick Strahl October 11, 2013 @ 1:34pm
@ez - not sure definitely works on iOS7 with my iPad 2. Maybe somebody else can chime in from iOS 7. I just can't see that this would work different on any specific Apple device since this is an OS level feature. Maybe there are some special security settings at work? Can you 'Share' to SMS from other apps?
# re: Prefilling an SMS on Mobile Devices with the sms: Uri Scheme
by Noam Shapira October 23, 2013 @ 11:12am
As far as I see on iPhone5, sms body is prefil only when old conversion to same target exist in the messaging history of the phone.
# re: Prefilling an SMS on Mobile Devices with the sms: Uri Scheme
by David February 14, 2014 @ 9:18am
ez - same thing happening to me in IOS7 Iphone 5. Did you ever get a solution to this?
# re: Prefilling an SMS on Mobile Devices with the sms: Uri Scheme
by Rupert March 13, 2014 @ 8:48am
Just picking up on this thread, it has been incredibly useful. I can confirm however, that prefil seems only to work if a previous conversation thread exists to a particular number.
If there is a known work around to this I would love to know because this could be a big breaker for us in terms of an idea we have to utilise this functionality.

Thanks a lot,
Rupert
# re: Prefilling an SMS on Mobile Devices with the sms: Uri Scheme
by Roy June 09, 2014 @ 8:55am
Hi everyeone,

I came to the same conclusion as everyone else - Body is only prefilled if there is a pre-existing thread to the person.

Has anyone found a workaround?

Many thanks
# re: Prefilling an SMS on Mobile Devices with the sms: Uri Scheme
by Brandon June 25, 2014 @ 2:49pm
For some reason sms:?body= links will not open correctly from chrome on android, but just fine from Firefox on android. I am using Hangouts for SMS. Any ideas on how to fix?
# re: Prefilling an SMS on Mobile Devices with the sms: Uri Scheme
by Ravi August 28, 2014 @ 7:26am
I am not seeing the pre-filled text if I don't pass the phone number, I don't know the phone number upfront, we want the text to appear and let the user to choose whomever they need to send it to. So far I was not successful.

sms:;body=message is not working as expected on iOS 7.1.1. Any workarounds?

Thanks in advance
# re: Prefilling an SMS on Mobile Devices with the sms: Uri Scheme
by Frustrated September 13, 2014 @ 8:28am
not working on IO7, no fix that I know of. Sucks. If any one has any luck or comes up with workaround, please post.
# re: Prefilling an SMS on Mobile Devices with the sms: Uri Scheme
by danielsdesk November 04, 2014 @ 1:01pm
FYI for iOS 8, you have to use an & instead of ; now and body prefill will work... however it still seems to be impossible on iOS7 (so basically iOS 5-6 and 8 can prefill body)
 


West Wind  © Rick Strahl, West Wind Technologies, 2005 - 2014