本文做者徐斌,原腾信IOS工程师,现LinkedME高级工程师。html
SandBox是什么?ios
SandBox(沙盒)机制规定应用程序只可以读取应用程序内部的数据,不能够访问其余应用的信息数据。在iOS设备中每个APP都有本身的储存空间APP只能访问本身的沙盒目录下内容,不能访问其它存储空间的内容。应用程序的数据请求须要通过权限检测,检测不经过则不执行。web
为何要使用沙盒机制?浏览器
SandBox是安全体系中的一种机制,从而苹果公司在设计iOS系统时,考虑应用之间的信息安全,对应用程序的访问权限设置限制。安全
沙盒机制有什么弊端?微信
使用沙盒机制后APP之间不能相互访问通讯,使得APP成为一个个的信息孤岛。dom
怎么解决这个问题?ide
为了解决APP信息孤岛问题,苹果在iOS 4中推出了URI Scheme技术,能够经过特定的URL方式传递参数给另外一个APP。
例如Uber://pid=3894&source=25,linkedmedemo:/ /id=2351。网站
怎么配置URI Scheme?ui
在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 文件,注意
上传到web server根目录下;
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 里处理通用连接
添加域名到 Capabilities在 Xcode 的 capabilities 里 添加你的 APP 域名,必须用 APPlinks: 前置它
APP从上面的域名请求Step2中建立的JSON 文件 APPle-APP-site-association。当你第一次启动 APP,它会从 https://domain.com/APPle-APP-site-association 下载这个文件。
在 APPDelegate 里支持通用连接实现:- (BOOL)APPlication:(UIAPPlication *)APPlication continueUserActivity:(NSUserActivity *)userActivity restorationHandler:(void (^)(NSArray*restorableObjects))restorationHandler
方法。
当 userActivity 是 NSUserActivityTypeBrowsingWeb 类型, 则意味着它已经由通用连接 API 代理。这样的话, 它保证用户打开的 URL 将有一个非空的 webpageURL 属性。
移动应用实现深度连接须要考虑很是多复杂的状况,好比支持各类手机机型、移动操做系统、浏览器、系统版本等等,还要考虑到深度连接统计分析的诸多问题。这些问题都是创建在用户已经安装APP,若是没有安装APP,用户下载安装,打开APP是否可以看到对应的页面,将是很是困难的问题。
咱们正致力于为移动开发者提供稳定、安全、免费的技术服务,帮助APP提升用户增加,当拥有APP拥有流量以后,帮助APP实现流量变现。
参考链接