Organizational Research By

Surprising Reserch Topic

check if url scheme is supported in javascript


check if url scheme is supported in javascript  using -'javascript,iphone,safari,url-scheme'

asked Sep 14, 2015 by CheriHawthor
0 votes
4 views



Related Hot Questions

9 Answers

0 votes

Not seamlessly. But there is a way similar to checking if a pop-up was blocked or not.

When you try a URL scheme which is not supported, Safari will warn the user that it doesn't know what to do with it and stay on the same page.

So if you gave your app-call some time to activate, say 300 ms, and then do something else to respond to the non-existence of the scheme.

It's not the prettiest but it works:

function startIThrown(){
  document.location = 'ithrown://restart';
  setTimeout(function(){
    if(confirm('You do not seem to have iThrown installed, do you want to go download it now?')){
      document.location = 'http://itunes.apple.com/WebObjects/MZStore.woa/wa/viewSoftware?id=293049283&mt=8&uo=6';
    }
  }, 300);
}

Restart iThrown
answered Sep 14, 2015 by IXNCar
0 votes

Here is a solution that does not show the popup when you come back from the app, it assumes you've been gone longer than 400 ms:

function startiThrown() {
    document.location = appurl;
    var time = (new Date()).getTime();
    setTimeout(function(){
        var now = (new Date()).getTime();

        if((now - time)<400) {
            if(confirm('You do not seem to have iThrown installed, do you want to go download it now?')){
            document.location = 'http://itunes.apple.com/WebObjects/MZStore.woa/wa/viewSoftware?id=293049283&mt=8&uo=6';
            }
         }
    }, 300);
}
answered Sep 14, 2015 by MarGeyer
0 votes

I found pagehide event to be more robust than depending on system time. For those of us who prefers a non-jQuery favor, here is the snippet.

  var appurl = 'custom://url';
  var appstore = 'https://itunes.apple.com/us/app/your-app';

  var timeout;
  function preventPopup() {
    clearTimeout(timeout);
    timeout = null;
    window.removeEventListener('pagehide', preventPopup);
  }
  function startApp() {
    document.location = appurl;
    timeout = setTimeout(function(){
      if(confirm('You do not seem to have the App installed, do you want to go download it now?')){
        document.location = appstore;
      }
    }, 1000);
    window.addEventListener('pagehide', preventPopup);
  }
answered Sep 14, 2015 by RobertHamill
0 votes

Another great (at least working in latest browser versions) workaround is to check if the browser window has focus after a short timeout, this way you can show a dialog box to the user only if the URI scheme didn't work

HTML:

URI

Javascript (using jQuery here):

var windowHasFocus;

$(window).focus(function() {
  windowHasFocus = true;
}).blur(function() {
  windowHasFocus = false;
});

function goToUri(uri) {
  document.location = uri;
  setTimeout(function(){
    if(windowHasFocus) {
      if(confirm('You do not seem to have Qobuz installed, do you want to go download it now?')){
        document.location = 'http://www.qobuz.com';
      }
    }
  }, 100);
}

$('a').on('click', function(){ 
  goToUri($(this).data('uri')); 
});​

Here is a working jsFiddle, just update it with your own URI scheme: http://jsfiddle.net/mF6TZ/

answered Sep 14, 2015 by amit.gupta
0 votes

Here is a variation on the previous 2 solutions. It will create a link that can be opened in Google Chrome. If it fails it opens the link using http



Open Google with Chrome
answered Sep 14, 2015 by EmelyGarnett
0 votes

Starting from iOS 6.0 Apple presented the Smart App Banners which do what most of us are looking for:

  • Send to App Store if the app isn't installed.
  • Open the App with a specific deep link, using the app-argument param.

Include the following meta tag:


taken from here: Safari Web Content Guide

answered Sep 14, 2015 by EpifaniaWink
0 votes

I try to use just the 'pagehide' event, but then it not work into Firefox. I created this version here http://jsfiddle.net/thiagomata/6tvoc4f1/2/ what works in Firefox, Google Chrome and Safari. I have not tested in Internet Explorer yet.

One thing what was necessary to make it work into Firefox, was use Iframe to set the src. This allows me to call the app without leaving my page.

http://www.google.com?q=not-found-link"
  >
  Example 1
​
http://www.google.com?q=not-found-link"
  data-url-app-found="http://www.google.com?q=found-link"
  >
  Example 2
​
http://www.google.com?q=not-exists"
>
  Example 3
​

answered Sep 14, 2015 by RickyPrichar
0 votes

This is based on the answer of mrahman. As noted, by JoshNaro new Date() gives back a wrong date when called inside the timeout. Tests suggest that the date is not updated in threads that are started before the app is deactivated.

A further ugly setTimeout called after activation will create a new thread with the current date.

This was tested on iOS 8.

function startiThrown() {
    document.location = appurl;
    var time = (new Date()).getTime();
    setTimeout(function(){
        setTimeout(function(){ // <-- start new thread after activation
            var now = (new Date()).getTime();
            if((now - time)<400) {
                if(confirm('You do not seem to have iThrown installed, do you want to go download it now?')){
                    document.location = 'http://itunes.apple.com/WebObjects/MZStore.woa/wa/viewSoftware?id=293049283&mt=8&uo=6';
                }
            }
        }, 10; // <-- start new thread after activation
    }, 300);
}
answered Sep 14, 2015 by MirPawlowsk
0 votes

I have this comment a/18715513/49114 with a jQuery plugin to add alternative app link to regular links.

Regards, Lito.

answered Sep 14, 2015 by TDMMayradgbc

...