deeplink_deeplink调用 - CSDN
精华内容
参与话题
  • Universal Link 前端部署采坑记

    千次阅读 2018-04-13 21:06:30
    微信已经封禁Universal Link,已经不能实现跳出微信打开App具体细节可以看微信着手封堵 Universal Link但Univeral Link 还是可以学习学习看看的~毕竟几遍在Safari下还有个好处,可以干掉schema跳转的那个难看的错误...

    转载自: http://awhisper.github.io/2017/09/02/universallink/

    号外!号外!微信已经封禁Universal Link,已经不能实现跳出微信打开App

    具体细节可以看

    微信着手封堵 Universal Link

    但Univeral Link 还是可以学习学习看看的~毕竟几遍在Safari下还有个好处,可以干掉schema跳转的那个难看的错误弹框

    – 以上来自2018.1.8修改

    前言:

    文章会适当说一些如何开发iOS上的universal link,但类似的文章太多了一艘一大堆,每篇都介绍的挺清楚,因此也不是重点

    本文更加会侧重从前端的角度,将整个universal link 部署应用到wap app中的一些策略和一些问题解决办法

    其实整个Universal Link没啥难的,真正上线过Universal link的人这些应该都趟过一遍了,本文主要是我们team去应用Universal link的时候一些文档沉淀和记录

    Schema VS Universal Link

    Deeplink相关的技术,在wap中唤起app其实应用最最广泛的并不是Universal Link,而是直接Schema跳转

    1
    location.href = 'schema://xxxx'

    并且一般各大APP都会给自己做一套路由体系,这样其实可以直接在schema头后面对接路由体系,做到一行schema定位打开任意App内功能界面(我就不详细扯路由的事了)

    1
    2
    3
    4
    5
    6
    - (BOOL)application:(UIApplication *)application openURL:(NSURL *)url sourceApplication:(NSString *)sourceApplication annotation:(id)annotation {
    if ([[url absoluteString] hasPrefix:@"schema://"]) {
    [[WKDispatcher sharedInstance] operationObjectFromRouteURL:[url absoluteString]];//路由
    return YES;
    }
    }

    如果单纯为了实现deeplink – 在WAP上打开App,并且传递来数据信息,定位App内的具体逻辑,那么Schema就够了,其实没必要上Universal Link,Schema相当于是很特殊的Url,他是schema://xxx这种样子,如果安装了APP才能支撑跳转这种Schema Url,如果没安装APP就没任何效果,而Universal Link则是把普通url,长http://xxx.xxx.xxx/xxx这样的Normal Url,如果安装了App,就能像Schema一样传递给App,延续App内逻辑,如果没装App,则还会继续在浏览器里跳转这个Normal Url

    Schema的弊端

    Schema无法判断是否安装App

    一定会有这样的产品需求的:

    • 如果已经安装App,则打开App
    • 如果没有安装App,则前往下载App

    浏览器实际上是没有能力判断手机里是否安装了某个App的,所以聪明的程序员们选择了讨巧的方法

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    try {
    var appSchema = 'schema://xxxx';
    if ($.os.ios) {
    location.href = openNALocation; //location.href 打开schema
    }
    else {
    $('body').append('<iframe src="' + appSchema + '" style="display:none"></iframe>'); //iFrame 打开 schema
    }
    }catch (e) {}
    //延迟1000秒
    setTimeout(function () {
    if ($.os.ios) {
    location.href = `https://itunes.apple.com/us/app/idxxxxxxx?mt=8`;
    }
    else {
    location.href = `https://xxx.xxx.xxx/xxx/xxx.apk`;//直接apk下载link
    }
    },1000
    • 首先发起跳转Schema
      • 如果没安装App,会打开App失败,没效果
      • 如果安装App,会成功打开App
    • 延迟1000ms
      • 如果没安装App,Schema打开失败,等1000秒后会自动跳转
      • 如果安装App,App会打开,当前网页会被暂停,这延迟代码不会执行

    聪明的人会发现,这样有个风险,如果用户打开APP成功后,又手动切回浏览器,那么延迟1000ms的代码依然会执行,安卓会跳出下载apk包得提示,iOS会又再度跳到Appstore,但这个瑕疵也不是太大的问题,所以这种做法被普遍采用,运用在各种安装就跳转,不安装就下载的用户场景。

    安卓这么用挺好,iOS有个讨厌的弹框

    如果用户没有安装App,那么他一定会经历2个事情

    • schema打开app,但是失败
    • 延迟后,跳转下载App

    在第一个环节,安卓上schema打开失败,没有任何反映,也没有任何提示,一切顺利,但是iOS就不同了。

    schema会弹个可恶的跳转失败的框
    1504334347900

    然后再延迟后弹跳转AppStore的框
    1504334376521

    Schema被很多App禁止,比如微信手百

    Schema被广泛使用,从浏览器中唤起打开专门的App,但这并不被很多App认可,比如微信手机百度,他们本身除了浏览网页以外有其他的使用场景,所以站在微信/手百的角度,并不希望用户为了看一些分享和内容就跳出微信/手百的App,于是这些客户端拦截了Schema,使得所有Schema都无法生效。

    于是不得已,广大开发者只好针对,微信/手百,等特殊UA信息,展现出蒙层,引导用户用系统/外部浏览器打开

    Universal Link 解决 Schema的弊端

    开篇就说了,如果你单纯为了能让wap打开App,Schema就能做到了,Universal Link的意义则是把普通url,也赋予了能打开App的能力,而不必编写专门的Schema Url去唤起App

    Schema 的2个弊端确实能通过Universal Link解决

    不同于Schema,在没装App的时候,Universal Link他也是一个合法的url链接,浏览器可以正常跳转,因此不会出现在iOS上讨人厌的框

    Universal Link目前还没有基于iOS的UI/WKWebView的应用进行拦截,所以目前看还是能突破微信/手百的封锁。(以后,不好说啊~)

    Universal Link 开发

    类似的话题,随便搜搜Universal Link能搜到一大堆,我这里就略微多啰嗦两句,一般各大教程里会反复说的,我尽量一带而过,多说点我遇到的坑

    配置apple-app-association

    究竟哪些的url会被识别为Universal Link,全看这个apple-app-association文件
    Apple Document UniversalLinks.html

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

    怎么写json其实没啥可教的,满世界的文章都教你咋写了,我们看个例子,点下面的链接,你的浏览器就会自动把知乎的apple-app-association的json file给down下来

    知乎的 apple-app-association 文件

    划重点

    有心人可能看到,知乎的Universal Link配置的是 oia.zhihu.com 这个域名,并且对这个域名下比如/answers /questions /people 等urlpath进行了识别,也就是说,知乎的universal link,只有当你访问 https://oia.zhihu.com/questions/xxxx,在移动端会触发Universal Link,而知乎正经的Urlhttps//www.zhihu.com/questions/xxx是不会触发Universal Link的,知乎为什么制作,为什么不把他的主域名配置Universal Link,这是由于Universal Link的一个大坑所致

    PS.

    apple-app-association 你可以看完全了知乎的json file,会发现里面也不止是 universal link

    苹果的一些其他功能都和apple-app-association有关,都需要配置这个文件,增加更多json字段信息

    比如Hand off 还有一些跨Web&App的分享

    测试是否正确

    苹果官方提供了一个网站来测试你配置的域名apple-app-association是否正常work

    https://search.developer.apple.com/appsearch-validation-tool/

    这个网站有点SB,就是你用他测试不通过,其实Universal Link也可能不生效的,比如我把知乎的oia.zhihu.com输入进去,他就没感应到,认为没有。我搜索的时候,发现也有人发现了这个问题,反正可以当个参考

    配置iOS App工程

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

    1
    2
    3
    4
    5
    6
    7
    8
    #pragma mark Universal Links
    - (BOOL)application:(UIApplication *)application continueUserActivity:(NSUserActivity *)userActivity restorationHandler:(void (^)(NSArray * _Nullable))restorationHandler {
    if ([userActivity.activityType isEqualToString:NSUserActivityTypeBrowsingWeb]) {
    NSURL *webUrl = userActivity.webpageURL;
    [self handleUniversalLink:webUrl]; // 转化为App路由
    }
    return YES;
    }

    恩比较千篇一律,我不多说了

    Universal Link的基本运作流程

    • APP第一次启动 or APP更新版本后第一次启动
    • APP向工程里配置的域名发起Get请求拉取apple-app-association Json File
    • APP将apple-app-association注册给系统

    • 由任意webview发起跳转的url,如果命中了apple-app-association注册过的通用链接

    • 打开App,触发Universal Link delegate
    • 没命中,webview继续跳转url

    在你进行apple-app-association 以及 App工程的配置之后,整个Universal Link的运作流程完全由系统控制了

    Universal Link 采坑

    整个Universal Link其实真要只是开发完成,完全写不了几行代码,就差不多搞定了,不过还真是踩了几个坑

    跨域

    前端开发经常面临跨域问题,恩Universal Link也有跨域问题,但不一样的是,Universal Link,必须要求跨域,如果不跨域,就不行,就失效,就不工作。(iOS 9.2之后的改动,苹果就这么规定这么设计的)

    这也是上面拿知乎举例子的时候重点强调的一个问题,知乎为什么使用oia.zhihu.com做Universal Link?

    • 假如当前网页的域名是 A
    • 当前网页发起跳转的域名是 B
    • 必须要求 B 和 A 是不同域名,才会触发Universal Link
    • 如果B 和 A 是相同域名,只会继续在当前WebView里面进行跳转,哪怕你的Universal Link一切正常,根本不会打开App

    是不是不太好理解,那直接拿知乎举例子

    https://www.zhihu.com/question/22914651

    知乎的一般网页URL都是www.zhihu.com域名,你在微信朋友圈看到了知乎的问题分享,如果copy url 你就能看到这样的链接

    微信里其实是屏蔽Schema的,但是你依然能看到大大的一个按钮App内打开,这确实就是通过Universal Link来实现的,但如果知乎把Universal Link 配在了www.zhihu.com域名,那么即便已经安装了App,Universal Link也是不会生效的。

    一般的公司都会有自己的主域名,比如知乎的www.zhihu.com,在各处分享传播的时候,也都是直接分享基于主域名的url,但为了解决苹果强制要求跨域才生效的问题,Universal Link就不能配置在主域名下,于是知乎才会准备一个oia.zhihu.com域名,专为Universal Link使用,不会跟任何主动传播分享的域名撞车,从而在任何活动WAP页面里,都能顺利让Universal Link生效。

    简单一句话

    • 只有当前webview的url域名,与跳转目标url域名不一致时,Universal Link 才生效

    apple-app-association 覆盖

    我们业务机房的集群是大部门下几条业务线共用的,有一整套云服务系统来进行机房集群的管理,有统一的接入层进行分发。虽然是不同的产品线,不同的服务,但是共享分布式的机房进行运作的。

    很多Universal Link的教学文章是这么写的

    • 将json命名为 apple-app-association 不要乱改名
    • 将file 上传到域名所在的服务器根目录下

    于是我就将我们文库的apple-app-association,上传到我准备的wenkuUniversal域名的所在机器的根目录下。(因为机房都是分布式的,所以其实就是upload的全部门下的很多机器上)

    同部门另一个产品线阅读后来也开始尝试Universal Link,也要把他们写好的apple-app-association上传到他们的yueduUniversal域名所在的机器的根目录下。

    因为都是同样的文件名,又因为整个事业部机器实际上是共用的,因此就发生了覆盖。

    解决办法

    • 共用同一个 apple-app-association

    因为apple-app-association的具体内容里有App 的Bundle ID在,因此可以简单的把2个json file 进行merge,你的App bundle 生效你的link,我的App bundle生效我的link

    但其实并不推荐,毕竟双方都要小心在更新的时候,不能覆盖对方,并且这样做也很不合理,apple-app-association也不止为universal link 一个feature工作,当面临跨app / web share 甚至hand off的时候,共用一个json file 还是有坑

    • 接入层分发不同json file

    2个产品线的link域名其实是不一样的,只不过恰巧这两个域名最重打到得机器是同一个或者说有重叠,因此产生了覆盖,完全可以将json文件保存成各自的名字,在接入层对域名进行分发

    最终App也是通过Get请求去拉取apple-app-association的,只要Get到,并且ssl安全性上符合要求(强制https)就没问题

    隐藏的坑:apple-app-association被覆盖后如何更新

    我们线上已经work的Universal Link功能,突然有一天发现坏了,查了一圈最后查到被阅读覆盖了,那就修复呗,修复倒是没问题,问题在于修复后的universal link,用户必须重新安装一次app,才能重新work,这个太坑了啊

    所以关键是需要掌握apple-app-association的更新时机,反复重新杀APP重开完全没用,删了APP重装确实有用,但不可能让用户这么去做

    https://stackoverflow.com/questions/35187576/does-the-apple-app-site-association-json-file-ever-get-updated-in-app

    这里解释了,每次App安装后的第一次Launch,会拉取apple-app-association,除此之外在Appstore每次App的版本更新后的第一次Launch,也会拉取apple-app-association。

    也就是说,一旦不小心因为意外apple-app-association,想要挽回又让那部分用户无感,App再发一个版本就好了

    Universal Link 会因为用户行为而失效

    Universal Link 触发后打开App,这时候App的状态栏右上角会有文字提示来自XXApp,可以点状态栏的文字快速返回原来的AP

    如果用户点了返回微信,就会被苹果记住,认为用户并不需要跳出原App打开新App,因此这个App的Universal Link会被关闭,再也无效。

    想要开启也不是不行,让用户重新用safari打开,universal link的页面,然后会出现很像苹果smart bar的东西,那个东西点了后就能打开(我是看到的,我没亲自操作过)

    Universal Link 业务部署

    知乎的apple-app-association可以看到里面有一大堆的WAP的URL,比如/answers /questions /people等,知乎都将它一一映射到App得对应界面里,问题/回答/人详情页。这是因为知乎的WAP站和APP的功能几乎是一致的。因此知乎的Universal Link的使用方式,可以说是很经典的遵循着苹果的原始设计初衷通用链接,将wap url,变成通用url,同样的url,对应着2个跳转,web跳转/app跳转,但是他们是同一个功能。

    我们产品线面临的情况不一样,我们的产品线文库,他的WAP和APP功能差异非常大,可以说除了文档阅读页/view,WAP与APP都有这个功能,其他的功能WAP是WAP的,APP是APP的,形态和场景都有明显差异。除了/view这个功能,我们可以按着通用链接的设计,将APP阅读页跳转,与WAP阅读页跳转进行统一。其他时候Universal Link对于我们业务来说就是一个更强大的Schema(突破旧Schema局限的=),他只需要跳转到APP,他没有合法的WAP Url可以让浏览器在没有安装App的情况下继续跳转。

    我们的Universal Link 业务部署

    我们的Universal Link就像知乎一样,没有选择我们的主域名,而是选了一个完全没在WAP上有任何页面和流量的域名,我们的apple-app-association是这么写的

    1
    2
    3
    4
    5
    {
    "appID": "xxxxxx.xxx.xxx.xxxxx",
    "paths":[ "/view/*",
    "/_iosuniversallink/*"]
    },

    我们的AppDelegate中具体handleUniversalLink的逻辑是这么写的

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    - (BOOL)handleUniversalLink:(NSURL *)url {
    NSURLComponents *components = [NSURLComponents componentsWithURL:url resolvingAgainstBaseURL:YES];
    NSString *host = components.host;
    if ([host isEqualToString:@"xxx.xxx.xxx"]) { //host判断,虽然没啥意义
    if (pathComponents.count >= 3) {
    //地址匹配+页面跳转
    NSString *router;
    if ([pathComponents[1] isEqualToString:@"view"]) {
    router = @"xxx";//生成打开APP阅读页的专属Router
    } else if ([pathComponents[1] isEqualToString:@"_iosuniversallink"]) {
    router = @"xxx";//解析出APP能识别的任意路由,
    }
    if (router && router.length > 0) {
    [[WKDispatcher sharedInstance] operationObjectFromRouteURL:router];//无论是阅读页路由还是任意路由,发起跳转
    }
    return YES;
    }
    }
    return NO;
    }

    可以看出来我只打开了这个域名下https://xxx.xxx.xxx/view/* 和 https://xxx.xxx.xxx/_iosuniversallink/*2个Universal Link Path.对没错,不像知乎那么多。

    • /view/* 后面的*直接是阅读页ID,用于快速生成阅读页路由,发起跳转
    • /_iosuniversallink/* 后面的*其实应该填写的是我们App已经设计好的路由字符串,识别出路由字符串后,发起跳转

    其实可以看出来/_iosuniversallink是完全包含/view的,因为APP阅读页天然也是包含在我们的路由规则内的,只要这里有路由策略,扩展力已经足够支持任意APP页面了,因此apple-app-association只配置了2个,但是如果有计划外的特殊case,大不了更新一下,也没多大事。

    为了统一WAP&APP,为了通用链接的效果

    我刚才提到,我们选择的Universal Link的域名其实是一个没有实际页面的域名,也就是说https://xxx.xxx.xxx/view/*这个url,如果没安装APP因此触发WebView继续跳转原地址,会直接404。处理很简单,重定向一下

    1
    2
    3
    4
    router.use('/view', function (req, res, next) {
    var path = req.path;
    res.redirect('https://wk.baidu.com/view' + path + '?st=1#1');
    });

    整个效果就是

    • 跳转https://xxx.xxx.xxx/view/*
      • 已安装App
        • 打开App 触发handleUniversalLink
        • 走到/view/分支,拼接阅读页路由
        • 跳转
      • 未安装App
        • WebView原地跳转https://xxx.xxx.xxx/view/*
        • 命中服务器的重定向逻辑
        • 重定向到https://wk.baidu.com/view/*
        • 打开我们的WAP阅读页

    这就是为啥明明/_iosuniversallink是完全包含/view能力的,但还是要把/view/单独处理的原因,为的是实现WAP与APP的统一设计,为了通用链接这个初衷

    不为统一WAP&APP 只拿来当强化版Schema使用

    同样的道理,https://xxx.xxx.xxx/_iosuniversallink/*这个url,也没有实际的页面,如果不进行重定向,也会直接返回404,因此看一眼重定向的代码

    1
    2
    3
    4
    router.use('/_iosuniversallink', function (req, res, next) {
    var redirecturl = 'https://wk.baidu.com/topic/naiosappstore';
    res.redirect(redirecturl);
    });

    解释一下https://wk.baidu.com/topic/naiosappstore就是我们为iOS下载App准备的专门的WAP单页面,这个页面打开后会自动延迟500ms,发起跳转appstore

    整个效果就是

    • 跳转https://xxx.xxx.xxx/_iosuniversallink/*
      • 已安装App
        • 打开App 触发handleUniversalLink
        • 走到/_iosuniversallink/分支,拼接出任意App内的界面路由
        • 跳转界面
      • 未安装App
        • WebView原地跳转https://xxx.xxx.xxx/_iosuniversallink/*
        • 命中服务器的重定向逻辑
        • 重定向到https://wk.baidu.com/topic/naiosappstore
        • naiosappstore页面会延迟跳转AppStore
        • 打开AppStore下载

    这个设计看起来就是完美解决了PM得需求

    • 如果已安装App,跳转对应界面
    • 如果没安装App,跳转App下载界面

    解决了旧Schema模式下的弊端问题:

    • Schema无法判断是否安装App,只能采用setTimeout的Trick方式
    • Schema的Trick方式会有一个丑陋的错误跳转弹框
    • Schema无法在微信/手百等App内,打开我们自己的App

    简单的说,这样设计的初衷就是,我不为了通用链接这一目的来使用Universal Link,来统一WAP&APP的URL跳转,我就为了把Universal Link当做加强版Schema来使用


    展开全文
  • 语言: swift, 版本:4.2,XCode:10.1 写作时间:2019-02-11 Scheme打开App 以前用Scheme方式打开app用类似于 taobao:// 这种方式,配置如下: 验证:在Safari输入链接:zscheme:// 就可以打开app ...

    语言: swift, 版本:4.2,XCode:10.1
    写作时间:2019-02-11

    Scheme打开App

    以前用Scheme方式打开app用类似于 taobao:// 这种方式,配置如下:
    在这里插入图片描述
    验证:在Safari输入链接:zscheme:// 就可以打开app
    在这里插入图片描述
    Alert提示host的内容, 在 AppDelegate.swift 添加如下代码:

    func application(_ app: UIApplication, open url: URL, options: [UIApplication.OpenURLOptionsKey : Any] = [:]) -> Bool {
            let message = url.host?.removingPercentEncoding
            let alertController = UIAlertController(title: "Incoming Message", message: message, preferredStyle: .alert)
            let okAction = UIAlertAction(title: "OK", style: .default, handler: nil)
            alertController.addAction(okAction)
            
            window?.rootViewController?.present(alertController, animated: true, completion: nil)
            
            return true
        }
    
    

    浏览器访问链接 textreader://Hello!, 打开APP显示如下:
    在这里插入图片描述

    scheme打开App的弊端

    1. 任何App都可以用同一个名字,有些钓鱼App如果被安装了,可能被欺骗。
    2. 没有安装App的情况下,跳转到安装页面需要通过JavaScript去判断,也就是必须打开网页,做进一步跳转。

    Universal Links说明

    iOS 9 以后可以用Universal Links 打开App。当用户点击关联的host网页,无感地打开已经安装好的App(无需打开Safari)。如果没有安装App,就会打开链接到的网站。

    Universal Links好处如下:

    1. Unique. Unlike custom URL schemes, universal links can’t be claimed by other apps, because they use standard HTTP or HTTPS links to your website.

    2. Secure. When users install your app, iOS checks a file that you’ve uploaded to your web server to make sure that your website allows your app to open URLs on its behalf. Only you can create and upload this file, so the association of your website with your app is secure.

    3. Flexible. Universal links work even when your app is not installed. When your app isn’t installed, tapping a link to your website opens the content in Safari, as users expect.

    4. Simple. One URL works for both your website and your app.

    5. Private. Other apps can communicate with your app without needing to know whether your app is installed.

    Demo工程下载

    下载地址:
    https://koenig-media.raywenderlich.com/uploads/2018/09/UniversalLinks.zip
    UniversalLinks.xcodeproj 运行如下:
    在这里插入图片描述

    Universal Links实现步骤

    1. App配置.

    配置bundleId, 必须为付费Apple developer, 否则没法测试。

    在这里插入图片描述

    配置Associated Domains 为网站的host,网站必须为HTTPS协议。

    applinks:universallinkszgpeace013001.herokuapp.com
    
    

    路径为: UniversalLinks project > UniversalLinks target > Capabilities tab > Associated Domains.
    在这里插入图片描述

    2. 创建JSON文件apple-app-site-association

    创建没有扩展名的JSON文件apple-app-site-association,格式如下,

    {
    	"applinks": {
    		"apps": [],
    		"details": [
    			{
    				"appID": "473VV338ZU.com.zgpeace.UniversalLinks",
    				"paths": [ "*"]
    			},
    			{
    				"appID": "473VV338ZU.com.zgpeace.UniversalLinksNew",
    				"paths": [ "*"]
    			}
    		]
    	}
    }
    
    

    applinks 表示app关联的网站信息。
    apps 为空数据.
    appID 由team ID和app’s bundle ID构成. (473VV338ZU.com.zgpeace.UniversalLinks 需要改为你的信息才能用)
    点击链接查看team ID信息 > Membership:
    在这里插入图片描述
    paths 为app和网站可以关联的host,如果为通配符*号,则表示整个网站都可以链接到app,如果指定paths,没有在范围内的则不跳转到app。

    3. 上传文件apple-app-site-association到HTTPS服务器

    没有HTTPS服务器,这里可以部署到免费的服务器Heroku。
    请fork Github地址:
    https://github.com/zgpeace/universal-links
    选择分支:final,
    在这里插入图片描述
    修改JSON配置文件apple-app-site-association的内容为你的信息,保存
    在这里插入图片描述

    编辑 README.md文件的部署链接为你fork下来的链接,注意是final分支,保存
    在这里插入图片描述
    最后,点击README.md 的部署按钮,部署到Heroku服务器即可。
    在这里插入图片描述
    笔者部署的链接为:https://universallinkszgpeace013001.herokuapp.com/
    在这里插入图片描述
    配置文件的内容可以通过链接访问:https://universallinkszgpeace013001.herokuapp.com/apple-app-site-association

    {
    	"applinks": {
    		"apps": [],
    		"details": [
    			{
    				"appID": "473VV338ZU.com.zgpeace.UniversalLinks",
    				"paths": [ "*"]
    			},
    			{
    				"appID": "473VV338ZU.com.zgpeace.UniversalLinksNew",
    				"paths": [ "*"]
    			}
    		]
    	}
    }
    
    

    4. APP接收跳转过来的事件

    AppDelegate.swift 增加下面的方法1:

    func presentDetailViewController(_ computer: Computer) {
      let storyboard = UIStoryboard(name: "Main", bundle: nil)
      
      guard 
        let detailVC = storyboard
          .instantiateViewController(withIdentifier: "DetailController")
            as? ComputerDetailController,
        let navigationVC = storyboard
          .instantiateViewController(withIdentifier: "NavigationController")
            as? UINavigationController 
      else { return }
      
      detailVC.item = computer
      navigationVC.modalPresentationStyle = .formSheet
      navigationVC.pushViewController(detailVC, animated: true)
    }
    
    

    代码解析:上面方法处理子页面的展示,present model的方式。

    AppDelegate.swift 增加下面的方法2:

    func application(
      _ application: UIApplication,
      continue userActivity: NSUserActivity,
      restorationHandler: @escaping ([UIUserActivityRestoring]?
    ) -> Void) -> Bool {
      
      // 1
      guard userActivity.activityType == NSUserActivityTypeBrowsingWeb,
        let url = userActivity.webpageURL,
        let components = URLComponents(url: url, resolvingAgainstBaseURL: true) else {
          return false
      }
      
      // 2
      if let computer = ItemHandler.sharedInstance.items
        .filter({ $0.path == components.path}).first {
        presentDetailViewController(computer)
        return true
      }
      
      // 3
      if let webpageUrl = URL(string: "http://rw-universal-links-final.herokuapp.com") {
        application.open(webpageUrl)
        return false
      }
      
      return false
    }
    
    

    代码解析:

    1. 先校验userActivity是否为预期的字符. 最终你需要获取path的内容,跳转到相应的页面. 否则,你需要返回false,表示app不能处理该事件.

    2. 用path去查找对应的页面处理,present相应的detail View展示,返回true.

    3. 如果没有找到匹配的path,则用Safari打开URL.

    验证

    链接:https://universallinkszgpeace013001.herokuapp.com
    因为url打开App需要跨域,验证可以把链接发送到邮箱,点击邮箱链接就可以打开。(如果把链接直接在Safari里面打开,是不会跳转的)

    Limitations
    Keep in mind that Safari will not attempt to launch the app if it is already on the same domain according to Apple’s documentation:
    When a user is browsing your website in Safari and they tap a universal link to a URL in the same domain as the current webpage, iOS respects the user’s most likely intent and opens the link in Safari. If the user taps a universal link to a URL in a different domain, iOS opens the link in your app.
    For users who are running versions of iOS earlier than 9.0, tapping a universal link to your website opens the link in Safari.
    You will need to either expose a url with a different domain (i.e. deeplink.example.com) or use a third-party service like branch.io, which supports custom domains.

    实现了Universal Links, Safari打开网站,系统检测到APP已经安装,头部则会出现跳转的链接,点击链接即可打开。
    在这里插入图片描述
    注意:如果一个host的apple-app-site-association配置多个APP,则按照顺序遍历,遍历到则打开APP并退出遍历。

    总结

    恭喜你! 学会了Universal Links打开APP。

    项目地址:
    https://github.com/zgpeace/UniversalLinks

    项目的starter 和 finished 各自实现了一个universal links,验证了apple-app-site-association配置2个APP的情况。

    参考

    https://www.raywenderlich.com/6080-universal-links-make-the-connection
    https://www.appcoda.com/working-url-schemes-ios/
    https://developer.apple.com/library/archive/documentation/General/Conceptual/AppSearch/UniversalLinks.html

    展开全文
  • Universal Link 通用链接

    千次阅读 2017-10-23 18:34:51
    理解为苹果官方支持deeplink就行了   2.通过点击HTTP链接启动APP Web・iOS应用在支持Universal Link的前提下,当用户点击特点的链接时会自己起动应用 ・App已经安装的前提下:直接启动App然后现实链接...

    1.Universal Link

    理解为苹果官方支持deeplink就行了

     

    2.通过点击HTTP链接启动APP

    Web・iOS应用在支持Universal Link的前提下,当用户点击特点的链接时会自己起动应用

    ・App已经安装的前提下:直接启动App然后现实链接内容

    ・App没有安装的前提下:Web上继续显示链接内容

     

    3.Universal Link的实现方法

    首先需要准备一下内容

    Web服务器

       ・独立的domain

       ・SSL证书

     ・被签名的JSON文件

    iOS应用

      ・iOS9以上

      ・Xcode 7・iOS 9 SDK

      ・Capabilities

      ・AppDelegate的代理设置

     

    3.1 Capabilities的设置

    在Capabilities的设置中,设置`Associated Domains’的Domains内容

    例:https://www.facebook.com/ -> applinks:facebook.com

    注意:对于subdomain,www的有无要仔细考虑一下

     

    3.2 apple-app-site-association文件的配置

    apple-app-site-association文件一定要放在服务器的根目录下!!!!!!

    首先要准备一下apple-app-site-association文件

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    {
      "applinks": {
        "apps": [],
        "details": {
          "TBEJCS6FFP.com.domain.App": {
            "paths":[ "*" ]
          }
        }
      }
    }

     paths中的内容为对应App启动的链接路径

    全路径的时候使用“*”。

    特定位置的时候需要指定具体内容,

    1
    ["/wwdc/news/", /videos/wwdc/2015/*]

     TBEJCS6FFP.com.domain.App这部分使用的是你的TeamID和Bundle Identifier

     

    3.3 对apple-app-site-association文件的签名

    我使用的是以下的方法对apple-app-site-association进行签名。

    1
    cat apple-app-site-association-unsigned.js | openssl smime -sign -inkey g01-server.key -signer g01-server.crt -certfile  g01-dvcacert.cer -noattr -nodetach -outform DER > apple-app-site-association

     

    3.4 App对应的开发

    AppDelegate.m文件中添加以下代码

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    - (BOOL)application:(UIApplication *)application continueUserActivity:(NSUserActivity *)userActivity restorationHandler:(void (^)(NSArray * _Nullable))restorationHandler
    {
        NSLog(@"continueUserActiity enter");
        NSLog(@"\tAction Type : %@", userActivity.activityType);
        NSLog(@"\tURL         : %@", userActivity.webpageURL);
        NSLog(@"\tuserinfo :%@",userActivity.userInfo);
         
        NSLog(@"continueUserActiity exit");
        restorationHandler(nil);
         
        NSHTTPCookieStorage *sharedHTTPCookieStorage = [NSHTTPCookieStorage sharedHTTPCookieStorage];
        NSArray *cookies = [sharedHTTPCookieStorage cookiesForURL:userActivity.webpageURL];
     
         NSLog(@"COOKIE{name: %@", cookies);
        return true;
    }

     如代码所示,我们可以获取到跳转链接的一些基本信息

    URL内容,ActionType等都是可以获取并且在代码中进行修改的。

     

    4.结果

    通过以上的配置后,一个基础的Universal Link应用就开发结束了

    点击对应的链接我们可以看到自己的App被成功启动

     

    5.一些事实

    相同的服务器不同的目录结构可能导致Universal Link不启动

    应用和json文件同时更新时,json更新的部分可能会没有效果

     

    如果需要使用我的服务器和app进行测试的同时可以私信我。

    展开全文
  • 移动互联网时代,信息的分享传播无疑是 App 引流增长的关键,与其花费大量精力和成本找渠道、硬推广,不如从细节下手,用最快最简便的方法实现 Deeplink(深度链接)技术,打破信息孤岛、缩短分享路径、优化用户体验...

    移动互联网时代,信息的分享传播无疑是 App 引流增长的关键,与其花费大量精力和成本找渠道、硬推广,不如从细节下手,用最快最简便的方法实现 Deeplink(深度链接)技术,打破信息孤岛、缩短分享路径、优化用户体验,最终提高流量转化率和留存率。

    什么是 DeepLink(深度链接)技术

    如果把 App 看成网站,那么 DeepLink 就是网站中的深入页面,比如商品购物页面、活动促销页面。简单理解,就是当用户点击手机中的某个链接时,可以帮他跳转到 App 内部中的目标页面,直接实现场景还原,而不是 App 首页,这是一种无障碍场景还原技术。

    DeepLink 通常运用于App社交分享、App广告引流、App裂变活动、Web to App、分享效果统计、沉默用户唤醒等场景,对广告引流、活动推广、新闻类、电商类、游戏类、视频直播类App的引流推广和转化都有着奇效。

    升级版 Deferred deeplink(延迟深度链接)技术

    相比 Deeplink,Deferred deeplink 增加了一个判断,能在用户点击链接时判断设备是否安装了目标App,如果没有安装,则跳转应用市场或者浏览器中引导下载,用户安装后再次实现 Deeplink 的场景还原功能。

    是否使用这两项技术的差别:
    在这里插入图片描述
    可以看到,使用了深度链接后,用户操作成本明显降低了一至两步,做运营的小伙伴都知道,在用户转化的漏斗中,每多一个步骤,漏斗的路径就会多一层,用户流失率也就随之增加。

    怎样为App快速实现这两项技术

    我们以 openinstall 的一键拉起功能为例,这项功能集成了深度链接中的scheme,universal link等核心技术,能完美实现 Deeplink、Deferred deeplink 的所有技术场景效果,主要特点如下:

    • 一键拉起功能同时兼容 Android、iOS 系统,不存在操作系统技术障碍;
    • 适配了大量主流社交平台和浏览器,如微信、QQ、新浪微博、钉钉、支付宝等;
    • 用户已安装该 App 的情况下,点击页面链接可直接拉起本地 App,并自动进入目标页面;
    • 用户未安装该 App 的情况下,点击页面链接会引导到应用商店或默认浏览器下载,安装后首次打开将自动进入目标页面;
    • 该功能目前以及免费开放给所有开发者,随时可以到 openinstall 官网访问集成 SDK 使用,最快十分钟即可集成体验。

    openinstall:https://www.openinstall.io/pullUp.html
    在这里插入图片描述
    不仅如此,作为成熟的第三方供应商,openinstall 在深度链接的基础上,完善出了更多定制化场景需求,比如:

    • 能够根据需求满足开发者业务逻辑,如:既可实现下载优先,也可以实现拉起优先;
    • 在社交分享页面上,openinstall 还能同时实现携带参数安装,帮助开发者实现渠道来源统计,具体到用户是被哪篇文章吸引来的、哪个广告页面的转化率最高、哪件产品付费效果最好;
    • 甚至可以在业务上结合 openinstall 实现【社交平台快速下载 App、免填邀请码、App 安装后自动加群加好友、下载 App 后自动登录账号】等功能,进一步完善用户体验和关系链。

    哪些产品或场景非常适合深度链接

    社交平台我们以微信为例,产品以电商类京东 App、资讯类今日头条 App 为例,可以参考他们的结合效果:
    在这里插入图片描述
    在这里插入图片描述显而易见,电商类、资讯类、旅游类、服务类 App 结合社交分享传播具有非常大的价值,此外,游戏类 App 甚至可以利用一键拉起功能点击分享链接直接进入 App 内的游戏房间。

    常见使用场景如下:

    • 电商类:在分享商品链接中点击,进入 App 内对应店铺或购物页面
    • 资讯类:在分享新闻链接中点击,进入 App 内对应内容页面
    • 游戏类:在分享邀请组队的链接中点击,进入 App 内对应的游戏房间或战队队伍中
    • 广告:在社交平台点击相关广告,进入 App 内对应内容页面
    • 拉新活动:例如老带新邀请、福利抽奖等 H5 页面活动,参与者可以点击进入 App 内对应活动参与页面

    App 间的自由跳转,解决的不仅仅是用户体验问题,更是拓展 App 的应用宽度问题,有了深度链接后,App 之间不再是独立的个体平台,开发者可以在移动端再现网页端的自由跳转,将广告、活动营销、裂变拉新、用户唤醒等业务结合其中,创造一个更加完整、精简的转化链,能给 App 的运营和推广带来更多想象空间。

    展开全文
  • DeepLink的实现原理

    千次阅读 2018-09-06 17:32:30
    之前我们又是看源码又是研究动画,今天分享一个比较简单的技术点:DeepLinkDeepLink,深度链接技术,主要应用场景是通过Web页面直接调用Android原生app,并且把需要的参数通过Uri的形式,直接传递给app,节省...
  • deeplink

    2019-01-17 09:43:49
    1.创建一个html网页 注意:App打开的http网址需要用URL编码进行编码 &lt;!DOCTYPE html&gt; &lt;html&gt; &lt;head&gt;  &lt;meta http-equiv="Content-Type"...X
  • 客户端deeplink技术

    千次阅读 2018-04-16 18:34:29
    Deeplink,简单讲,就是你在手机上点击一个链接之后,可以直接链接到app内部的某个页面,而不是app正常打开时显示的首页。不似web,一个链接就可以直接打开web的内页,app的内页打开,必须用到deeplink技术。
  • 最新在做微信的移动端WAP支付,在非微信浏览器中,需要通过微信的H5支付方式来唤起微信支付客户端,实现是通过拼装一个DeepLink链接,并访问该链接达到唤起微信支付客户端,通过测试发现,存在浏览器兼容问题。...
  • 应用跳转(Deep Link

    万次阅读 2016-08-16 15:53:53
    前言: 接触到这个是因为项目需求。产品给的需求是这样的:在微信或者任何分享的链接中,打开我们自己app的任何一个页面。如果没安装就引导到应用市场或者appstore去安装,安装完打开应用再跳到指定页面。...
  • Android Deeplink配置

    千次阅读 2018-06-20 17:06:22
    Deeplink启动应用配置注意事项 1. Deeplink格式说明   Deeplink是目前使用广告跟踪非常热门的一种方式,Deeplink的链接类型一般是schema://host/path?params样式。 2. 为接收Deeplink配置intent-filter  ...
  • Android 通过 Intent Filter 和 scheme 实现与js交互,也称为 deep-link达到点击网页按钮打开App效果参考参考链接实现接下来结合具体的代码进行解析首先来看 网页端 js的实现按照stackoverflow上的说法,js中应该有一...
  • DeepLink(浏览器点击链接跳转到app)

    万次阅读 2016-09-27 16:32:31
    在AndroidManifest.xml中设置添加权限在Activity中添加intent-filter <action android:name="android.intent.action.
  • 先对DepplLink做一个简单的介绍:Android和ios都有一种叫做deeplink的功能,简单讲他就像一个判断,当你运行或者点击了这个唤起deeplink功能的某个控件,然后唤起了deeplink监听事件,它就会开始运行,检查你手机...
  • deepLink技术打开app内的某个页面

    千次阅读 2017-10-16 10:02:36
    现在很火的app上的deeplink技术,到底是什么? 2016-12-27 11:39技术 来源:魔窗合作伙伴[ 互联网数据官],第一家聚焦于基于数据和大数据的互联网营销、运营、产品和管理的中立平台。 原创好文授权发布于...
  • Android应用开发中使用deeplink

    千次阅读 2015-11-05 11:03:05
    一、如何为自己的App添加deeplink,让外部应用可以直接打开相关页面; 二、如何使用其他应用的deeplinkdeeplink:是一串URL 未完待续。。。。参考资料:...
  • Android Deeplink 功能实现

    万次阅读 2015-04-25 19:37:57
    要实现DeepLink功能
  • DeepLink唤醒App的简单实现方法

    千次阅读 2018-12-21 18:33:45
    DeepLink(深度链接技术),一般是通过Web页面调用原生App,并把需要的参数通过Uri的形式传递给App,主要使用方式有:两个App之间的广告、App的社交分享、页面跳转App、DSP广告投放、营销效果统计等。在App的运营...
  • 移动互联网时代,信息的分享传播无疑是 App 引流增长的关键,与其花费大量精力和成本找渠道、硬推广,不如从细节下手,用最快最简便的方法实现 Deeplink(深度链接)技术,打破信息孤岛、缩短分享路径、优化用户体验...
  • 5分钟搞懂Android DeepLink

    万次阅读 2016-12-29 19:33:05
    最近碰到了一个新的需求,用户在浏览器中打开分享出去的内容,如果该用户设备上有我们的客户端则打开客户端并且定位到当前文章,如果没有的话则进行下载。调研过程中遇到了不少的坑,这里share一下。...
  • Android DeepLink介绍与使用

    千次阅读 2018-11-19 09:37:53
    前段时间公司让调研一下DeepLink,说以后会用到,之前看了很久,并做了个demo,现整理一下,方便以后查阅,如果有幸帮助到其他人就更好了。 基本概念 Deep Link,又叫deep linking,中文翻译作深层链接。 简单地从...
1 2 3 4 5 ... 20
收藏数 15,268
精华内容 6,107
关键字:

deeplink