【问题标题】:Load iOS 'smart app banner' through JavaScript通过 JavaScript 加载 iOS 的“智能应用横幅”
【发布时间】:2015-09-26 04:16:51
【问题描述】:

我在使用 iOS Smart App Banner 时遇到了一些问题,我正在尝试通过 JavaScript 添加它。

实际的 smartbanner 就像在 HTML 的头部添加这个小块一样简单:

<meta name="apple-itunes-app" content="app-id=375380948">

很遗憾,我上传脚本的方式非常有限。我不能直接更改 HTML,所以我将通过我们的跟踪代码管理器来完成,它基本上是通过 JavaScript 来完成的。但事实证明这是行不通的。

我试图简化测试用例:

  1. HTML 中的硬编码标记:works(如预期)

     <meta name="apple-itunes-app" content="app-id=375380948">
    
  2. 文档准备好后直接用 JavaScript 插入:works

     $(document).ready(function(){
         $("head").append('<meta name="apple-itunes-app" content="app-id=375380948">');
     });
    
  3. 使用 JavaScript 插入,在 @​​987654332@ 延迟后:DOES NOT WORK

     $(document).ready(function(){
         setTimeout(showBanner, 1);  //after 1 millisecond
     });
    
     function showBanner(){
         $("head").append('<meta name="apple-itunes-app" content="app-id=375380948">');
     }
    

谁能确认或解释为什么这个延迟的 JavaScript 不起作用?

重要提示:用于测试在实际 iOS 设备上打开页面! 桌面 Safari/Chrome 或 iOS 模拟器将无法工作。 另外,不要关闭横幅,因为它不会再次显示。

更新:

我添加了一些没有 jQuery 的示例,所以很简单的 'ol JavaScript。但结果是一样的。一旦我们等待setTimeout(),智能应用横幅就无法加载。

  1. Vanilla JavaScript - 直接执行。 works

    showBanner();
    
    function showBanner() {
        var meta = document.createElement("meta");
        meta.name = "apple-itunes-app";
        meta.content = "app-id=375380948";
        document.head.appendChild(meta);
    }
    
  2. Vanilla JavaScript - 延迟执行。 DOES NOT WORK

    setTimeout(showBanner, 1);
    
    function showBanner() {
        var meta = document.createElement("meta");
        meta.name = "apple-itunes-app";
        meta.content = "app-id=375380948";
        document.head.appendChild(meta);
    }
    

更新 2:

在异步加载脚本时可以观察到完全相同的不幸行为

  1. 异步加载。 DOES NOT WORK

    <script src="async.js" async></script>
    

    然后调用相同的原生 JavaScript 并直接执行 显示横幅();

    function showBanner() {
        var meta = document.createElement("meta");
        meta.name = "apple-itunes-app";
        meta.content = "app-id=375380948";
        document.head.appendChild(meta);
    }
    

结论:

我只能得出结论,iOS Safari 只在主线程中寻找智能横幅 HTML。这让我很难过:-(

仅直接可用的 HTML,或通过 JavaScript 同步添加的 HTML。 但是不允许异步操作,无论是异步加载 JavaScript,还是使用 setTimeout()(或其他使用 eval() 的构造)

【问题讨论】:

  • 我也遇到了同样的问题。我有一个单页应用程序,我不希望应用程序下载在加载时显示,因为有一个表单我们不希望人们过去。在他们填写表格后,已经有一个带有常规下载按钮的页面,但客户也想要这个横幅。如果有人知道添加的这个对象的 Id 或类名,那就太好了,这样我就可以在加载时隐藏它,然后再显示它。我的 safari 版本是
  • 看起来您的示例中的app-id 可能已过时?您的“Vanilla JavaScript - 直接执行”。看起来正是我需要的。但是,在 iPhone 12 上进行测试时,我看到横幅在 Safari 中暂时闪烁空白,而在 Chrome 中什么也没有(这实际上只是我了解到的 iOS 引擎盖下的 Safari)。无论如何,如果可能的话,也许您可​​以更新到某个不太可能被删除的应用程序?
  • @GregVenech,我刚刚用简单的查找和替换更新了所有示例,因为该应用程序 ID 确实很旧。它现在链接到 Apple 的 Apple Store 应用程序。 apps.apple.com/nl/app/apple-store/id375380948?l=en 还没有运行任何新的测试,让我知道它是如何为你工作的。

标签: javascript ios mobile-safari smartbanner


【解决方案1】:

由于如果在页面加载后插入 safari 就不可能显示原生横幅(如上测试,Apple 为 confirmed),唯一可行的解​​决方法是不使用原生 smartbanner,而是创建你自己的。

例如使用像this这样的javascript插件

【讨论】:

    【解决方案2】:

    自 2017 年 4 月起,如果稍后通过 JavaScript 添加智能横幅,则会显示。

    【讨论】:

    • 您是否有任何文档可以链接以支持此答案?根据我的实验,这是行不通的。
    • @DavidV 不,我在一个客户项目上工作,我只是通过反复试验。如果它对您的测试有帮助,我会在用户单击事件期间添加横幅(基本上在入职流程期间单击“下一步”按钮期间显示横幅)。顺便说一句,这是 iOS 11 之前的版本。
    • 对我也不起作用...我正在尝试根据某些路由条件添加横幅..但它没有显示出来..
    • 对我不起作用。尝试将元标记附加到头部元素,横幅没有出现.. :(
    • 对我来说,它在删除网站和数据(包括 cookie)后有效,如果我仅删除该网站步骤-> 设置-> safari-> 清除历史记录和网站数据,则无效
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-06-23
    • 2017-02-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多