H5牛牛源码开发APP技术总结

Q1446595067官网:h5.haozibbs.com或http:\\www.aqbaa.cn在H5页面打开APP的方法一般有两种,在IOS 9以前,一般使用的技术是URL Scheme。这种方式虽然可自定义程度很高,能够巧妙地实现很多跳转,但弊端也很明显:我们只能通过 scheme://example 这种格式的链接来实现跳转,而且现在苹果还对这种方式的跳转加了一个提示框:“是否打开XXX”。对于对Web和原生App交互的场景需求量很大的产品来说,这样的跳转方式显然是步骤冗杂的,用户体验并不好。

  iOS 9 以后,Universal Links 的出现完美的解决了这个问题。它所提供的直接、顺畅、无缝衔接的跳转能够让用户体验提升一个很大的级别。用户可以点击开发者指定的类似于 https://example.com/t 的URL直接唤醒App,而不需要在浏览器打开再点击其他按钮,实现真上的一键直达,无缝链接。

  但是Universal Links只能在IOS 9+的平台才可以使用,我们还需要兼容微信、安卓和IOS 9以前的版本,所以项目中,我们会采用URL Scheme和Universal Links两个结合的方式。

1.技术介绍

1.1 URL Scheme

  项目中需要配置 URL Scheme 以用于场景恢复时跳转到应用中(这里的scheme要唯一确定,不要与其他应用一致,建议使用项目名称作为scheme,不然有可能会跳转到其他的应用里)。

  在iOS工程中选择工程 Target,选择 Info 选项,然后打开 URL Types,添加 URL Scheme。可以自定义协议名称,如moblink。这个形式的 URI 就会关联跳转到工程中。

  配置好后安装APP后,直接在访问设置好的 URL Scheme可以直接打开APP,如平时我们用的比较多的APP,默认的 URL Scheme如下:

  • QQ: mqq://
  • 微信: weixin://
  • 腾讯微博: TencentWeibo://
  • 淘宝: taobao://
  • 支付宝: alipay://
  • 微博: sinaweibo://

      使用方式: <a href="weixin://">打开微信</a> 点击a标签就可以打开了微信(如果安装了微信)。

      这种方式访问是比较简单的,安卓和IOS都可以使用,但是在微信端就不行了,微信端设置了白名单,完全屏蔽了URL Scheme 用法,除非加入了白名单,像京东就可以直接打开,否则是不可能的,那我们还有下面的办法来解决这个办法。

1.2 Universal Links

  用URL Scheme 不能在微信里打开APP,但是在IOS 9+的系统上还是有解决办法的,那就是用Universal Links,官方网站https://developer.apple.com/library/content/documentation/General/Conceptual/AppSearch/UniversalLinks.html,这里都是英文的,网上也有很多文章。开篇就说了,如果你单纯为了能让H5打开App,Schema就能做到了,Universal
Links的意义则是把普通url,也赋予了能打开App的能力,而不必编写专门的Schema
Url去唤起App,在没装App的时候,Universal
Links他也是一个合法的url链接,浏览器可以正常跳转,因此不会出现在iOS上讨人厌的框。而且Universal
Links目前还没有基于iOS的UI/WKWebView的应用进行拦截,所以目前看还是能突破微信/手百的封锁。(以后,不好说啊~)

2.DEMO示例(IOS篇)

2.1 IOS平台配置

  • 在苹果开发者账号下,将本项目的Associated Domains 开关Enable;
  • 在工程中选择好本项目的证书和描述文件;如果是已存在的项目,请完成步骤1后重新下载新的描述文件;
  • 在工程中打开Associated Domains开关,并设置域名

测试一级域名:aa.tk 测试二级域名:sit.aa.tk

Domains域名 作用
applinks:aa.tk 服务器主域名
applinks:www.aa.tk  
applinks:sit.aa.tk 服务器子域名,用于点击自定义按钮跳转app,需要跨域才能生效

注:用于跳转打开app的域名需要支持https,如果是一级域名页面有个按钮,点击按钮跳转二级域名来打开app,那么二级域名需要支持https。这里DEMO的二级域名不支持https,所以采用的方案是二级域名跳转到一级域名来打开APP。

相关代码:

- (BOOL)application:(UIApplication *)application continueUserActivity:(NSUserActivity *)userActivity restorationHandler:(void (^)(NSArray * _Nullable))restorationHandler{
    if ([userActivity.activityType isEqualToString:NSUserActivityTypeBrowsingWeb]) {
        NSURL *webpageURL = userActivity.webpageURL;
        NSString *host = webpageURL.host;
        // 在这里写需要的逻辑,比如跳转到某个详情页
        if ([host isEqualToString:@"www.aa.tk"]) {
            NSString *url = [userActivity.webpageURL.description substringFromIndex:23];
            NSArray *mat = [url componentsSeparatedByString:@"/"];
            if (mat.count == 2) {
                NSString *type = [mat objectAtIndex:0];
                NSString *key = [mat objectAtIndex:1];
                if ([type isEqualToString:@"goods"]) {
                    [self openGoodsView:key];
                }
            }
        }
        else{
            [[UIApplication sharedApplication] openURL:webpageURL];
        }
    }
    return YES;
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22

当通过Universal Link进入app时,会触发此代理,可以从前端传递参数,这里做相应处理,理论上可以跳转到APP的任何一个页面。

2.2 配置文件apple-app-association

  1. 配置文件的位置放在跳转域名的根目录,DEMO将一级域名设置为打开APP的地址,所以上传到主域名对应服务器的根目录。判断位置是否正确可以访问”https://www.aa.tk/apple-app-site-association“查看,如果正确显示则正确。
  2. 配置文件的内容如下:
    {
        "applinks": {
            "apps": [],
            "details": [{
                "appID": "xxx",
                "paths": ["/testlinkapp/*"]
            }]
        }
    }
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

      “appID”是团队ID的值或应用程序ID前缀,紧随其后的是boundle ID。(appID key 就是在你的应用程序的“application-identifier”),苹果开发者账号》merbership下查看teamid,bundle id 为项目自己定义的唯一标识。

      “paths”是一个字符串数组,指定你的网站的哪些部分支持跳转到应用程序和哪些网站的部分不想跳转到应用。指定一个域名,不应该作为一个通用的链接处理,在域名paths字符路径的前部添加“NOT”(包括空间T)。

      这里设置了”/testlinkapp/*”,也就是说访问”/testlinkapp/”文件夹下任何文件(不管是否存在)都可以,例如”https://www.aa.tk/testlinkapp/xxx“。如果没有跨域,就不能跳转,不过下滑可以显示横幅,点击打开也可以打开。

2.3 下载安装APP并测试

  如果配置文件发生更改,则需要重新下载APP。这里一级域名和二级域名对应的是同一个文件根目录。

  测试案例:

环境 访问url 点击跳转url 是否跨域 结果
浏览器 https://www.aa.tk/testlinkapp/xxx   页面不存在,下滑出现”打开APP“横幅,点击打开会打开APP
浏览器 http://sit.aa.tk/testlinkapp2/demo.html https://www.aa.tk/testlinkapp/zzz 点击demo页的按钮,直接打开了APP
浏览器 https://www.aa.tk/testlinkapp/xxx   直接打开APP
浏览器 http://sit.aa.tk/testlinkapp2/demo.html https://www.aa.tk/testlinkapp/zzz 点击demo页的按钮,直接打开了APP

2.4 没有安装跳转到APP Store

  使用Universal Links时将跳转的页面设置为下载页面,如果APP已经安装就直接打开APP,如果没有安装则进入下载页面。

  使用URL Scheme时用延时,超过三秒没有打开APP,则打开下载页面,具体实现后面源码部分。

3.DEMO示例(AOS篇)

安卓不能采用Universal Links的方法,这里使用的是URL Scheme+intent

3.1 安卓配置文件

 var AppConfig = {
    "scheme": "xxx",
    "package": "com.xxx",
    "action": "android.intent.action.VIEW",
    "category": "android.intent.category.BROWSABLE",
    "host":"www.xxx.com",
    "FAILBACK_ANDROID":"https://www.xxx.com/xxxx",
    "FAILBACK_IOS":"itms://itunes.apple.com/hk/app/bochk/xxx?mt=8"
 };
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

  这里的参数由安卓同事提供,“FAILBACK_ANDROID”是AOS没有打开app跳转到下载页面的链接

“FAILBACK_IOS”是IOS没有打开app跳转的下载链接,这两个是前端配置的。

  在Chrome浏览器中使用intent方法,在非Chrome浏览器使用URL
Scheme,Chrome中使用intent的好处:Chrome可以识别S.browser_fallback_url参数,如果没有安装app,则直接跳转,而不用我们自己判断是否安装app,在非Chrome中通过延时判断是否安装app会有弊端:(用schema方法实现)点击打开app,会有提示“是否用XXX应用打开”的提示框,如果用户没有点击按钮超过设置的时间,页面就直接跳转了下载页,体验不好。具体实现看源码。

3.2 安卓端在微信端暂时没有办法,只能跳转应用宝或者下载页面。

4.Universal Links坑及建议

4.1 配置apple-app-association

  • 域名必须支持https
  • 域名根目录下放这个文件apple-app-association,不带任何后缀
  • 文件为json格式保存为文本即可
  • json按着官网的要求填写即可

      测试是否正确,直接访问域名+配置文件名如果能正确访问则放置的位置是正确的。例如你想通过访问”https://aa.test.com/xxx“来打开app,那么你要把配置文件放在”https://aa.test.com/“对应服务器根目录,通过访问”https://aa.test.com/apple-app-association“能直接访问配置文件则是正确的。

4.2 配置Domains

  • 开发者中心证书打开Associated Domains
  • 工程配置Associated Domains
  • 将你apple-app-association所在域名配置进去
  • 给你的工程像Schema的OpenUrl一样,编写App被唤醒后的处理逻辑

      在配置Domains时,我们需要将一级域名和二级域名都要添加进去,这样做是为了通过自定义按钮打开app,而这种做法需要跨域,所以需要配置两个,如果用二级域名来打开app,则二级域名也需要支持https。

4.3 Universal Links基本运作流程

  1. APP第一次启动 or APP更新版本后第一次启动
  2. APP向工程里配置的域名发起Get请求拉取apple-app-association Json File
  3. APP将apple-app-association注册给系统
  4. 由任意webview发起跳转的url,如果匹配了apple-app-association注册过的通用链接(path字段配置)
  5. 打开App,触发Universal Link delegate
  6. 没匹配,webview继续跳转url(当普通的url跳转)

4.4 跨域

Universal Links必须要求跨域,如果不跨域,就不能实现自定义按钮打开APP,经测试如果不跨域,直接输入配置的url,会跳转到url,下滑会出现如下的横幅,点击打开也可以打开app。

  这里我们用跨域主要是用于自定义按钮打开App,如果打开一个页面”http://www.aa.com/index.html“,这个页面里面有个”打开APP“的按钮,点击按钮去打开APP。我们用Universal

Links技术就是点击按钮让页面跳转到我们在apple-app-association配置文件里配置好的路径里去,不管访问的文件是否存在,都能打开APP。例如我们设置的Universal
Links的域名为二级域名”https://bb.aa.com/“,配置文件的path为”/demo/*”,我们将按钮的跳转链接设置为”https://bb.aa.com/demo/xxx“,这时就可以打开APP。

PS:

1.这里配置文件就要放在二级域名的根目录

2.xxx可以不存在,也可以存在

3.如果没有跨域的话,会当普通的url跳转

4.二级域名同样要添加到Domain里

5.跨域最好使用二级域名的方式

4.5 Universal Links会因为用户的行为而失效

  Universal LInks触发后打开APP,这时候APP的状态栏右上角会有文字提示来自XXX
App,可以点击状态栏的文字快速返回原来的APP,如果用户点击了返回微信,就会被iphone记住,认为用户不需要跳出原APP打开新APP,因此这个APP的Universal
Links会被关闭,再也无效。还有在备忘录里长按Universal
Links链接会出现”用XXApp打开”的选项,如果你点击了”用Safari浏览器打开”,那么点击此链接也会默认用浏览器打开url,而不是打开APP。

  想要开启也不是不行,让用户重新用safari打开,Universals Links的页面,然后会出现很像苹果smart bar的东西,那个东西点了后就能打开。

4.6 判断是否安装了APP及跳转APP Store

  我们要做的时如果用户安装了APP就直接打开APP,如果没有安装就打开下载页面或者进入应用市场让用户下载应用,但是在前端时无法通过js去判断是否已经安装了APP,解决办法:

  1.用URL Scheme时用延时。设置3秒延时,如果用户安装了APP,3秒内没有打开则进入下载页面或应用市场,弊端是用URL Scheme会有询问框“是否在XXXAPP中打开”,如果用户3秒内没有点击,则页面就跳转到了下载页。

  2.安卓端Chrome浏览器可以用intent配置S.browser_fallback_url来使没有打开app时直接进入下载页面。

  3.用Universal
Links打开的页面设置为下载页,下载页里放置下载按钮,点击下载按钮进入应用市场。如果已经安装了APP,则直接打开APP,如果没有安装,则这个下载url会被当作普通链接,浏览器就能打开下载页,点击下载按钮,打开APP
Store。

5.源码

源码地址:点击下载

6.实现的功能

IOS实现功能:

1.在浏览器中点击,若没有安装app,会跳转到下载页,点击下载按钮,打开itunes应用市场;

2.在浏览器中点击,若安装了app,则直接打开app;

3.在微信页面中点击按钮,若没有安装app,会跳转到下载页,点击下载按钮,打开itunes应用市场;

4.在微信页面中点击按钮,若安装了app,则直接打开app;

5.在微信消息中直接点击打开app的链接,可以直接打开app.(不是在微信浏览器中)

6.在记事本,短信,邮件中直接打开app

AOS实现功能:

1.在浏览器中点击,若没有安装app,3秒会跳转到下载页;

2.在浏览器中点击,若安装了app,则直接打开app;

3.在Chrome浏览器,没有 超过3秒后造成页面跳转到下载页 的问题

原文地址:https://www.cnblogs.com/HZYM/p/8390627.html

时间: 2024-10-12 07:54:54

H5牛牛源码开发APP技术总结的相关文章

h5牛牛源码开发程序员是出轨率最高的群体?欲加之罪何患无辞

现代人为人处事,会自黑算是必备技能之一h5牛牛源码开发(h5.hxforum.com) 联系方式170618633533企鹅2952777280源码出售 房卡出售 后台出租有意者私聊扣扣.其原因主要有二:一是为了化解尴尬,二是缓解压力,这样集幽默与智慧于一身,大家何乐而不为?但是如今,是什么力量,让一个「从来都是自嘲不息,哪轮得到人家来黑」的程序员群体在光天化日之下就"被黑"了? 为什么程序员就成了出轨率最高的群体了?近日一篇<为什么程序员是出轨率最高的群体>的文章引发诸多

CoreCLR源码探索(七) JIT的h5牛牛源码出售工作原理(入门篇)

很多C#的初学h5牛牛源码出售Q1446595067官网:h5.haozibbs.com者都会有这么一个疑问, .Net程序代码是如何被机器加载执行的? 最简单的解答是, C#会通过编译器(CodeDom, Roslyn)编译成IL代码, 然后CLR(.Net Framework, .Net Core, Mono)会把这些IL代码编译成目标机器的机器代码并执行. 相信大多数的C#的书籍都是这样一笔带过的. 这篇和下篇文章会深入讲解JIT的具体工作流程, 和前面的GC篇一样, 实现中的很多细节都是

Egret 学习笔记 h5牛牛源码 h5牛牛源码搭建教程

1.纹理集实际上就是将一些零碎的小图放到一张大图当中.游戏中也经常使用到纹理集.使用纹理集的好处很多,我们通过将大量的图片拼合为一张图片从而减少网络请求,原先加载数次的图片资源现在加载一次即可.同时,在引擎渲染的时候也会减少IO读取,从而提高h5牛牛源码性能.h5牛牛源码Q 2171793408     http://wowotouba.com/h52.只要发生事件,Flash就会调度事件对象.如果事件目标不在显示列表中,则Flash Player或AIR将事件对象直接调度到事件目标.例如,Fl

微信h5牛牛源码出售 手机牛牛搭建图文教程

微信h5牛牛源码出售QQ:2152876294官网http://diguaym.com/h5手机17070838768神兽青龙白虎朱雀玄武凤凰大厅搭建如下: 1. 布局的时候,如果一个元素你想让他的宽高保持一定比例,而不随屏幕变化,宽高设置的时候,使用同一个单位都是CSS3的单位,低版本不兼容 <span style="font-family: Arial, sans-serif; ">1.移动端页面布局,使用相对的数值,不要使用绝对数值,推荐使用%,vw,vh,rem,e

微信h5牛牛源码搭建 问题修复

需要参数 mch_id-商户号,nonce_str-随机字符串,sign-签名,前面两个参数好说,后面的 sign看得我是一脸懵逼,经过 几 次测试最后得到sign的代码是这样的: SortedMap<String, String> datas = new TreeMap<String, String>(); String uuid = UUID.randomUUID().toString().replaceAll("-", ""); dat

新版H5牛牛源码搭建一条龙教程

最低配置:linux服务器,系统: CentOS 6.8,内存2G以上,独享5M以上带宽 QQ:2164097691  材料下载:h5.hubawl.com 源码 <!--{template common/header}--> <!--[name]{lang portalcategory_listtplname}[/name]--> <!--{eval $list = array();}--> <!--{eval $wheresql = category_get_

h5牛牛源码搭建建站成功第一步——域名的选择

有问题Q1446595067官网:h5.haozibbs.com 一个游戏网站开始于名称和域名,大型公司对这个尤其重视,因为好的名称和相应的域名能够很好的被人记住,才能有好的访问量和多的游戏玩家. 有人说,域名是地皮,网站是楼盘,位置决定成败.在房产市场,好的地皮价格贵,随着进驻的商家越来越多,价格也就水涨船高,域名的售价不断在刷新新的记录,众多的游戏厂商们,不停的往门槛里挤,谁也不愿意输在起跑线上. 域名是棋牌游戏网站建设的第一步,选择域名需要从域名的长度.后缀.含义.优化等各个方面考虑其价值

h5牛牛源码出售中 audio标签的样式修改

Q1446595067官网:h5.haozibbs.com由于html5的流行,现在移动端大多数的需求都可以使用audio来播放音频,但您可能只是需要很简单的播放/停止效果,但不同的浏览器上的audio样式却不尽人意,那么要怎么改变这个样式呢,其实它的原理比较简单,就是把写audio的时候不要用controls属性,隐藏原生的audio, 然后用div之类标签,定义css样式美化起来用来显示播放器的效果,最后用js捕获audio事件,基本就是src路径.pause暂停.load加载.play播放

h5牛牛源码h5二八杠源码出售搭建教程

QQ联系2164097691 材料下载地址:h5.hubawl.com linux服务器,系统: CentOS 6.8,内存2G以上,独享5M以上带宽 <?php /**  *      [Discuz!] (C)2001-2099 Comsenz Inc.  *      This is NOT a freeware, use is subject to license terms  *  *      $Id: memcp.inc.php 29364 2012-04-09 02:51:41Z