当Android自定义URL scheme未处理时,如何回退到市场?
当Android自定义URL scheme未处理时,如何回退到市场?
我们有一个处理自定义URL scheme(vstream://)的应用程序。当有人访问一个包含vstream://内容的网页时,如果他们没有安装我们的应用程序,我们需要将他们重定向到商店。\n在iOS上,我们这样做:\n
setTimeout(function() { window.location = "itms://itunes.apple.com/us/app/kaon-v-stream/id378890806?mt=8&uo=4"; }, 25); window.location = "vstream:view?code=...stuff...";
\n如果`window.location`赋值失败,超时会在对话框弹出之前跳过App Store。(我在这里找到了这个技巧:Is it possible to register a http+domain-based URL Scheme for iPhone apps, like YouTube and Maps?)\n不幸的是,这个技巧在Android上不起作用。我们在服务器端检测设备并将itms:行替换为以下内容:\n
"market://details?id=com.kaon.android.vstream";
\n问题是,当您访问一个未处理的URL scheme时,iOS会抛出错误,而Android会转到一个生成的页面。因此,超时永远没有机会运行。\n在网页上是否有一种明确测试自定义URL scheme是否被处理的方法,或者有人可以提供一个在Android上能够工作的类似这样的hack?(当然,我想我需要一个不管他们使用什么浏览器都能工作的hack,这可能是一个很困难的要求...)\n更新:\n下面的方法在Nexus 7上的Jelly Bean上不起作用。新的Chrome浏览器不会转到生成的页面(所以不需要iFrame),但似乎没有办法知道URL scheme是否被处理。如果被处理,超时仍然会触发。如果没有被处理,超时会触发。如果我使用一个onload处理程序和一个iFrame,onload处理程序永远不会触发(无论应用程序是否安装)。如果我找到了如何知道scheme是否被处理的方法,我会更新的...\n我已经删除了先前解决方案的“已解决”。因为它不再起作用。\n更新2:\n我现在有一个很好的跨平台解决方案,适用于iOS、Android 4.1与Chrome以及Android的Chrome之前的版本。请参见下面...\n更新3:\nGoogle再次破坏了所有事情,使用了intents。看看我接受的amit_saxena提供的非常好的解决方案。
对于浏览器中的URL Scheme跳转,我们可以使用intent来实现。在Android中,我们可以使用intent来启动其他应用程序或者打开市场页面。下面是一个示例代码:
Take a QR code
上述代码会尝试启动一个名为"zxing"的应用程序,如果该应用程序已安装,则会打开该应用程序;如果该应用程序未安装,则会打开市场页面,并显示该应用程序的页面。
这是一个非常好的解决方案,可以在Android上实现。这种方法简单且被谷歌支持。如果iOS也有类似的解决方案就好了。
那么,在Android Chrome版本25之前的旧版浏览器会发生什么呢?
我也有同样的问题!
原因:当使用自定义URL scheme时,如果无法处理该scheme,Android设备会出现问题。在测试中发现,当使用window.location设置自定义URL scheme并打开时,浏览器仍在运行,但document.webkitHidden属性变为false。因此,可以通过测试该属性来确定是否已处理自定义URL scheme。
解决方法:根据不同的设备和浏览器,采用不同的处理方式。如果是Android设备且使用Chrome浏览器,则使用setTimeout函数延时1秒后判断document.webkitHidden属性,如果为false,则跳转至应用商店页面;如果是其他Android设备浏览器,则创建一个隐藏的iframe元素,设置其src为自定义URL scheme,并在1秒后判断是否跳转至应用商店页面;如果是iOS设备,则延时25毫秒后判断document.webkitHidden属性,如果为false,则跳转至App Store页面;如果是其他设备,则显示一个二维码。
此外,在iOS Chrome浏览器中可能会遇到问题,但这是已知的Bug,已在下一个版本中修复。
另外,对于Android设备的Chrome浏览器,Google建议使用新的"intent:" URL语法代替iframe。可以将"intent:" URL放在一个隐藏的标签中,并在文档的onload事件中调用click()函数来实现自动跳转。但是,这种方法似乎需要用户操作才能生效。
总结起来,通过判断document.webkitHidden属性和浏览器的类型,可以实现Android设备和iOS设备的自动跳转到应用商店页面或App Store页面。但需要注意的是,由于Google不断更改相关规则,以上解决方法可能无法保证长期有效。