【发布时间】:2010-10-12 06:59:39
【问题描述】:
有什么方法可以检查当前是否在手机上注册了一个 URL 方案...使用 javascript?
【问题讨论】:
-
我发现这里发布的解决方案效果更好:stackoverflow.com/questions/6964515/…
标签: javascript iphone safari url-scheme
有什么方法可以检查当前是否在手机上注册了一个 URL 方案...使用 javascript?
【问题讨论】:
标签: javascript iphone safari url-scheme
不是无缝的。 但是有一种方法类似于检查弹出窗口是否被阻止。
当您尝试不支持的 URL 方案时,Safari 会警告用户它不知道如何处理它并停留在同一页面上。
因此,如果您给应用调用一些时间来激活,例如 300 毫秒,然后执行其他操作来响应该方案的不存在。
这不是最漂亮的,但它确实有效:
function startIThrown(){
document.location = 'ithrown://restart';
setTimeout(function(){
if(confirm('You do not seem to have iThrown installed, do you want to go download it now?')){
document.location = 'http://itunes.apple.com/WebObjects/MZStore.woa/wa/viewSoftware?id=293049283&mt=8&uo=6';
}
}, 300);
}
<a href="#" onclick="startIThrown()">Restart iThrown</a>
【讨论】:
这是一个解决方案,当您从应用程序返回时不显示弹出窗口,它假设您离开的时间超过 400 毫秒:
function startiThrown() {
document.location = appurl;
var time = (new Date()).getTime();
setTimeout(function(){
var now = (new Date()).getTime();
if((now - time)<400) {
if(confirm('You do not seem to have iThrown installed, do you want to go download it now?')){
document.location = 'http://itunes.apple.com/WebObjects/MZStore.woa/wa/viewSoftware?id=293049283&mt=8&uo=6';
}
}
}, 300);
}
【讨论】:
我发现pagehide 事件比依赖系统时间更强大。对于我们这些喜欢非 jQuery 的人来说,这里是 sn-p。
var appurl = 'custom://url';
var appstore = 'https://itunes.apple.com/us/app/your-app';
var timeout;
function preventPopup() {
clearTimeout(timeout);
timeout = null;
window.removeEventListener('pagehide', preventPopup);
}
function startApp() {
window.location = appurl;
timeout = setTimeout(function(){
if(confirm('You do not seem to have the App installed, do you want to go download it now?')){
document.location = appstore;
}
}, 1000);
window.addEventListener('pagehide', preventPopup);
}
【讨论】:
confirm 函数将被执行。
从 iOS 6.0 开始,Apple 推出了智能应用横幅,它可以满足我们大多数人的需求:
包括以下元标记:
<meta name="apple-itunes-app" content="app-id=myAppStoreID, affiliate-data=myAffiliateData, app-argument=myURL">
取自这里: Safari Web Content Guide
【讨论】:
另一个很好的(至少在最新的浏览器版本中工作)解决方法是检查浏览器窗口在短暂超时后是否有焦点,这样只有当 URI 方案不起作用时,您才能向用户显示一个对话框
HTML:
<a class="uri-link" data-uri="qobuzapp://" href="#">URI</a>
Javascript(这里使用 jQuery):
var windowHasFocus;
$(window).focus(function() {
windowHasFocus = true;
}).blur(function() {
windowHasFocus = false;
});
function goToUri(uri) {
window.location = uri;
setTimeout(function(){
if (windowHasFocus) {
if (confirm('You do not seem to have Qobuz installed, do you want to go download it now?')){
window.location = 'http://www.qobuz.com';
}
}
}, 100);
}
$('a').on('click', function(){
goToUri($(this).data('uri'));
});
【讨论】:
confirm 函数将被执行。
不,不是来自网页。
【讨论】:
这是前 2 个解决方案的变体。它将创建一个可以在 Google Chrome 中打开的链接。如果失败,它会使用 http
打开链接<script>
function checkChrome(h){
document.location=h;
var time = (new Date()).getTime();
setTimeout(function(){
var now = (new Date()).getTime();
if((now-time)<400) {
if(confirm('Missing Chrome. Download it now?')){
document.location = 'http://itunes.apple.com/us/app/chrome/id535886823?mt=8';
} else {
document.location=h.replace('googlechrome','http');
}
}
}, 300);
}
</script>
<a href="googlechrome://www.google.com" onclick="checkChrome(this.href);return false;">Open Google with Chrome</a>
【讨论】:
这是基于 mrahman 的回答。如前所述,JoshNaro new Date() 在超时内调用时会返回错误的日期。测试表明,在停用应用程序之前启动的线程中,日期没有更新。
激活后调用的更丑陋的 setTimeout 将使用当前日期创建一个新线程。
这是在 iOS 8 上测试的。
function startiThrown() {
document.location = appurl;
var time = (new Date()).getTime();
setTimeout(function(){
setTimeout(function(){ // <-- start new thread after activation
var now = (new Date()).getTime();
if((now - time)<400) {
if(confirm('You do not seem to have iThrown installed, do you want to go download it now?')){
document.location = 'http://itunes.apple.com/WebObjects/MZStore.woa/wa/viewSoftware?id=293049283&mt=8&uo=6';
}
}
}, 10); // <-- start new thread after activation
}, 300);
}
【讨论】:
我尝试只使用 'pagehide' 事件,但它不适用于 Firefox。我在这里创建了这个版本http://jsfiddle.net/thiagomata/6tvoc4f1/2/,它适用于 Firefox、Google Chrome 和 Safari。我还没有在 Internet Explorer 中测试过。
让它在 Firefox 中运行的必要条件是使用 Iframe 设置 src。这使我可以在不离开页面的情况下调用应用程序。
<a class="uri-link" href="#"
data-uri-app="myapp://"
data-url-app-not-found="http://www.google.com?q=not-found-link"
>
Example 1
</a>
<a class="uri-link" href="#"
data-uri-app="myapp://"
data-url-app-not-found="http://www.google.com?q=not-found-link"
data-url-app-found="http://www.google.com?q=found-link"
>
Example 2
</a>
<a class="uri-link" href="#"
data-uri-app="notexists://"
data-url-app-not-found="http://www.google.com?q=not-exists"
>
Example 3
</a>
<iframe id="callapp" style="display:none"></iframe>
【讨论】:
我有这个评论 https://stackoverflow.com/a/18715513/49114 带有一个 jQuery 插件,可以将替代应用链接添加到常规链接。
【讨论】: