Is it possible to register a http+domain-based URL Scheme for iPhone apps, like YouTube and Maps?
I think the least intrusive way of doing this is as follows:
- Check if the user-agent is that of an iPhone/iPod Touch
- Check for an
appInstalled
cookie - If the cookie exists and is set to true, set
window.location
toyour-uri://
(or do the redirect server side) - If the cookie doesn't exist, open a "Did you know Your Site Name has an iPhone application?" modal with a "Yep, I've already got it", "Nope, but I'd love to try it", and "Leave me alone" button.
- The "Yep" button sets the cookie to true and redirects to
your-uri://
- The "Nope" button redirects to "http://itunes.com/apps/yourappname" which will open the App Store on the device
- The "Leave me alone" button sets the cookie to false and closes the modal
- The "Yep" button sets the cookie to true and redirects to
The other option I've played with but found a little clunky was to do the following in Javascript:
setTimeout(function() { window.location = "http://itunes.com/apps/yourappname";}, 25);// If "custom-uri://" is registered the app will launch immediately and your// timer won't fire. If it's not set, you'll get an ugly "Cannot Open Page"// dialogue prior to the App Store application launchingwindow.location = "custom-uri://";
It's quite possible to do this in JavaScript as long as your fallback is another applink. Building on Nathan's suggestion:
<html> <head> <meta name="viewport" content="width=device-width" /> </head> <body> <h2><a id="applink1" href="fb://profile/116201417">open facebook with fallback to appstore</a></h2> <h2><a id="applink2" href="unknown://nowhere">open unknown with fallback to appstore</a></h2> <p><i>Only works on iPhone!</i></p> <script type="text/javascript">// To avoid the "protocol not supported" alert, fail must open another app.var appstorefail = "itms://itunes.apple.com/us/app/facebook/id284882215?mt=8&uo=6";function applink(fail){ return function(){ var clickedAt = +new Date; // During tests on 3g/3gs this timeout fires immediately if less than 500ms. setTimeout(function(){ // To avoid failing on return to MobileSafari, ensure freshness! if (+new Date - clickedAt < 2000){ window.location = fail; } }, 500); };}document.getElementById("applink1").onclick = applink(appstorefail);document.getElementById("applink2").onclick = applink(appstorefail);</script></body></html>