【问题标题】:How to open a native iOS app from a web app如何从 Web 应用程序打开原生 iOS 应用程序
【发布时间】:2012-05-01 11:54:26
【问题描述】:

总结 我想从存储在主屏幕上的网络应用程序启动一个具有正确运行的 URL 方案的应用程序,但正常的 JavaScript 重定向方法似乎不起作用.

详细信息 我正在尝试创建一个 iOS 网络应用程序,它可以通过保存在主屏幕上的链接以全屏模式打开。 Web 应用需要打开特定的原生应用。我已经为本机应用程序注册了 url 方案,并验证了它是否正常工作 - 例如,我可以通过直接在我的 Safari 地址栏中键入方案来打开本机应用程序。我也可以使用UIApplication+openURL: 方法从其他应用程序中打开它。我还想使用可以添加到主屏幕的本机网络应用程序的某些参数打开它。

我正在尝试在原生应用程序中使用 JavaScript:

window.location = "myapp://myparam";

在网络应用程序中使用此代码时,我收到一条警报:

“无法打开 myWebAppName - myWebAppName 无法打开。 错误是“无法显示此 URL”。

在 Safari 中执行时,同样的 javascript 可以正常工作。我使用window.location.replace("myapp://myparam") 得到了相同的结果。

网页应用的 html 是:

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN"
   "http://www.w3.org/TR/html4/strict.dtd">

<html lang="en">
<head>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
    <title>untitled</title>
    <meta name="generator" content="TextMate http://macromates.com/">
    <meta name="author" content="Carl Veazey">
    <!-- Date: 2012-04-19 -->
    <meta name="viewport" content="width=device-width; initial-scale=1.0; maximum-scale=1.0; user-scalable=0;" />
    <meta name="apple-mobile-web-app-capable" content="yes" />
    <meta names="apple-mobile-web-app-status-bar-style" content="black-translucent" />
</head>
<body>
    <script type="text/javascript" charset="utf-8">
        if (window.navigator.userAgent.indexOf('iPhone') != -1) {
            if (window.navigator.standalone == true) {
                window.location = "myapp://myparam";
            } else {
                document.write("please save this to your home screen");
        };} else {
                alert("Not iPhone!");
                document.location.href = 'please-open-from-an-iphone.html';
        };
    </script>
</body>
</html>

我在这里做错了什么?我对 javascript 和移动网络非常缺乏经验,所以我怀疑我只是遗漏了一些明显的东西。

【问题讨论】:

  • 你不能重定向到应用商店链接吗?
  • 对不起,你到底是什么意思?比如我可以从我的网络应用打开应用商店吗?编辑:例如,我可以打开本地地图应用程序;我怀疑该方案使用 http 是为什么它有效。不幸的是,这不适用于我的应用程序。
  • 所以在 url 栏中输入 myapp://myparam 有效吗?
  • @c0mrade 不会做太多。他正在尝试打开本机应用程序。不在 iTunes 上打开应用程序的页面。如果用户被重定向到 App Store 链接,他们将被进一步定向到 iDevice 上 iTunes 中的应用程序页面......它不会打开应用程序本身。
  • 嗯,还以为是参数问题。很奇怪,我之前使用过 window.location 没有任何问题。你试过 window.open(myapp://myparam)

标签: javascript ios mobile-safari


【解决方案1】:

为了提供更新,iOS14 Beta7 似乎没有通过其注册的 x-callback URL 打开任何本地应用程序。 ?

【讨论】:

    【解决方案2】:

    这样试试: 索引页

    <html><head></head><body>
    <?php
    $app_url = urlencode('YourApp://profile/blabla');
    $full_url = urlencode('http://yoursite.com/profile/bla');
    ?>   
    
    <iframe src="receiver.php?mylink1=<?php echo $app_url;?>" width="1px" height="1px" scrolling="no" frameborder="0"></iframe>
    <iframe src="receiver.php?mylink2=<?php echo $full_url;?>" width="1px" height="1px" scrolling="no" frameborder="0"></iframe>
    
    </body>
    </html>
    

    receiver.php 页面:

    <?php if ($first == $_GET['mylink1'])) { ?>
       <script type="text/javascript">
       self.window.location = "<?php echo $first;?>"; 
       </script>
    
    <?php } if ($second == $_GET['mylink2'])) { ?>
       <script type="text/javascript">
       window.parent.location.href = "<?php echo $second ;?>"; 
       //window.top.location.href=theLocation;
       //window.top.location.replace(theLocation);
       </script>
    <?php } ?>
    

    【讨论】:

      【解决方案3】:

      如果您需要打开已安装的 iOS 应用程序并且还想保留页面的功能,则 location.href = 'myapp://?params=...'; 将无济于事,因为如果未注册 myapp://,重定向会将用户引导到无法访问的目的地。

      最安全的选择似乎是使用iframe。如果安装了 iOS 应用,则以下代码将打开它,如果没有安装,则不会导致失败(尽管它可能会提醒用户,如果未安装该应用,则无法访问该页面):

      var frame = document.createElement('iframe');
      frame.src = 'myapp://?params=...';
      frame.style.display = 'none';
      document.body.appendChild(frame);
      
      // the following is optional, just to avoid an unnecessary iframe on the page
      setTimeout(function() { document.body.removeChild(frame); }, 4);
      

      【讨论】:

      • 在浏览器上工作,但在电子邮件客户端浏览器上使用时,这不起作用
      【解决方案4】:
      <?php 
      // Detect device type
      $iPod = stripos($_SERVER['HTTP_USER_AGENT'],"iPod");
      $iPhone = stripos($_SERVER['HTTP_USER_AGENT'],"iPhone");
      
      // Redirect if iPod/iPhone
      if( $iPod || $iPhone ){
          header('Location:http://example.com');      
      }
      ?>
      

      如果设备是 iPod 或 iPhone,以上内容会将浏览器重定向到输入的 URL (http://example.com/)。将脚本添加到 Web 应用的顶部,确保将其保存为 .php 文件而不是 .html

      来源: http://www.schiffner.com/programming-php-classes/php-mobile-device-detection/

      【讨论】:

      • 对不起,如果我没有说清楚。我已经完成了那部分 - 现在我需要使用 javascript 从保存在主屏幕上的网络应用程序打开我的应用程序。我想我会改写我的问题。
      • 粘贴你的 JS / HTML 会有帮助
      • 它是一个网络应用程序,它被保存在主屏幕上应该没有任何区别,只要 URL 格式正确,您的应用程序应该打开吗?或者您是否正在努力使用 JS 进行重定向?如果是这样,一个简单的 JS header.location="URL" 就足够了。我不确定这是否是你所追求的。
      • 在您的手机上转到jsfiddle.net/W9Wp2/1,使用您的特定字符串打开,点击运行,看看它是否有效。我感觉你的 JS/HTML 不正确。
      • @RyanBrodie 是的,我正在努力使用 JS 进行重定向。我会试试的。
      【解决方案5】:

      如果您的代码在移动 Safari 中有效,但如果它来自 iOS 桌面上的书签则无效。以前从来没有这样尝试过,但这就是问题所在。如果我只是将您的 JS 设置为

      <script type="text/javascript" charset="utf-8"> 
      window.location = "myapp://myparam";
      </script>
      

      它可以在浏览器中运行,但是当添加书签时它会失败。由于没有 chrome,它可能必须与 url 在其书签时如何加载有关?我的猜测是苹果不希望预订标记页面访问本地应用程序。另外,我注意到,如果我为本地托管的页面添加书签,该页面适用于移动 Safari,我无法通过书签加载它。真的很奇怪....

      我给你的最好建议是做它

      <meta name="apple-mobile-web-app-capable" />
      

      而不是

      <meta name="apple-mobile-web-app-capable" content="yes" />
      

      这样它就会出现在主屏幕上,但不幸的是会与 chrome 一起加载。这是我能想到的唯一解决方案。

      【讨论】:

      • 谢谢,但我怎样才能有条件地执行我的 javascript?我有那个检查用户代理的 if 语句,因为我希望从 Safari 导航到与从主屏幕启动时相同的页面行为不同。你知道另一种检查方法吗?谢谢!
      • window.navigator.standalone 是我所知道的唯一方法,它只有在 content="yes" 启用时才有效。不确定它是否可以做你想做的事。我可以看到 Apple 故意不允许开发人员制作启动另一个应用程序的主页按钮。这有点令人困惑,因为他们应该只是单击应用程序而不是加载应用程序的网页。
      猜你喜欢
      • 2012-04-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-08-01
      • 1970-01-01
      • 1970-01-01
      • 2017-08-19
      • 1970-01-01
      相关资源
      最近更新 更多