浏览器判断是否安装了ios/android客户端程序

分类: iPhone 编程2013-08-26 10:38 1851人阅读 评论(2) 收藏 举报

最近在做一个项目,该项目的前身是为mobile browser量身打造的一个网站。现在有这样一个需求:

当用户在用mobile browser浏览该网站的时候会点击一个按钮/超链接,通过这个按钮的点击事情需要打开安装在本机的应用程序,或者如果本机没有安装该应用程序则打开应用商店并打开该程序在商店中的搜索结果页面。

刚开始的时候iPhone team的人给出一个solution,下面是实施跳转的HTML + javascript源代码。

[html] view plaincopyprint?

  1. <html>
  2. <head>
  3. <meta name="viewport" content="width=device-width" />
  4. </head>
  5. <body>
  6. <h2><a id="applink1" href="mtcmtc://profile/116201417">Open scheme(mtcmtc) defined in iPhone with parameters </a></h2>
  7. <h2><a id="applink2" href="unknown://nowhere">open unknown with fallback to appstore</a></h2>
  8. <p><i>Only works on iPhone!</i></p>
  9. <script type="text/javascript">
  10. // To avoid the "protocol not supported" alert, fail must open another app.
  11. var appstore = "itms://itunes.apple.com/us/app/facebook/id284882215?mt=8&uo=6";
  12. function applink(fail){
  13. return function(){
  14. var clickedAt = +new Date;
  15. // During tests on 3g/3gs this timeout fires immediately if less than 500ms.
  16. setTimeout(function(){
  17. // To avoid failing on return to MobileSafari, ensure freshness!
  18. if (+new Date - clickedAt < 2000){
  19. window.location = fail;
  20. }
  21. }, 500);
  22. };
  23. }
  24. document.getElementById("applink1").onclick = applink(appstore);
  25. document.getElementById("applink2").onclick = applink(appstore);
  26. </script>
  27. </body>
  28. </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

[html] view plaincopyprint?

  1. <activity android:name=".ui.UploadActivity" android:screenOrientation="portrait">
  2. <intent-filter>
  3. <data android:scheme="http" android:host="192.168.167.33" android:port="8088" android:path="/mi-tracker-web/download.html"/>
  4. <action android:name="android.intent.action.VIEW" />
  5. <category android:name="android.intent.category.DEFAULT" />
  6. <category android:name="android.intent.category.BROWSABLE" />
  7. </intent-filter>
  8. </activity>

HTML页面中指向该应用程序的hyperlink

[html] view plaincopyprint?

  1. <a id="applink1" href="http://192.168.167.33:8088/mi-tracker-web/download.html">
  2. 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的东西。

[html] view plaincopyprint?

  1. <%@ page language="java" contentType="text/html; charset=ISO-8859-1"
  2. pageEncoding="ISO-8859-1"%>
  3. <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
  4. <html>
  5. <head>
  6. <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
  7. <title>Insert title here</title>
  8. </head>
  9. <body>
  10. <script type="text/javascript">
  11. <span style="white-space:pre">    </span>window.location="market://search?q=com.singtel.travelbuddy.android";
  12. </script>
  13. </body>
  14. </html>

唉,文笔不行,估计我写出来自己都不怎么看得懂。就再把跳转的关键点说一下:

在androidManifest.xml中定义intent-filter的时候定义的scheme,host,port,path拼凑起来是一个有用的HTTP路径,这样就算本机没有activity定义了intent-filter来捕获这个链接,那这个链接也会重定向到打开android market place的页面,继而打开应用商店。因为每个android手机都会捕获到market这个协议(如果android手机里面没有market商店,不怪我哈),系统就会自动打开market place应用商店并根据参数进入搜索页面并显示结果。

时间: 2024-10-19 00:40:48

浏览器判断是否安装了ios/android客户端程序的相关文章

浏览器判断检测手机中是否安装了ios/android客户端程序

分类: iPhone 编程2013-08-26 10:38 1851人阅读 评论(2) 收藏 举报 最近在做一个项目,该项目的前身是为mobile browser量身打造的一个网站.现在有这样一个需求: 当用户在用mobile browser浏览该网站的时候会点击一个按钮/超链接,通过这个按钮的点击事情需要打开安装在本机的应用程序,或者如果本机没有安装该应用程序则打开应用商店并打开该程序在商店中的搜索结果页面. 刚开始的时候iPhone team的人给出一个solution,下面是实施跳转的HT

js判断是否是PC,IOS,Android客户端

写在前面 在项目中使用html5,需要针对不同的客户端浏览器有不一样的处理方式,这就需要对请求中的useragent进行分析,并进行处理. 一个例子 <%@ Page Language="C#" AutoEventWireup="true" CodeBehind="Default.aspx.cs" Inherits="Wolfy.RedirectDemo.Default" %> <!DOCTYPE html&

浏览器网页判断手机是否安装IOS/Android客户端程序

IOS 原理如下: 为HTML页面中的超链接点击事件增加一个setTimeout方法. 如果在iPhone上面500ms内,本机有应用程序能解析这个协议并打开程序,则这个回调方法失效: 如果本机没有应用程序能解析该协议或者500ms内没有打开个程序,则执行setTimeout里面的function,就是跳转到apple的itunes. <html> <head> <meta name="viewport" content="width=devic

基于XMPP的IOS聊天客户端程序(XMPP服务器架构)

最近看了关于XMPP的框架,以文本聊天为例,需要发送的消息为: <message type="chat" from="[email protected]" to="[email protected]">          <body>helloWord</body>      </message> 基中from是从哪个用户发送的消息,to是发给谁的消息,XMPP的用户都是以邮箱形式.body就是我们

[iPhone高级] 基于XMPP的IOS聊天客户端程序(IOS端一)

介绍完了服务器,这篇我们就要介绍重点了,写我们自己的IOS客户端程序 先看一下我们完成的效果图 首先下载xmppframework这个框架,下载 点ZIP下载 接下来,用Xcode新建一个工程 将以下这些文件拖入新建工程中 加入framework 并设置 到这里我们就全部设好了,跑一下试试,看有没有错呢 如果没有错的话,我们的xmppframework就加入成功了. 我们设置我们的页面如下图: 我们的KKViewController.h [java]  view plain copy # imp

Gradle Android客户端程序打包

一.前言 android客户端开发进入尾声,负责SEO同事突然发给我一个涉及45个发布渠道的噩耗,之前只发布自有渠道的工作方式已经不满足需求,所以引入最近比较流行的gradle打包技术. gradle基于groovy语言,引入的原因也方便了以后从现在使用的eclipse开发环境迁移到Android Studio,所以blablabla……,不多说了,先上代码. 二.简单项目Gradle打包脚本配置 buildscript { repositories { jcenter() } dependen

基于XMPP的IOS聊天客户端程序(IOS端一)

介绍完了服务器,这篇我们就要介绍重点了,写我们自己的IOS客户端程序先看一下我们完成的效果图 首先下载xmppframework这个框架, 点ZIP下载 接下来,用Xcode新建一个工程 将以下这些文件拖入新建工程中 加入framework 并设置 到这里我们就全部设好了,跑一下试试,看有没有错呢 如果没有错的话,我们的xmppframework就加入成功了. 我们设置我们的页面如下图: 我们的KKViewController.h #import <UIKit/UIKit.h>    @int

安卓手机浏览器判断是否安装了android客户端程序

android项目里面androidManifest.xml文件对activity的配置如下: <activity android:name=".MainActivity" android:screenOrientation="portrait">       <intent-filter>            <data android:scheme="http" android:host="192.1

通过js自动判断移动终端设备(ios\android等)

当用户用移动设备扫描一个二维码是,将扫描后的链接链接到一个页面,该页面只包含判断移动终端设备的js,判断好后自动跳转到对应的链接 或下载对应的内容. html代码如下: 1 <script> 2 var browser = { 3 versions: function() { 4 var u = navigator.userAgent, app = navigator.appVersion; 5 return {//移动终端浏览器版本信息 6 trident: u.indexOf('Tride