android/iPhone:如何从browser直接打开应用程序或者打开应用商店(如果没有应用程序)
最近在做一个项目,该项目的前身是为mobile browser量身打造的一个网站。现在有这样一个需求:
当用户在用mobile browser浏览该网站的时候会点击一个按钮/超链接,通过这个按钮的点击事情需要打开安装在本机的应用程序,或者如果本机没有安装该应用程序则打开应用商店并打开该程序在商店中的搜索结果页面。
刚开始的时候iPhone team的人给出一个solution,下面是实施跳转的HTML + javascript源代码。
<html> <head> <meta name="viewport" content="width=device-width" /> </head> <body> <h2><a id="applink1" href="mtcmtc://profile/116201417">Open scheme(mtcmtc) defined in iPhone with parameters </a></h2> <h2><a id="applink2" href="unknown://nowhere">open unknown with fallback to appstore</a></h2> <p><i>Only works on iPhone!</i></p> <script type="text/javascript"> // To avoid the "protocol not supported" alert, fail must open another app.var appstore = "itms://itunes.apple.com/us/app/facebook/id284882215?mt=8&uo=6";function applink(fail){return function(){var clickedAt = +new Date;// During tests on 3g/3gs this timeout fires immediately if less than 500ms.setTimeout(function(){// To avoid failing on return to MobileSafari, ensure freshness!if (+new Date - clickedAt < 2000){window.location = fail;}}, 500); };}document.getElementById("applink1").onclick = applink(appstore);document.getElementById("applink2").onclick = applink(appstore);</script> </body>
</html>
其原理就是为HTML页面中的超链接点击事件增加一个setTimeout方法.
如果在iPhone上面500ms内,本机有应用程序能解析这个协议并打开程序,则这个回调方法失效;如果本机没有应用程序能解析该协议或者500ms内没有打开个程序,则执行setTimeout里面的function,就是跳转到apple的itunes。
我用同样的原理来处理android的javascript跳转,发现如果本机没有程序注册intent-filter for 这个协议,那么android内置的browser就会处理这个协议并且立即给出反应(404,你懂的),不会像iPhone一样去执行setTimeout里面的function,即便你把500ms改成0ms也不管用。
我就开始了我的Google search之旅,最终在stackoverflow一个不起眼的地方找到solution。
不解释,先给出源代码
android里面androidManifest.xml文件对activity的配置,如何配置就不表述了,表达能力有限,请参考developer.android.com
<activity android:name=".ui.UploadActivity" android:screenOrientation="portrait"><intent-filter><data android:scheme="http" android:host="192.168.167.33" android:port="8088" android:path="/mi-tracker-web/download.html"/><action android:name="android.intent.action.VIEW" /><category android:name="android.intent.category.DEFAULT" /><category android:name="android.intent.category.BROWSABLE" /></intent-filter></activity>
HTML页面中指向该应用程序的hyperlink
<a id="applink1" href="http://192.168.167.33:8088/mi-tracker-web/download.html">Open Application</a>
不难发现,在androidManifest.xml中配置的filter中data的属性表述,在下面的HTML.href中全部看到了。请注意,这两个路径要全部一致,不能有差别,否则android系统就不会拦截这个hyperlink。
好了,为什么我说这个solution能解决我们当初提出来的需求呢,答案在这里:
如果说本机安装了这个应用程序
在android browser中点击HTML中的applink1,browser会重定向到指定的链接,但是由于我们的应用程序在android OS中配置了一个intent-filter,也是针对这个制定的链接。就是说现在android系统有两个程序能处理这个链接:一个是系统的browser,一个是配置了intent-filter的activity。现在点击这个链接,系统就会弹出一个选择:是用browser还是你指定的activity打开。如果你选择你的activity,系统就会打开你的应用程序,如果你继续选择用browser,就没有然后了。
如果说本机木有安装这个应用程序
那么这个HTML里面的这个超链接就起很重要的左右了,这个download.html里面可以forward到android的应用商店
download.jsp源代码如下。具体为什么请求的是download.html这个地址却访问到了download.jsp,就不解释了,struts2的东西。
<%@ page language="java" contentType="text/html; charset=ISO-8859-1"pageEncoding="ISO-8859-1"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<title>Insert title here</title>
</head>
<body><script type="text/javascript">
window.location="market://search?q=com.singtel.travelbuddy.android";</script>
</body>
</html>
唉,文笔不行,估计我写出来自己都不怎么看得懂。就再把跳转的关键点说一下:
在androidManifest.xml中定义intent-filter的时候定义的scheme,host,port,path拼凑起来是一个有用的HTTP路径,这样就算本机没有activity定义了intent-filter来捕获这个链接,那这个链接也会重定向到打开android market place的页面,继而打开应用商店。因为每个android手机都会捕获到market这个协议(如果android手机里面没有market商店,不怪我哈),系统就会自动打开market place应用商店并根据参数进入搜索页面并显示结果。
如果有什么写得不好的地方或者有更好的方法,希望大家拿出来分享。For you, for me, for everybody.
android/iPhone:如何从browser直接打开应用程序或者打开应用商店(如果没有应用程序)相关推荐
- android 浏览器打开应用商店,android/iPhone:如何从browser直接打开应用程序或者没有应用程序打开应用商店...
当用户在用mobile browser浏览该网站的时候会点击一个按钮/超链接,通过这个按钮的点击事情需要打开安装在本机的应用程序,或者如果本机没有安装该应用程序则打开应用商店并打开该程序在商店中的搜索 ...
- android/iphone/windows/linux声波通讯库
声波通讯让传统的各种linux设备,单片机设备等等能编程的设备与智能手机之间有了数据传输的能力,这在智能家居.医疗设备.工业应用等各个行业有了大力应用的机会. 声波通讯让电脑与手机连通:电脑一般都有音 ...
- android手机照片传苹果电脑版,为知笔记Android/iPhone客户端图片传到电脑客户端的方法介绍...
为知笔记是一款时下流行的支持多平台的云笔记软件,随时随地记录和查看有价值的信息,非常方便.当我们在用为知笔记电脑客户端编辑笔记时,常有从手机相册中取图片素材的需求,下面小编就来教教大家为知笔记手机传图 ...
- android/iphone/windows/linux/微信声波通讯库
声波通讯让传统的各种linux设备,单片机设备等等能编程的设备与智能手机之间有了数据传输的能力,这在智能家居.医疗设备.工业应用等各个行业有了大力应用的机会. 声波通讯让电脑与手机连通:电脑一般都有音 ...
- iphone默认的heic格式怎么在电脑中打开
平时和朋友一起出去玩拍了很多的照片,回来想把照片传给小编的时候,发现打不开,搞了半天,原来是格式的问题,安卓和电脑经常用的是jpg或者png,而苹果的是heic,寻找了很多办法,还好最终是解决了,那i ...
- [Android]_[初级]_[sdk docs reference api 文档打开慢的解决办法]
此题正解:打开firefox, 选中菜单 File->Work Offline,之后打开api文档都是秒开了,缺点就是不能访问在线的网址. 默认菜单是隐藏的,可以移动到Tab页空白处右键Menu ...
- 如何在iPhone和iPad上的Safari中在后台打开链接
Safari lets you open links in a new tab on iPhone or iPad, but it immediately switches to that new t ...
- android手机怎样开启usb调试模式,Android手机USB调试在哪?安卓手机如何打开USB调试模式?...
Android手机USB调试在哪?安卓手机如何打开USB调试模式?如果我们要将安卓手机连接到电脑上,从而传输文件.下载应用或ROOT等,都需要打开手机的USB调试模式.安卓系统的版本有很多,它们的打开 ...
- 最新内测版Android qq,腾讯体验中心发布Android/iPhone QQ 6.5.3 测试版
腾讯体验中心又同时发布了Android/iPhone QQ 6.5.3测试版体验,上一个测试版同时发布于5月4日,时隔80多天迎来了新版升级,本次更新了按条件查找陌生人时可按年龄或职业筛选,全新短视频 ...
最新文章
- 把整个DIV变成超链接
- 数字字符串转化为字母组合的种数
- [106].从中序与后序遍历序列构造二叉树
- 计算机网络cr什么意思,现在网络上的“CR”是指什么意思
- quartus管脚分配后需要保存吗_电脑磁盘显示未分配怎么办?磁盘数据如何恢复?...
- Qt532.线程(_beginthread)
- 数据 3 分钟 | 《数据安全法》即将施行;ACM SIGMOD在西安举办;艾瑞咨询发布数据库行业报告...
- C# WinForm关闭窗体确认
- 【一分钟知识】七种损失函数
- java 对文件名非法字符处理
- 【286页干货】一天搞懂深度学习(台湾资料科学年会课程)李宏毅
- SQLAlchemy介绍
- python异步教程_Python开发异步任务Celery的使用教程!
- SpringBoot开发的java后台管理系统
- 996工作制,还要抽时间提升自己吗?
- Ubuntu系统将域名指向指定IP
- 部署搭建DNS服务器
- 实例011 阳阳买苹果
- 软考证书找工作有用吗?软考找工作用处大吗
- python3实现阿拉伯数字和中文数字转换
热门文章
- “回文串”是一个正读和反读都一样的字符串,比如“level”或者“noon”等等就是回文串。花花非常喜欢这种拥有对称美的回文串,生日的时候她得到两个礼物分别是字符串A和字符串B。
- “回文串”是一个正读和反读都一样的字符串,比如“level”或者“noon”等等就是回文串。请写一个程序判断读入的字符串是否是“回文”。
- 医院三级综合医院网络安全设备介绍
- 高德地图map.add(marker),marker标记不显示
- html 初出茅庐-简单个人主页制作
- 企业级内部信息统一搜索解决方案
- 自监督学习效果差?Meta AI 提出 Q-score 快速过滤错误样本!
- 《炬丰科技-半导体工艺》旋涂玻璃材料的旋涂及烘烤
- html调用暴风影音,用暴风影音转换视频格式教程
- iOS开源资源汇总(完整项目,三方,博客,视频)长期更新