我在使用iOS Smart App Banner时遇到了一些问题,我试图通过JavaScript添加它。
实际的smartbanner很简单,只需将这个小块添加到HTML的头部:
<meta name="apple-itunes-app" content="app-id=375380948">
字符串
不幸的是,我在上传脚本的方式上受到了很大的限制。我不能直接更改HTML,所以我将通过我们的标记管理器来完成,它基本上是通过JavaScript来完成的。但事实证明,这并不起作用。
我试图简化测试的情况:
- HTML中的硬编码标记:works(如预期)
<meta name="apple-itunes-app" content="app-id=375380948">
型
1.当文档准备好时直接用JavaScript插入:works
$(document).ready(function(){
$("head").append('<meta name="apple-itunes-app" content="app-id=375380948">');
});
型
1.用JavaScript插入,经过setTimeout
延迟: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的示例,所以简单的JavaScript。但结果是一样的。只要我们等待setTimeout()
,智能应用程序横幅就无法加载。
- 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);
}
型
- 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>
型
然后直接执行showBanner()调用相同的普通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中的smartbanner。这让我很难过:(
只有直接可用的HTML,或通过JavaScript同步添加的HTML。但是不允许a-sync操作,无论是异步加载JavaScript,还是使用setTimeout()
(或其他使用eval()
的构造)
3条答案
按热度按时间j2datikz1#
由于safari不可能在页面加载后插入本机横幅(如上所述,以及apple的confirmed),因此唯一可行的解决方法是不使用本机smartbanner,而是创建自己的。
例如使用this这样的JavaScript插件
oknwwptz2#
我用了你的代码:
字符串
并在DOM就绪事件之前插入,它工作正常。
5cg8jx4n3#
自2017年4月起,如果稍后通过JavaScript添加,智能横幅将显示。