我遇到了iOS Smart App Banner的麻烦,我试图通过JavaScript添加。
实际的smartbanner就像将这个小块添加到HTML的头部一样简单:
<meta name="apple-itunes-app" content="app-id=1008622954">
不幸的是,我对上传脚本的方式非常有限。我无法直接更改HTML,因此我会通过我们的跟踪代码管理器完成此操作,代码管理器基本上是通过JavaScript实现的。但事实证明,这不起作用。
我试图简化测试案例:
HTML中的硬编码标记: works (按预期方式)
<meta name="apple-itunes-app" content="app-id=1008622954">
文档准备好后直接使用JavaScript插入: works
$(document).ready(function(){
$("head").append('<meta name="apple-itunes-app" content="app-id=1008622954">');
});
在setTimeout
延迟后使用JavaScript插入: DOES NOT WORK
$(document).ready(function(){
setTimeout(showBanner, 1); //after 1 millisecond
});
function showBanner(){
$("head").append('<meta name="apple-itunes-app" content="app-id=1008622954">');
}
任何人都可以确认或解释为什么延迟的JavaScript无效吗?
重要提示:测试在实际的iOS设备上打开页面! 桌面Safari / Chrome或iOS模拟器不起作用。 此外,不要关闭横幅,因为它不会再次出现。
更新:
我添加了一些没有jQuery的例子,所以简单的JavaScript。但结果是一样的。一旦我们等待setTimeout()
智能应用横幅无法加载。
Vanilla JavaScript - 直接执行。的 works
showBanner();
function showBanner() {
var meta = document.createElement("meta");
meta.name = "apple-itunes-app";
meta.content = "app-id=1008622954";
document.head.appendChild(meta);
}
Vanilla JavaScript - 延迟执行。的 DOES NOT WORK
setTimeout(showBanner, 1);
function showBanner() {
var meta = document.createElement("meta");
meta.name = "apple-itunes-app";
meta.content = "app-id=1008622954";
document.head.appendChild(meta);
}
更新2 :
异步加载脚本时可以观察到完全相同的不幸行为
异步加载。的 DOES NOT WORK
<script src="async.js" async></script>
然后通过直接执行调用相同的vanilla JavaScript showBanner();
function showBanner() {
var meta = document.createElement("meta");
meta.name = "apple-itunes-app";
meta.content = "app-id=1008622954";
document.head.appendChild(meta);
}
结论:
我只能得出结论,iOS Safari只在主线程中查找smartbanner和HTML。这让我很伤心: - (
只有直接可用的HTML或通过JavaScript同步添加的HTML。
但是,不允许进行同步操作,无论是异步加载JavaScript,还是使用setTimeout()
(或使用eval()
的其他构造)