zoukankan      html  css  js  c++  java
  • 通过页面调用APP【H5与APP互通】

    现在H5和App原生的内容原来越互通,所涉及的业务也越来越复杂和融合,所以如何互相之间方便的调用才是王道。

    场景1

       比如用hybrid获取地理位置和短信信息,这当然需要框架封装好,比如利用框架的bridge.js(下一篇文章会详细讲这个内容)

    场景2

       最简单的比如用H5调用App然后再判断是否有安装此应用,如果有则直接打开应用,则安装如果没有则去itunes或者google市场安装。

      比如淘宝上的立即打开功能

    image

    首先场景2的功能,我们需要了解他的几个流程

       1.判断程序系统环境

       2.判断有应用开启应用

       3.判断无应用则跳到相应的链接区执行

    我们就从淘宝的手机此功能来分析一下吧

    1.js判断环境

     

       这个环境是很好判断的

      通过useragent即可

    var ua = navigator.userAgent;
    if(ua.match(/iPhone|iPod/i) != null){
    //iphone代码
    }
    else if(ua.match(/Android/i) != null){
    //android代码
    }
    else if(ua.match(/iPad/i) != null){
    //ipad代码
    }

    用浏览器模仿很容易看到识别手机这个的信息

    image

    这里我模仿google Nesux4的值是

    navigator.userAgent;
    "Mozilla/5.0 (Linux; Android 4.2.1; en-us; Nexus 4 Build/JOP40D) AppleWebKit/535.19 (KHTML, like Gecko) Chrome/18.0.1025.166 Mobile Safari/535.19"

    其他

    这里再稍微介绍一下关于下载这种渠道的运营,

    通过不同的渠道是要进行返利的,所以这一部分得作为统计,推广都是要砸钱啊~

    那么淘宝的渠道就是利用TTID在淘宝平台上注册一下 http://open.taobao.com/index.htm

    TTID 是用于统计无线客户端用户访问情况的统计代码,

    image

    看淘宝的这个http://m.taobao.com/channel/act/sale/tbdl1.html?代码有点凌乱

    1.里面居然带console

    2.里面居然只有android手机才会统计频道里的数据…

    2.认识了环境之后可以愉快的调用了吧?

       这个跟握手规则很接近,不是你想调就能掉,

       首先应用得定义自己的规范(schema规则)定义自己的链接,根据定制的链接才能掉。当应用定义这个规则以后不仅可以应用和页面之间调用,而且应用可以和应用之间调用。

      ios中需要在info.plist

    在Info.plist中,增加一个字段,名称为CFBundleURLTypes(URL Types)。

    里面的内容为数组形式,其中定义好一个CFBundleURLName后将

    以CFBundleURLSchemes为可以的array才是我们可以调用的内容
    <key>CFBundleURLTypes</key>
    <array>
        <dict>
            <key>CFBundleURLName</key>
            <string>package name(com.cnblogs.www)</string>
            <key>CFBundleURLSchemes</key>
            <array>
                <string>cloud</string>
            </array>
        </dict>
    </array>

    比如定义了上面这句后就可以用

    iOSDevTips://的schame调用了
    image

    具体用法可见

    http://iosdevelopertips.com/cocoa/launching-your-own-application-via-a-custom-url-scheme.html

      ios预留了以下schema

    //打开Mail
    [[UIApplication sharedApplication] openURL:[NSURL URLWithString:@"mailto://info@iphonedevelopertips.com"]]
    
    //打开电话
    [[UIApplication sharedApplication] openURL:[NSURL URLWithString:@"tel://8004664411"]];
    
    //打开SMS
    [[UIApplication sharedApplication] openURL:[NSURL URLWithString:@"sms:55555"]];
    
    //打开AppStore
    NSURL *appStoreUrl = [NSURL URLWithString:@"http://phobos.apple.com/WebObjects/MZStore.woa/wa/viewSoftware?id=291586600&amp;mt=8"];
    [[UIApplication sharedApplication] openURL:appStoreUrl];
    详情参见https://developer.apple.com/library/ios/featuredarticles/iPhoneURLScheme_Reference/Introduction/Introduction.html#//apple_ref/doc/uid/TP40007899-CH1-SW1

    Android android通过intent来调用

    首先得在android配置文件manifest里面为相关需要调用的页面配置intent

    <activity android:name=".MyUriActivity">
        <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:scheme="myapp" android:host="path" />
        </intent-filter>
    </activity>

    android intent配合比较复杂,而且也可以用于在内部的调用,甚至在页面切换的时候也是必不可少的,对于调用比iphone的相对更宽泛些。全局的调用是用broadCast广播的方式进行,而页面之间的传输是在页面下定义

    此外如果android要用intent调用别的app或者其他什么的还需要加相关的permission

    详见http://developer.android.com/reference/android/content/Intent.html

    呐在H5中我们就这样调用就好

    intent://

    我们来看看淘宝是怎么做到的

    在里面有个imageintent的链接

    剩下的不言自明

    ok所以剩下的功能变的非常简单

    3.调用App

    var ua = navigator.userAgent;if(ua.match(/iPhone|iPod/i) != null){
      document.location = 'chblogs://'; }
    else if(ua.match(/Android/i) != null){
      document.location = intent:com.cnblogs.cn.client.android;end'; }
    else if(ua.match(/iPad/i) != null){
      document.location = 'chblogs://'; 
    }

    大部分工作完成了,坑坑也该现身了

    现在要考虑的是如果app不在那么我们应该去下载页面下载

    系统不会那么聪明帮你办好这件事。

    这里的逻辑很简单,当没有成功打开app的时候

    新页面不会弹出则页面逻辑可言进行,如果进入了新页面,则页面逻辑便终止了

    所以我们可以另开一个延时的线程来判断这个事情

    if(...){
    document.location = '';
    setTimeout(function(){
       //此处如果执行则表示没有app
    },200);
    }

    好了,这样就完成了,坑坑就是andorid如果判断没有此程序会打开未找到页面

    那我们在请求的时候就应该对android做一个检索intent://scan/#Intent;scheme=这样的话就ok了

    所以我们之间可以这样完成了我们可以直接取itunes或者google市场下载了

    看淘宝的代码

    image

    下次有时间了会继续研究一下hybrid和webapp的通信。

  • 相关阅读:
    spark 读取mongodb失败,报executor time out 和GC overhead limit exceeded 异常
    在zepplin 使用spark sql 查询mongodb的数据
    Unable to query from Mongodb from Zeppelin using spark
    spark 与zepplin 版本兼容
    kafka 新旧消费者的区别
    kafka 新生产者发送消息流程
    spark ui acl 不生效的问题分析
    python中if __name__ == '__main__': 的解析
    深入C++的new
    NSSplitView
  • 原文地址:https://www.cnblogs.com/carlos-guo/p/3945112.html
Copyright © 2011-2022 走看看