1. 什么是 scheme ?

我们都知道苹果手机中的APP都有一个沙盒,APP就是一个信息孤岛,相互是不可以进行通信的。但是iOS的APP可以注册自己的URL Scheme,URL Scheme是为方便app之间互相调用而设计的。我们可以通过系统的OpenURL来打开该app,并可以传递一些参数
URL Scheme必须能唯一标识一个APP,如果你设置的URL Scheme与别的APP的URL Scheme冲突时,你的APP不一定会被启动起来。因为当你的APP在安装的时候,系统里面已经注册了你的URL Scheme。 一般情况下,是会调用先安装的app。但是iOS的系统app的URL Scheme肯定是最高的。所以我们定义URL Scheme的时候,尽量避开系统app已经定义过的URL Scheme。

2. scheme 用来做什么?

  • 应用 A 跳转到应用 B
  • 从应用 B 返回到应用 A
  • 从 warp 页唤起 APP
  • 跳转到指定页面
  • 唤起应用传参数

3. scheme 怎么用 ?

  • 方法一

在 TARGETS -> Info -> URL Types 点击添加

  • 方法二

在info.plist中右击,选中,Add Row选项,然后输入URL types,类型为 Array

URL Identifier是自定义的 URL scheme 的名字,一般采用反转域名的方法保证该名字的唯一性,比如 com.DemoB.www,不过在iOS中打开一个应用程序只需要拿到这个应用程序的协议头(URL Scheme)即可,所以我们只需配置应用程序的协议头即可。一个应用是可以有多个URL Schemes的。

4. scheme 的实际使用

4.1 应用A跳转到应用B

这里创建了两个应用:DemoA 和 DemoBDemoB 注册了 Scheme 为 demobscheme,下面来实现 DemoA → DemoB 的跳转

#pragma mark - DemoA -> DemoB
- (IBAction)jumpToDemoB:(id)sender {NSString *urlString = @"demobscheme://";//没有参数NSURL *url = [NSURL URLWithString:urlString];if ([[UIApplication sharedApplication] canOpenURL:url]) {[[UIApplication sharedApplication] openURL:url options:@{} completionHandler:^(BOOL success) {}];}else {[self showMessage:@"没有该应用"];}
}

在 DemoA 中点击相应的按钮跳转到 DemoB,会发现并不能跳转,因为在iOS9 以后,如果使用 canOpenURL: 方法,该方法所涉及到的 URL Schemes 必须在 Info.plist 中将它们列为白名单,否则不能使用

在 Info.plist 中添加 LSApplicationQueriesSchemes字段,该字段对应的是数组类型,然后添加键值为DemoBScheme(DemoB的Scheme)

再次点击按钮就可以跳转到DemoB

4.2 跳转到指定页面

  1. 首先在 DemoB 中创建 PageOne 和 PageTwo 页面

在 DemoA 中的点击事件中,我们可以修改 urlString 为 demobscheme://page1,其中 demobscheme:// 是 DemoB 应用的 scheme ,page1 是与 DemoB 约定好的跳转到 PageOne 页面的标识符

#pragma mark - 跳转到pageOne页面
- (IBAction)jumpToPageOne:(id)sender {// demobscheme:// 是DemoB应用的scheme page1是与DemoB约定好的跳转到PageOne页面的标识符 // ?是分割符(当然也可以用其他符号作分割),在DemoB中通过分隔符来截取DemoA的scheme, demoascheme是自己的scheme,用来从DemoB跳转回来NSString *urlString = @"demobscheme://page1?demoascheme";   NSURL *url = [NSURL URLWithString:urlString];if ([[UIApplication sharedApplication] canOpenURL:url]) {[[UIApplication sharedApplication] openURL:url options:@{} completionHandler:^(BOOL success) {}];}else {[self showMessage:@"没有该应用"];}
}
  1. 在 DemoB 的解析跳转参数

在 appdelegatete 中实现 application:openURL:options: 方法

- (BOOL)application:(UIApplication *)app openURL:(NSURL *)url options:(NSDictionary<UIApplicationOpenURLOptionsKey,id> *)options {// 1.获取导航栏控制器UINavigationController *rootNav = (UINavigationController *)self.window.rootViewController;// 2.获得主控制器UIViewController *mainVc = [rootNav.childViewControllers firstObject];// 3.每次跳转前必须是在跟控制器(细节)[rootNav popToRootViewControllerAnimated:NO];if ([url.absoluteString containsString:@"page1"]) {//与DemoA约定好的字符PageOneViewController *page = [[PageOneViewController alloc] init];page.urlString = url.absoluteString;[mainVc.navigationController pushViewController:page animated:YES];}else if ([url.absoluteString containsString:@"page2"]) {PageOneViewController *page = [[PageOneViewController alloc] init];page.urlString = url.absoluteString;[mainVc.navigationController pushViewController:page animated:YES];}else {UIAlertView *alertView = [[UIAlertView alloc] initWithTitle:@"打开啦"message:[NSString stringWithFormat:@"scheme - %@,\n host -- %@,\n  query -- %@",url.scheme,url.host,url.query]delegate:nilcancelButtonTitle:@"OK"otherButtonTitles:nil];NSLog(@"query -- %@", url.query);[alertView show];}return YES;
}

4.3 通过网址打开app

网页打开app也是根据app的协议头(URL scheme)来区分打开的是哪一个app的,我们直接在浏览器上复制粘贴我们的url scheme ,系统会自动弹框提醒是否打开本应用,跟DemoA跳转到DemoB的跳转是一样的, 当然网页传参跟app跳转传参都是一样的格式.

4.4 通过URL传参

有的时候我们跳转到另一个app的时候需要传递一些参数,让另一个app根据我们传递的参数作出相应的行为
传参的格式如下:

"demobshcheme://?name=boss&num=10"

可以发现跟我们用get请求的接口是一样的,但是参数协议需要自己定义好,避免解析出错。

5. 相关第三方

自己去开发scheme的跳转,以及参数跳转,还有warp页面的跳转和传参,是一个比较费时、费力的事情
不过可以直接使用第三方SDK来简单快速实现,极光魔链JMLink 是一个轻量级、操作简单的深度跳转SDK。

  • 快速
  • 无需考虑适配问题
  • 无需定义参数解析协议
  • 无需繁琐测试
  • 只需定义自己参数即可

传送门:
极光魔链JMLink
魔链JMLink - iOS 集成指南
魔链JMLink - Android 集成指南
魔链JMLink - Web 集成指南

原创声明:本文系作者授权极光社区发表。如有侵权,请联系 stallonedll@sina.com 删除。

深度跳转-scheme相关推荐

  1. android h5页面跳转,android H5 应用内跳转Scheme协议

    什么是URL Scheme 概述: android中的scheme是一种页面内跳转协议,是一种非常好的实现机制,通过定义自己的scheme协议,可以非常方便跳转app中的各个页面:通过scheme协议 ...

  2. 整理一些常见的app跳转scheme url

    今天整理脚本时,发现存了挺多跳转app的代码,大部分是我在百度上搜索得来的,所以你们也不用问我获取方法了,用就完了.当然之前我也写过一个快手的提取scheme url的方法,想学的话在我公众号(3分钟 ...

  3. 如何从短信链接打开跳转到微信App内

    运营做了一个活动,准备发送短信推广出去,结果问题来了,用户接收到短信后,点击短信里的链接,默认是用的系统浏览器打开的,但我们的活动是用微信支付啊~~~微信支付啊~~~ 系统浏览器里不支持啊!!! 如何 ...

  4. 上亿数据怎么玩深度分页?兼容MySQL + ES + MongoDB

    面试题 & 真实经历 面试题:在数据量很大的情况下,怎么实现深度分页? 大家在面试时,或者准备面试中可能会遇到上述的问题,大多的回答基本上是分库分表建索引,这是一种很标准的正确回答,但现实总是 ...

  5. Android 优秀文章收集整理集合

    转载 自    https://github.com/jiang111/awesome-android-tips 记录自己遇到的比较有价值的Android相关的blog MaHua是online md ...

  6. Android优秀文章收集(转载)

    http://blog.csdn.net/u010375364/article/details/52200425 http://blog.csdn.net/u010375364/article/det ...

  7. [转]Android产品研发(十九)

    转载请标明出处:一片枫叶的专栏 上一篇文章中我们讲解了webview中问题集锦,讲解了webview的性能优化.webview种入Cookie信息.activity退出的时候清除webview信息报错 ...

  8. 如何控制if跳出_Wasm介绍之5:控制指令 | 火星技术帖

    免责声明:本文旨在传递更多市场信息,不构成任何投资建议.文章仅代表作者观点,不代表火星财经官方立场. 小编:记得关注哦 来源:CoinEx公链Talk WebAssembly(简称Wasm)控制指令一 ...

  9. Android产品研发(二十一)--Android中的UI优化

    转载请标明出处:一片枫叶的专栏 上一篇文章中我们讲解了Android产品研发过程中的代码Review.通过代码Review能够提高产品质量,增强团队成员之间的沟通,提高开发效率,所以良好的产品开发迭代 ...

  10. Android App links 链接打开app功能

    1.深链接Deep link(URI SCHEME协议) 深链接即我们通常说的scheme跳转,需要我们在清单文件中对activity添加intent-fillter,并定义scheme(包括但不限于 ...

最新文章

  1. ALTER PROFILE DEFAULT LIMIT PASS_LIFE_TIME UNLIMITED
  2. Objective-C Reflection(Objective-C 反射机制)实用随笔笔记(持续更新)
  3. 【Android 逆向】Android 进程注入工具开发 ( EIP 寄存器指向 dlopen 函数 | ESP 寄存器指向栈内存 | 调试程序收回目标进程控制权 )
  4. linux有三个查看文件的命令:more、cat、less
  5. Win7 + VS2015 + Python3.6编译
  6. ListBox combobox的常用功能
  7. Java高并发编程(八):Java并发容器和框架
  8. js格式化文件大小, 输出成带单位的字符串工具
  9. 电脑微信扫一扫在哪_怎么进入和管理企业微信的后台?
  10. sql oracle 自增长字段,Oracle添加自增长字段方法步骤
  11. 退休的姐妹们,你们还打工吗?
  12. 微信小程序——风水罗盘
  13. 题目477- A+B Problem III (陷阱题)
  14. 扩展模块已停止工作怎么解决_菲尼克斯Phoenix控制器电源模块维修检测免费
  15. 一次U盘文件变乱码的恢复
  16. 【算法刷题】排序:CodeForces 984A,CodeForces 1132B,CodeForces 1015C
  17. python中npy文件的读取与保存
  18. android上传图片被旋转,解决android有的手机拍照后上传图片被旋转的问题
  19. 使用pyhton采用多线程方式ping IP
  20. mysql+系统数据库+修复_如何进行mysql表的修复工作?

热门文章

  1. 逆战GOGO之微信小程序—点击商品列表进入详情页面
  2. java rgb yuv_RGB,CMY(K),YUV,YIQ,YCbCr顏色的轉換算法(java實現)
  3. 迭代局部搜索算法(Iterated local search)
  4. UVALive 6198 A Terribly Grimm Problem
  5. 电脑误删分区如何恢复?图文详解
  6. 那些年,我闯荡江湖的创业经历与感悟;分享给迷茫的你。
  7. awk 在指定字符后面插入新字符
  8. php面向对象编程的特性,什么是面向对象编程(OOP)?面向对象编程的特点
  9. svn process exited with error code: 1
  10. QScrollArea 动态添加控件问题