文档章节

LinkedME|Deep Linking技术你真的了解吗?

LinkedME
 LinkedME
发布于 2016/07/12 11:08
字数 1764
阅读 31
收藏 0

本文作者徐斌,原腾信IOS工程师,现LinkedME高级工程师。

 

  • SandBox是什么? 

SandBox(沙盒)机制规定应用程序只能够读取应用程序内部的数据,不可以访问其他应用的信息数据。

  1. 在iOS设备中每一个APP都有自己的储存空间
  1. APP只能访问自己的沙盒目录下内容,不能访问其它存储空间的内容
  1. 应用程序的数据请求需要经过权限检测,检测不通过则不执行

  • 为什么要使用沙盒机制? 

SandBox是安全体系中的一种机制,从而苹果公司在设计iOS系统时,考虑应用之间的信息安全,对应用程序的访问权限设置限制。


  • 沙盒机制有什么弊端? 

使用沙盒机制后APP之间不能相互访问通信,使得APP成为一个个的信息孤岛。


  • 怎么解决这个问题? 

为了解决APP信息孤岛问题,苹果在iOS 4中推出了URI Scheme技术,可以通过特定的URL方式传递参数给另一个APP。例如Uber://pid=3894&source=25,linkedmedemo:/ /id=2351。


  • 怎么配置URI Scheme? 

在iOS工程中,打开Info.plist文件,添加URL Types节点即可。在这个节点里,可以自定义协议名称,如linkedmedemo,这个形式的 URI 就会关联到唯品会客户端。众多开发者对URI Scheme已经不再陌生,通常在集成社会化分享组件或深度链接技术服务(知名品牌有友盟和LinkedME)时,必须填写URI Scheme。


  • 代码实现 

在 Info.plist 里面设置完 URL types 之后,就可以在程序中处理这类 URL 的打开请求。在外部程序中,如果打开了指定自定义协议的 URL,程序中 APPlication delegate 的 APPlication:handleOpenURL: 方法就会被调用,在这个方法里,可以获取到触发这个方法的 URL,可以通过对这个URL进行判断,例如根据不同的Host,不同的 Query String 来执行不同的动作。

- (void)APPlication:(UIAPPlication *)APPlication handleOpenURL:(NSURL *)url {
   // 在 host 等于 list.vip.com,说明这是唯品会的宝贝详情url,
   // 那么就使用本地的 TBItemDetailViewController 来显示
   if ([[url host] isEqualToString:@"list.vip.com"]) {
       // 这里只是简单地假设 url 形式为 vip://list.vip.com/item.htm?id=xxxxx
       // 先获取要查看的宝贝详情的 itemId
       NSString *itemId = [[url query] substringFromIndex:[[url query] rangeOfString:@"id="].location+3];
       // 使用本地 ViewController 来显示详情
       VipItemDetailViewController *controller = [[VipItemDetailViewController alloc] initWithItemId:itemId];
       [self.navigationController pushViewController:controller animated:YES];
   }
} 

 

  • URL构建 
- (void)showItemInVipForiOS:(NSString *)itemId {

   // 构建客户端协议的 URL
   NSURL *url = [NSURL URLWithString:[NSString stringWithFormat:@"vip://list.vip.com/item.htm?id=%@", itemId]];
   // 判断当前系统是安装客户端
   if ([[UIAPPlication sharedAPPlication] canOpenURL:url]){
       // 如果已经安装客户端,就使用客户端打开链接
       [[UIAPPlication sharedAPPlication] openURL:url];
   } else {
       // 否则使用 Mobile Safari 或者内嵌 WebView 来显示
       url = [NSURL URLWithString:[NSString stringWithFormat:@"http://list.vip.com/item.htm?id=%@", itemId]];
       [[UIAPPlication sharedAPPlication] openURL:url];
   }
} 

注意:当前唯品会客户端并不支持这样的调用方式,这里仅是一个示例。


  • URI Scheme存在的问题? 

URI Scheme能够实现APP与APP之间的关联,并且是无缝的。例如QQ音乐跳转全民K歌,礼物说跳转淘宝等等。由于H5相对于APP轻量,H5和APP要兼并开发。然而,从微信和微博的内置浏览器查看H5页面时,大部分APP不能够回到APP查看相同的内容。例如知乎、今日头条是可以的。它们需要从Safari打开zhihu://id=2370247&source=zhig才行。

通过Safari跳转,如果用户已安装APP直接跳转到APP中,如果用户没有安装APP则跳转到APP Store中下载,下载完成后打开APP不能到达用户需要的页面。


  • 怎么解决这些问题呢? 

苹果在iOS 9中推出Universal Links(通用连接) 一种能够方便的通过传统 HTTPS 链接来启动 APP, 使用相同的网址打开网站和 APP。

通过唯一的网址, 不需要特别的URI Scheme就可以链接一个特定APP里面的视图 。比如:一个APP分享内容到微信,然后用户在微信内置浏览器中看到H5页面内容,然后用户触发Universal Links后,直接打开APP内相同的页面内容。

NOTE

Universal links let iOS 9 users open your APP when they tap links to your website within WKWebView andUIWebView views and Safari pages, in addition to links that result in a call to openURL:, such as those that occur in Mail, Messages, and other APPs.

For users who are running versions of iOS earlier than 9.0, tAPPing a universal link to your website opens the link in Safari. 


  • 怎么使用 Universal Links? 

Step1:创建一个JSON 格式的APPle-APP-site-association 文件如下:

{
     "APPlinks": {
         "APPs": [],
         "details": [
             {
                 "APPID": "9JA89QQLNQ.com.APPle.wwdc",
                 "paths": [ "/wwdc/news/", "/videos/wwdc/2015/*" ]
             },
             {
                 "APPID": "TeamID.BundleID2",
                 "paths": [ "*" ]
             }
         ]
     }
 } 

根据 paths 键设定允许的路径列表, 或只是一个星号如果你想打开 APP 而不管路径是什么。

注意:paths 路径是大小写敏感的

NOTE:The website paths you specify in the paths array are case sensitive.” 

“APPID”组成部分:TeamID + BundleId TeamID可以从苹果开发账号页面“Your Account”下查看,BundleId就直接在工程里看了。

 

Step2:上传 APPle-APP-site-association 文件注意:

1、上传到web server根目录下;

2、web server 需要支持https,客户端需要通告https访问,并且不支持任何重定向;

upload it to the root of your HTTPS web server. The file needs to be accessible via HTTPS—without any redirects—at https:///APPle-APP-site-association. Next, you need to handle universal links in your APP. 

 

Step3:在 APP 里处理通用链接

1、添加域名到 Capabilities在 Xcode 的 capabilities 里 添加你的 APP 域名, 必须用 APPlinks: 前置它

 

APP从上面的域名请求Step2中创建的JSON 文件 APPle-APP-site-association。当你第一次启动 APP,它会从 https://domain.com/APPle-APP-site-association 下载这个文件。

2.在 APPDelegate 里支持通用链接

​实现: - (BOOL)APPlication:(UIAPPlication *)APPlication continueUserActivity:(NSUserActivity *)userActivity restorationHandler:(void (^)(NSArray *restorableObjects))restorationHandler方法。

当 userActivity 是 NSUserActivityTypeBrowsingWeb 类型, 则意味着它已经由通用链接 API 代理。这样的话, 它保证用户打开的 URL 将有一个非空的 webpageURL 属性。


移动应用实现深度链接需要考虑非常多复杂的情况,比如支持各种手机机型、移动操作系统、浏览器、系统版本等等,还要考虑到深度链接统计分析的诸多问题。这些问题都是建立在用户已经安装APP,如果没有安装APP,用户下载安装,打开APP是否能够看到对应的页面,将是非常困难的问题。

我们正致力于为移动开发者提供稳定、安全、免费的技术服务,帮助APP提高用户增长,当拥有APP拥有流量之后,帮助APP实现流量变现。

 

 

参考连接 

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

2.http://blog.csdn.net/ba_jie/article/details/6884818

3.https://www.linkedme.cc/

4.https://developer.APPle.com/library/ios/documentation/General/Conceptual/APPSearch/UniversalLinks.html#//APPle_ref/doc/uid/TP40016308-CH12-SW2

© 著作权归作者所有

LinkedME
粉丝 0
博文 4
码字总数 4283
作品 0
私信 提问
加载中

评论(1)

LinkedME
LinkedME 博主
LinkedME——企业级深度链接服务平台(https://www.linkedme.cc)
Deep Linking技术你知道吗

本文作者徐斌,原腾信IOS工程师,现LinkedME高级工程师。 SandBox是什么? SandBox(沙盒)机制规定应用程序只能够读取应用程序内部的数据,不可以访问其他应用的信息数据。 在iOS设备中每一...

LinkedME
2016/07/11
0
0
谈谈分享邀请奖励机制(附iOS实现代码)

2017.03.14 以后不做标题党了,感觉现在越来越多的技术文章题目屌炸天,内容空泛没有干货,甚至好多把官方文档摘过来,还摘得不全,简直是垃圾。虽然我现在写不出牛逼的文章,但是我最起码不...

si1ence
2018/10/24
0
0
flex 深度连接(url 地址# fragment处理)

【问题摘要】怎样通过URL来重制Flex状态(state)? (How do you recreate a Flex application state using an URL?) 【解决方法】深度链接(Deep Linking)为Flex应用程序的URL定位提供支...

BondZhan
2013/12/03
810
0
iOS App与浏览器深度链接

概念介绍 1.深度链接(Deep Linking) 深度链接即通过手机浏览器或者微信、QQ等第三方启动自己原生应用,进而跳转到指定页面或者处理指定逻辑。 2.延迟深度链接(Deferred Deep Linking) 是指...

LvesLi
2017/08/11
0
0
Swagger UI 3.2.1 发布,API 在线文档生成利器

Swagger UI 3.2.1 已发布,这是一款 API 在线文档生成和调试工具。 更新内容如下: Feature: OAS3 API 定义可控制 Try-It-Out 请求的 Accept header (via #3669) Bugfix: 模型属性现在按定义...

王练
2017/09/21
3.9K
5

没有更多内容

加载失败,请刷新页面

加载更多

OSChina 周六乱弹 —— 早上儿子问我他是怎么来的

Osc乱弹歌单(2019)请戳(这里) 【今日歌曲】 @凉小生 :#今日歌曲推荐# 少点戾气,愿你和这个世界温柔以待。中岛美嘉的单曲《僕が死のうと思ったのは (曾经我也想过一了百了)》 《僕が死の...

小小编辑
今天
778
11
Excption与Error包结构,OOM 你遇到过哪些情况,SOF 你遇到过哪些情况

Throwable 是 Java 中所有错误与异常的超类,Throwable 包含两个子类,Error 与 Exception 。用于指示发生了异常情况。 Java 抛出的 Throwable 可以分成三种类型。 被检查异常(checked Exc...

Garphy
今天
15
0
计算机实现原理专题--二进制减法器(二)

在计算机实现原理专题--二进制减法器(一)中说明了基本原理,现准备说明如何来实现。 首先第一步255-b运算相当于对b进行按位取反,因此可将8个非门组成如下图的形式: 由于每次做减法时,我...

FAT_mt
昨天
6
0
好程序员大数据学习路线分享函数+map映射+元祖

好程序员大数据学习路线分享函数+map映射+元祖,大数据各个平台上的语言实现 hadoop 由java实现,2003年至今,三大块:数据处理,数据存储,数据计算 存储: hbase --> 数据成表 处理: hive --> 数...

好程序员官方
昨天
7
0
tabel 中含有复选框的列 数据理解

1、el-ui中实现某一列为复选框 实现多选非常简单: 手动添加一个el-table-column,设type属性为selction即可; 2、@selection-change事件:选项发生勾选状态变化时触发该事件 <el-table @sel...

everthing
昨天
6
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部