是否可以为iPhone应用程序(例如YouTube和地图)注册基于http +域的URL方案?


223

每当手机上安装了我的应用程序时,我都希望iOS可以使用我的应用程序从我的域(例如http://martijnthe.nl)中打开URL ;如果没有,请使用Mobile Safari 打开我的域中的URL 。

我读到可以为此创建一个唯一的协议后缀并将其注册到Info.plist中,但是如果未安装该应用程序,则Mobile Safari会给出错误消息。

有什么解决方法?

一个想法:

1)使用在任何桌面浏览器中打开的http:// URL,并通过浏览器呈现服务

2)检查User-Agent,如果是Mobile Safari,请打开myprotocol:// URL(尝试)以打开iPhone应用程序,并打开Mobile iTunes以下载该应用程序,以防尝试失败

不知道这是否行得通...建议?谢谢!


4
在纽约地铁中,Boingo提供了wifi,如果您下载他们推荐的应用程序,则可以免费使用WiFi。下载后,您将返回Safari,浏览器会检测到它是否已安装,然后授予您访问权限。知道这是怎么做的吗?
TommyG,2013年

2
通用链接现在将支持此用例,而不会出现任何错误消息。以下是配置域和应用程序的方法:blog.branch.io/…–
Alex Austin

Answers:


243

我认为这样做的最不麻烦的方式如下:

  1. 检查用户代理是否为iPhone / iPod Touch的用户代理
  2. 检查appInstalledCookie
  3. 如果cookie存在并且设置为true,则设置window.locationyour-uri://(或执行重定向服务器端)
  4. 如果cookie不存在,请打开“您是否知道您的站点名称具有iPhone应用程序?” 并带有“是的,我已经知道了”,“不,但我想尝试一下”和“让我一个人”按钮的模式。
    1. “是”按钮将cookie设置为true并重定向到 your-uri://
    2. “否”按钮重定向到“ http://itunes.com/apps/yourappname ”,它将在设备上打开App Store
    3. “让我一个人呆”按钮将cookie设置为false并关闭模式

我玩过的另一个选择却有些笨拙,是在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 launching
window.location = "custom-uri://";

16
很好的解决方案。如果您的后备是另一个应用程序,它将立即加载而不显示错误。因此,不要退回到itunes.com ... 而是使用itms://phobos.apple.com / ...以避免弹出错误!
jb。

47
问题window.location="custom-uri://成功后,回退超时不会终止。当用户从您的应用返回浏览器时,计时器仍然存在,将启动应用商店链接。这是糟糕的用户体验。
JoJo 2012年

5
看来Cookie已在#ios6中被沙箱化,因此您无法从另一个应用程序访问由应用程序设置的Cookie。(例如,App WebUI和Safari Mobile)
Olivier Amblet 2013年

2
有人找到一种方法来防止用户返回浏览器时触发原始超时吗?(JoJo提到的有争议的问题)
cobolstinks

2
为了解决JoJo提到的问题,如果自用户单击链接以来没有经过“很多时间”,则仅在超时中运行代码。查看此解决方案:stackoverflow.com/a/14751543/533420
kkara

95

只要您的后备是另一个应用程序链接,就很有可能在JavaScript中执行此操作。以内森的建议为基础

<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>

在此处查看现场演示


7
同意Lee的观点,这似乎是一个更简单的解决方案-尽管如果该应用程序不存在并且重定向到应用程序商店,我仍然会从野生动物园获得错误消息。
乔恩

2
我将这个解决方案用于Android和iOS。我发现如果将超时值从500更改为100,我在iOS中找不到“无法打开页面”弹出对话框。我还发现Android的超时时间需要为50
Rossini 2012年

14
使用“ itms-apps:”代替“ itms:”可保存1个重定向并直接在appstore中打开应用程序页面。
德国拉托雷(Latorre)2012年


9
如果没有安装该应用程序以及在重定向到该应用程序商店之前,是否有人知道如何避免出现来自Safari的“无法打开页面”错误消息?
大卫2012年


24

我发现所选答案适用于浏览器应用程序,但我的代码在实现的非浏览器应用程序中无法正常工作UIWebView

对我来说,问题是Twitter应用程序上的用户将单击一个链接,该链接将使他们通过UIWebViewTwitter应用程序中的进入我的网站。然后,当他们单击我的网站上的按钮时,Twitter尝试看中并且仅window.location在网站可访问时才填写。因此,发生的是一个UIAlertView弹出窗口,说您确定要继续,然后立即重定向到App Store,而没有第二个弹出窗口。

我的解决方案涉及iframe。这避免了UIAlertView呈现,从而提供了简单而优雅的用户体验。

jQuery的

var redirect = function (location) {
    $('body').append($('<iframe></iframe>').attr('src', location).css({
        width: 1,
        height: 1,
        position: 'absolute',
        top: 0,
        left: 0
    }));
};

setTimeout(function () {
    redirect('http://itunes.apple.com/app/id');
}, 25);

redirect('custom-uri://');

Java脚本

var redirect = function (location) {
    var iframe = document.createElement('iframe');
    iframe.setAttribute('src', location);
    iframe.setAttribute('width', '1px');
    iframe.setAttribute('height', '1px');
    iframe.setAttribute('position', 'absolute');
    iframe.setAttribute('top', '0');
    iframe.setAttribute('left', '0');
    document.documentElement.appendChild(iframe);
    iframe.parentNode.removeChild(iframe);
    iframe = null;
};

setTimeout(function () {
    redirect('http://itunes.apple.com/app/id');
}, 25);

redirect('custom-uri://');

编辑:

将绝对位置添加到iframe中,以便在插入时在页面底部不会出现空白。

同样要注意的是,我还没有发现Android需要这种方法。使用window.location.href应该可以正常工作。


1
有用!!谢谢,我终于找到了适用于所有浏览器的解决方案。
koleror 2014年

2
如果找到的话,这是最好的解决方案。谢谢。不再有错误弹出窗口。
2014年

1
如果您希望在单击链接时触发此代码,请@Tim,然后将此代码包装到一个函数中,该函数在单击链接后即被调用。
cnotethegr8 2014年

1
@ cnotethegr8我已将其放在函数中,并重定向到自定义url效果很好,但回退到iTunes却没有效果。这是我的代码。我想念什么?
蒂姆(Tim)

1
还有其他人在iOS 9中遇到此问题吗?它在Safari中不再对我有用。
bgolson

20

苹果最终在iOS9中引入了注册您的应用程序以处理某些http://URL 的可能性:通用链接

关于其工作原理的非常粗略的解释:

  • 您声明有兴趣在http://应用程序中打开某些域的URL(Web URL)。
  • 在指定域的服务器上,您必须指示已声明有兴趣从服务器域中打开URL的哪个应用中打开哪个URL。
  • iOS URL加载服务会http://按照上述说明检查所有尝试打开URL的尝试,并自动打开正确的应用程序(如果已安装);无需先通过Safari ...

这是在iOS上进行深层链接的最干净的方法,不幸的是,它仅在iOS9和更高版本上有效。


并且它在浏览器内部不起作用...只能在外部,例如从留言或笔记中获取
Mihey Mik,

9

再次基于Nathan和JB的答案进行构建:

如何通过不带额外点击的url启动应用程序 如果您更喜欢不包含单击链接的中间步骤的解决方案,则可以使用以下方法。使用此javascript,我能够从Django / Python返回Httpresponse对象,该对象可以成功启动应用程序(如果已安装),或者在超时的情况下启动应用程序商店。请注意,我还需要将超时时间从500调整为100,以使其在iPhone 4S上正常工作。测试并调整以使其适合您的情况。

<html>
<head>
   <meta name="viewport" content="width=device-width" />
</head>
<body>

<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";

var loadedAt = +new Date;
setTimeout(
  function(){
    if (+new Date - loadedAt < 2000){
      window.location = appstorefail;
    }
  }
,100);

function LaunchApp(){
  window.open("unknown://nowhere","_self");
};
LaunchApp()
</script>
</body>
</html>

9
window.location = appurl;// fb://method/call..
!window.document.webkitHidden && setTimeout(function () {
    setTimeout(function () {
    window.location = weburl; // http://itunes.apple.com/..
    }, 100);
}, 600);

document.webkitHidden 用于检测您的应用程序是否已被调用以及当前的safari标签转到后台,此代码来自www.baidu.com


我测试了此解决方案,发现它正确地传递事件时,会暂时出现“ Safari无法打开该页面,因为地址无效”错误对话框。(它会在几分之一秒后自动关闭)。
michaelhanson

使用iframe加载appurlweburl可以解决您的问题
zyanlu

1
@zyanlu:我已经尝试过使用iFrame。bt Safari仍显示相同的错误。
kunjus 2014年

5

如果您iframe在网页上添加了src针对您的应用设置了自定义方案的网页,iOS将会自动重定向到应用中的该位置。如果未安装该应用程序,则不会发生任何事情。如果您安装了该应用程序,则可以深入链接到该应用程序;如果未安装,则可以重定向至该应用程序商店。

例如,如果您安装了twitter应用程序,并导航到包含以下标记的网页,则会立即将您定向到该应用程序。

<!DOCTYPE html>
<html>
    <head>
    <title>iOS Automatic Deep Linking</title>
    </head>
    <body>
        <iframe src="twitter://" width="0" height="0"></iframe>
        <p>Website content.</p>
    </body>
</html>

如果没有安装应用程序,这是一个更彻底的示例,它重定向到应用程序商店:

<!DOCTYPE html>
<html>
    <head>
    <title>iOS Automatic Deep Linking</title>
    <script src='//code.jquery.com/jquery-1.11.2.min.js'></script>
    <script src='//mobileesp.googlecode.com/svn/JavaScript/mdetect.js'></script>
    <script>
      (function ($, MobileEsp) {
        // On document ready, redirect to the App on the App store.
        $(function () {
          if (typeof MobileEsp.DetectIos !== 'undefined' && MobileEsp.DetectIos()) {
            // Add an iframe to twitter://, and then an iframe for the app store
            // link. If the first fails to redirect to the Twitter app, the
            // second will redirect to the app on the App Store. We use jQuery
            // to add this after the document is fully loaded, so if the user
            // comes back to the browser, they see the content they expect.
            $('body').append('<iframe class="twitter-detect" src="twitter://" />')
              .append('<iframe class="twitter-detect" src="itms-apps://itunes.com/apps/twitter" />');
          }
        });
      })(jQuery, MobileEsp);
    </script>
    <style type="text/css">
      .twitter-detect {
        display: none;
      }
    </style>
    </head>
    <body>
    <p>Website content.</p>
    </body>
</html>

第一个示例的问题是,如果您返回到Mobile Safari,即使启动了Twitter,它也会显示“未安装Twitter应用程序”。与第二个示例相同,显示“网站内容”。如果安装了该应用程序,则需要编写一些代码来执行某些操作(加载另一个URL或显示两个消息之一)。
mahboudz 2015年

1
是的,@ mahboudz,如果您阅读文字,这只是一个简单的示例,表明可以自动重定向到该应用程序。
q0rban 2015年

然后,我再举一个更详尽的示例,该示例将显示实际的网站内容。如果可以使它更清晰,我可以删除“未安装Twitter应用程序”文本。
q0rban 2015年

ios 6仍显示弹出窗口由于URL无效,无法打开该页面
Andrei Shender 2015年

@AndreiShender,此处是撰写本文时的iOS使用情况统计信息:monosnap.com/image/8eXUcpEUi8fm94DiMZIdiIp4xUNaln.png iOS 8:72%,iOS 7:25%,早期版本:3%
q0rban

4

这是一个解决方案。

使用模糊和聚焦设置布尔位置

//see if our window is active
window.isActive = true;
$(window).focus(function() { this.isActive = true; });
$(window).blur(function() { this.isActive = false; });

将链接与调用这样的jquery点击处理程序绑定。

function startMyApp(){
  document.location = 'fb://';

  setTimeout( function(){
    if (window.isActive) {
        document.location = 'http://facebook.com';
    }
  }, 1000);
}

如果应用程序打开,我们将失去对窗口的关注,计时器结束。否则,我们一无所获,并加载普通的Facebook网址。


非常感谢您的建议。我面临的问题是,“启动外部应用程序”对话框似乎足以使模糊对象停用该标志。即使未安装该应用程序,也会发生这种情况(例如,单击用于在桌面上启动iPhone应用程序的链接时)。有想法吗?
Fluxon 2012年

2

据我所知,您无法使整个操作系统理解http:+域URL。您只能注册新方案(我x-darkslide:在我的应用中使用)。如果已安装该应用程序,则Mobile Safari将正确启动该应用程序。

但是,您必须处理未使用“仍然在这里?单击此链接从iTunes下载应用程序”的应用程序的情况。在您的网页中。


2
这不再是正确的:与iOS9和最新的Android版本,您可以注册您的应用程序侦听特定http的URL
塞弗林

0

检查User-Agent,如果是Mobile Safari,请打开myprotocol:// URL(尝试)以打开iPhone应用程序,并打开Mobile iTunes以下载该应用程序,以防尝试失败

这对我来说听起来是一种合理的方法,但是我认为您无法将它作为打开第二个手段来打开移动iTunes的途径。我认为您必须选择一个或另一个-重定向到您的应用程序或iTunes。

即,如果您重定向到myprotocol://,并且该应用程序不在手机上,则您将没有第二次机会重定向到iTunes。

您也许可以先重定向到(经过iphone优化的)登录页面,并为用户提供选择以单击进入您的应用程序的选项,或者选择是否可以通过iTunes获得该应用程序(如果他们没有)?但是,您将依靠用户在此处执行正确的操作。(编辑:尽管您可以设置Cookie,但这只是第一次?)


1
那就错了 如果显示错误提示无法打开页面(未安装应用程序),则JS仍将执行。因此,您可以重定向到另一个后备解决方案。
Erik 2010年

0

在试图解决弹出问题时,我发现Apple有解决此问题的方法。

实际上,当您单击此链接时,如果您安装了该应用程序,则会将其重新路由到该链接;否则,您将被重定向到该网页,而不会弹出任何窗口。


3
我深入研究了该链接的工作方式,我能想到的最好的一点是,它根本不是JavaScript解决方案。苹果似乎已经为其应用程序注册了特殊的URL处理程序,该处理程序不需要自定义协议,而是在URL字符串上进行了一些匹配。您发送的链接会立即通过303重定向到here。如果您通过电子邮件将该链接发送给自己,则可以观察到单击该链接将直接打开AppStore应用程序(如果已安装)
Casey

很有意思。您是对的:如果我单击它,它会弹出AppStore应用程序(如果已安装)。但是,如果您删除一些参数,直到“ holydays”,它将在Safari中显示。苹果可以注册特殊的URL方案...
Titignes

@Titignes,请您详细说明如何打开应用程序或网页。构建此类网址的模式是什么?
安德烈·申德
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.