精华内容
下载资源
问答
  • 浏览器唤起App

    千次阅读 2017-04-12 14:25:17
    浏览器唤起App

    现在的h5与Android原生的交互越来越多,为了提升用户的体验,想分享红包或者一些运营活动,都希望能够直接唤起原生的app,并跳转指定的页面。由于Android的浏览器较多,层次不齐,很难适配。下面我介绍的方法,经测试在chrome、uc、魅族自带的浏览器、搜狗浏览器、360浏览器、QQ浏览器、遨游浏览器、火狐浏览器都可适用,甚至可以直接在QQ里面打开,但是在百度浏览器上没有任何反应。

    服务端代码

    ~<!DOCTYPE html>    
    <html>    
    <body>    
    <a href="scheme://DIDI/startapp?test=test">启动应用程序</a>   
    </body>    
    </html>~  

    Android只需在AndroidManifest.xml文件里面为启动页面添加

    <intent-filter>
                    <action android:name="android.intent.action.VIEW" />
                    <category android:name="android.intent.category.DEFAULT" />
                    <category android:name="android.intent.category.BROWSABLE" />
                    <data
                        android:host="DIDI"
                        android:scheme="scheme" />
    </intent-filter>

    当应用启动时

    
    getIntent().getDataString();
    

    得到的的只就是scheme://DIDI/startapp?test=test,就可以通过得到的值,跳转到App的不同页面。

    唤起格式如下:

    <a href="[scheme]://[host]/[path]?[query]">启动应用程序</a> 

    scheme:调起app的标志

    host:与AndroidManifest里面的host保持一致

    展开全文
  • 1、Scheme的作用,浏览器唤起APP。 2、遇到的不生效问题原因及解决办法。

    此文章已收入Android偶遇杂症合集(持续更新)

    1、Scheme的作用,浏览器唤起APP

    常见在手机浏览器打开某个网站,会有个 App 内打开的按钮,点击直接打开APP且跳转到该详情页,用的基本都是Scheme。Scheme的基本使用如下:

    <activity android:name=".MainActivity">
        <!-- 需要添加下面的intent-filter配置 -->
        <intent-filter>
            ...
            <data
                android:scheme="myscheme"
                android:host="myhost"
                android:port="1024"
                android:path="/main" />
        </intent-filter>
    </activity>
    

    在web页面添加一个点击事件跳转:

    <a href="myscheme://myhost:1024/main?key1=value1&key2=value2">open app with Uri Scheme</a>
    

    被唤起的MainActivity中,可以在onCreate(APP未打开)和onNewIntent(APP已打开)方法中拿到跳转的链接:

    Intent intent = getIntent();
    if (null != intent && null != intent.getData()) {
        Uri uri = intent.getData();
        Log.e(TAG, "uri=" +uri);
        String scheme = uri.getScheme();
        String host = uri.getHost();
        int port = uri.getPort();
        String path = uri.getPath();
        String key1 = uri.getQueryParameter("key1");
        String key2 = uri.getQueryParameter("key2");
        Log.e(TAG, "scheme=" + scheme + ",host=" + host
                + ",port=" + port + ",path=" + path
                + ",query=" + uri.getQuery()
                + ",key1=" + key1 + ",key2=" + key2);
    }
    

    打印消息如下:

    uri=myscheme://myhost:1024/main?key1=value1&key2=value2
    scheme=myscheme,host=myhost,port=1024,path=/main,query=key1=value1&key2=value2,key1=value1,key2=value2
    

    2、遇到的不生效问题原因及解决办法

    在应用中增加了Scheme,兴致勃勃启动浏览器按下核弹发射按钮,结果气氛逐渐尴尬。。。

    问题出在哪呢?仔细比对了链接地址、AndroidManifest的配置,苍天啊,分明是一样的,令人崩溃!!!

    然后一个偶然的机会,用了AS自带的Android模拟器里的web test APP开启这个链接,打开了一个新的页面,显示了设置的链接地址,问题的原因找到了!!!

    我在web页面中设置的链接为MyScheme://MyHost,点开的页面显示的链接是myshceme://myhost,神奇的事情,搜索一下发现了一篇文章,这位前辈和我遇到了一样的情况,文章链接如下:

    H5无法调起android app 的坑之 scheme 大小写

    最终结果就是,Scheme链接千万别用大写字母,包括scheme、host、port、path。

    完毕

    今天的分享就到这里,文章多有不足,各位小伙伴有什么想法可以直接评论或是私信,要是对你有所帮助就给我一个赞吧,喜欢我的小伙伴可以关注我哦~

    支持我的小伙伴们可以微信搜索“Android思维库”,或者微信扫描下方二维码,关注我的公众号,每天都会推送新知识~
    在这里插入图片描述

    展开全文
  •  首先想到的是两个问题:一是如何唤起本地 app,二是如何判断浏览器是否安装了对应 app。  如何唤起本地 app  首先,想要实现这个需求,肯定是必须要客户端同学的配合才行,因此我们不用知道所有的实现细节,...

    在做 h5 页面中,会遇到这样一个需求,有一个立即打开的按钮,如果本地安装了我们的 app,那么点击就直接唤起本地 app,如果没有安装,则跳转到下载。

      首先想到的是两个问题:一是如何唤起本地 app,二是如何判断浏览器是否安装了对应 app。

      如何唤起本地 app

      首先,想要实现这个需求,肯定是必须要客户端同学的配合才行,因此我们不用知道所有的实现细节,我们从前端角度思考看这个问题,需要知道的一点是,ios 与 Android 都支持一种叫做 schema 协议的链接。比如网易新闻客户端的协议为

      JavaScript

    1. newsapp://xxxxx 

      当然,这个协议不需要我们前端去实现,我们只需要将协议放在 a 标签的 href 属性里,或者使用 location.href 与 iframe 来实现激活这个链接。而 location.href 与 iframe 是解决这个需求的关键。

      在 ios 中,还支持通过smart app banner来唤起 app,即通过一个 meta 标签,在标签里带上 app 的信息,和打开后的行为,代码形如

      XHTML

    1. <meta name="apple-itunes-app" content="app-id=1023600494, app-argument=tigerbrokersusstock://com.tigerbrokers.usstock/post?postId=7125" /> 

      需要注意的是:我们就没办法通过这个协议在微信中直接唤起 app。原因是微信里屏蔽了 schema 协议,除非你是微信的合作伙伴之类的,他们专门给你配置进白名单。

      因此我们会判断页面场景是否在微信中,如果在微信中,则会提示用户在浏览器中打开。

      如何判断本地是否安装了 app

      首先我们可以确认的是,在浏览器中无法明确的判断本地是否安装了 app。因此我们必须采取一些取巧的思路来解决这个问题。

      我们能够很容易想到,采用设置一个延迟定时器 setTimeout 的方式,第一时间尝试唤起 app,如果 200ms 没有唤起成功,则默认本地没有安装 app,200ms 以后,将会触发下载行为。

      结合这个思路,我们来全局考虑一下这个需求应该采用什么样的方案来实现它。

      使用 location.href 的同学可能会面临一个担忧,在有的浏览器中,当我们尝试激活 schema link 的时候,若本地没有安装 app,则会跳转到一个浏览器默认的错误页面去了。因此大多数人采用的解决方案都是使用 iframe

      测试了很多浏览器,没有发现过这种情况

      后来观察了网易新闻,今日头条,YY 等的实现方案,发现大家都采用的是 iframe 来实现。好吧,面对这种情况,只能屈服。

      整理一下目前的思路,得到下面的解决方案

     

      想法很美好,现实很残酷。一测试,就发现简单的这样实现有许多的问题。

      第一个问题在于,当页面成功唤起 app 之后,我们再切换回来浏览器,发现跳转到了下载页面。

      为了解决这个问题,发现各个公司都进行了不同方式的尝试。

      也是历经的很多折磨,发现了几个比较有用的事件。

      pageshow 页面显示时触发,在 load 事件之后触发。需要将该事件绑定到 window 上才会触发

      pagehide 页面隐藏时触发

      visibilitychange 页面隐藏没有在当前显示时触发,比如切换 tab,也会触发该事件

      document.hidden 当页面隐藏时,该值为 true,显示时为 false

      由于各个浏览器的支持情况不同,我们需要将这些事件都给绑定上,即使这样,也不一定能够保证所有的浏览器都能够解决掉这个小问题,实在没办法的事情就不管了。

      因此需要扩充一下上面的方案,当本地 app 被唤起,则页面会隐藏掉,就会触发 pagehide 与 visibilitychange 事件

      而另外一个问题就是 IOS9+ 下面的问题了。ios9 的 Safari,根本不支持通过 iframe 跳转到其他页面去。也就是说,在 safari 下,我的整体方案被全盘否决!

      于是我就只能尝试使用 location.href 的方式,这个方式能够唤起 app,但是有一个坑爹的问题,使用 schema 协议唤起 app 会有弹窗而不会直接跳转去 app!甚至当本地没有 app 时,会被判断为链接无效,然后还有一个弹窗。

      这个弹窗会造成什么问题呢?如果用户不点确认按钮,根据上面的逻辑,这个时候就会发现页面会自动跳转到下载去了。而且无效的弹窗提示在用户体验上是不允许出现的。

      好吧,继续扒别人的代码,看看别人是如何实现的。然后我又去观摩了其他公司的实现结果,发现网易新闻,今日头条都可以在 ios 直接从微信中唤起 app。真是神奇了,可是今日头条在 Android 版微信上也没办法直接唤起的,他们在 Android 上都是直接到腾讯应用宝的下载里去。所以按道理来说这不是添加了白名单。

      为了找到这个问题的解决方案,我在网易新闻的页面中扒出了他们的代码,并整理如下,添加了部分注释(因涉及的代码块篇幅过长,考虑到阅读效果,请至阅读原文查看。

      虽然有一些外部的引用,和一些搞不懂是干什么用的方法和变量,但是基本逻辑还是能够看明白。好像也没有什么特别的地方。研究了许久,看到了一个 jsonp 请求很奇特。这是来干嘛用的?

      于是费尽千辛万苦,搜索了很多文章,最终锁定了一个关键的名词 Universal links。

      如果我早知道这个名词,那么问题就不会变的那么束手无策。所以这个东西是什么呢?

      Apple 为 iOS 9 发布了一个所谓的通用链接的深层链接特性,即 Universal links。虽然它并不完美,但是这一发布,让数以千计的应用开发人员突然意识到自己的应用体验被打破。

      Universal links,一种能够方便的通过传统的 HTTP/HTTPS 链接来启动 App,使用相同的网址打开网站和 App。

      关于这个问题的提问与 universal links 的介绍请至阅读原文

      ios9 推行的一个新的协议!

      关于本文的这个问题,国内的论坛有许许多多的文章来解决,但是提到 universal links 的文章少之又少,而我想吐槽的是,我们的 ios 开发也尼玛不知道这个名词,搞什么鬼。他改变了用户体验的关键在于,微信没有屏蔽这个协议。因此如果我们的 app 注册了这个协议,那么我们就能够从微信中直接唤起 app。

      这个时候我就发现,上面贴的网易新闻代码中的 jsonp 请求的内容,就是这个协议必须的一个叫做apple-app-site-association的 JSON 文件

      大家可以直接访问这个链接,查看里面的内容

      http://active.163.com/service/form/v1/5847/view/1047.jsonp

      至于 universal links 具体如何实现,让 ios 的同学去搞定吧,这里提供两个参考文章

      http://www.cocoachina.com/bbs/read.php?tid-1486368.html

      https://blog.branch.io/how-to-setup-universal-links-to-deep-link-on-apple-ios-9

      支持了这个协议之后,我们又可以通过 iframe 来唤起 app 了,因此基本逻辑就是这样了。最终的调研结果是

      没有完美的解决方案

      就算是网易新闻,这个按钮在使用过程中也会有一些小 bug,无法做到完美的状态。

      因为我们面临许多没办法解决的问题,比如无法真正意义上的判断本地是否安装了 app,pageshow,pagehide 并不是所有的浏览器都支持等。很多其他博客里面,什么计算时间差等方案,根!本!没!有!用!我还花了很久的时间去研究这个方案。

      老实说,从微信中跳转到外部浏览器,并不是一个好的解决方案,这样会导致很多用户流失,因此大家都在 ios 上实现了 universal links,而我更加倾向的方案是知乎的解决,他们从设计上避免了在一个按钮上来判断这个逻辑,而采用了两个按钮的方式。

      网易新闻的逻辑是,点击打开会调整到一个下载页面,这个下载页面一加载完成就尝试打开app,如果打开了就直接跑到 app 里面去了,如果没有就在页面上有一个立即下载的按钮,按钮行只有下载处理。

     

    转载于:https://www.cnblogs.com/famensaodiseng/p/7651263.html

    展开全文
  • 使用uri的方式唤起unity游戏时遇到问题:在应用已经启动的情况下接受不到手机浏览器传递过来的参数 原因:在应用已启动的情况下唤起时不会走再次走onCreate,而是会调用onNewIntent,因此需要通过重写onNewIntent...

    以下记录浏览器唤起安卓app很多教程没有提到的注意点:
    使用uri的方式唤起unity游戏时遇到问题:在应用已经启动的情况下接受不到手机浏览器传递过来的参数
    原因:在应用已启动的情况下唤起时不会走再次走onCreate,而是会调用onNewIntent,因此需要通过重写onNewIntent方法来保存相关的参数
    解决方法:在unity的安卓工程的主Activity中重写onNewIntent方法
    在这里插入图片描述
    详细介绍参考博客:https://www.cnblogs.com/shitianzeng/articles/2807062.html

    展开全文
  • 兼容各个浏览器唤起下载APP 判断各个浏览器 var ua = navigator.userAgent.toLocaleLowerCase(); function is_android(){ if(ua.match(/android/i)=="android") { return true; } else { return false; } ...
  • 安卓用的ifarme方法`var ifr = document.createElement("iframe");vart1=newDate().getTime();document.body.appendChild(ifr);ifr.setAttribute('style','display:none');ifr.setAttribute('src...
  • 安卓微信浏览器唤起系统内部浏览器 最近因为公司项目需求,需要做一个功能。使用微信浏览器打开高德地图导航,经试验,高德web端没有导航功能,其实现原理是调起高德APP来实现导航的操作。然后把代码写进微信...
  • h5浏览器唤起app

    千次阅读 2016-12-29 15:09:55
    代码: /* * function getDeviceBrowser * @return {Object} device设备系统,browser浏览器类型 */ function _getDeviceBrowser () { var ua = window.navigator.userAgent;
  • 为了提高转化率,就需要让用户不管是在微信或者是浏览器中,都能在点击链接后, 唤起本地的 app 后 , 跳转到指定页面 。虽然这个功能从用户体验方面来说是自然而然的,但是由于 iOS/Android 平台差异性,在实现...
  • 最近遇到一个需求:点击一个按钮,如果本机装有则唤起app,没有的话则跳下载页。刚一接到需求,觉得很熟悉,实际上这个功能也确实很常见,页能搜索到一大堆方案,但是实际应用中,却发现总是很难做到100%的完美。这...
  • 1.一般公司有自己的app,而app是需要不断有新用户涌入才能持续运营,达到不错的收入。就需要使用这种方式进行引入新的用户。 2.一些内容在网页端体验不好,或者一些功能需要app内才能实现,就需要将用户引入app中。...
  • 使用微信打开网址时,无法在微信内打开常用下载软件,手机APP等。网上流传的各种微信打开下载链接,微信一更新基本失效。大家常用的方法是,弹出一个遮罩提示用户在新的浏览器窗口打开,再也不用管微信如何的更新。 ...
  • 浏览器唤起Native App

    2017-08-01 14:37:00
    前段时间遇到一个小需求:要求在分享出来的h5页面中,有一个立即打开的按钮,如果...我们最开始就面临2个问题:一是如何唤起本地app,二是如何判断浏览器是否安装了对应app。 如何唤起本地app 首先,想要实现这个...
  • 为了提高转化率,就需要让用户不管是在微信或者是浏览器中,都能在点击链接后, 唤起本地的 app 后 , 跳转到指定页面 。 虽然这个功能从用户体验方面来说是自然而然的,但是由于iOS/Android平台差异性,在实现...
  • iOS Android微信及浏览器唤起本地APP

    千次阅读 2017-09-26 13:47:18
    为了提高转化率,就需要让用户不管是在微信或者是浏览器中,都能在点击链接后, 唤起本地的 app 后 , 跳转到指定页面 。   虽然这个功能从用户体验方面来说是自然而然的,但是由于 iOS/Android 平台差异性...
  • path:同上 ※没有也可以唤起 注意: Activity配置中android:exported=true这个外部是否可以调用一定要写true,要不然会调用不成功,对于应用安全要求较高的一定要注意。 2、浏览器如何调起 <!--打开APP--> ...
  • 1. APP唤起APP/小程序本文档面向LinkActive媒体方,通过调用本文档中的接口来获取拉活的广告资源及回调广告行为。调用文档接口前,请先联系LinkedME开通LinkActive平台权限,以获取媒体方唯一的linkedme_key。新增...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 1,903
精华内容 761
关键字:

安卓浏览器唤起app