当前位置: 首页 > news >正文

深度跳转-scheme

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:nil
                                                  cancelButtonTitle:@"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 删除。 

相关文章:

  • 2022 全球 AI 模型周报
  • mac上使用svn
  • go-kit grpc调用及中间件封装
  • 求求你们了,别再乱用 parallelStream 了,速度竟然比 Stream 还要慢!!
  • 【机器学习】算法改进——小批量和软更新
  • JMX概念及实际开发应用【实现IP黑名单】
  • flask-sqlalchemy连接数据库
  • 在设计测试用例前你应该考虑的重点在哪里?
  • 5.Nodejs中的包、npm、第三方模块、package.json以及cnpm
  • 如何使用Google Analytics跟踪WordPress网站的用户参与度
  • 大型医院his系统源码 医院信息管理系统源码 C/S架构
  • EN 16069建筑物用隔热产品.工厂制造的聚乙烯泡沫(PEF)产品—CE认证
  • UE4 源码解析----引擎初始化流程
  • 叶酸PEG衍生物​DBCO-PEG-Folate,DBCO-PEG-FA,二苯基环辛炔-聚乙二醇-叶酸
  • 【dll】windows下使用vs编译动态链接库dll与使用
  • 【347天】每日项目总结系列085(2018.01.18)
  • Angular Elements 及其运作原理
  • Angular 响应式表单 基础例子
  • Debian下无root权限使用Python访问Oracle
  • Docker容器管理
  • emacs初体验
  • java2019面试题北京
  • java8-模拟hadoop
  • leetcode378. Kth Smallest Element in a Sorted Matrix
  • React中的“虫洞”——Context
  • Redis 懒删除(lazy free)简史
  • spring boot下thymeleaf全局静态变量配置
  • Spring核心 Bean的高级装配
  • Traffic-Sign Detection and Classification in the Wild 论文笔记
  • Vue实战(四)登录/注册页的实现
  • windows下mongoDB的环境配置
  • 后端_ThinkPHP5
  • 机器学习 vs. 深度学习
  • 基于遗传算法的优化问题求解
  • 开放才能进步!Angular和Wijmo一起走过的日子
  • 理解在java “”i=i++;”所发生的事情
  • 排序算法学习笔记
  • 前端学习笔记之原型——一张图说明`prototype`和`__proto__`的区别
  • 使用 5W1H 写出高可读的 Git Commit Message
  • 思考 CSS 架构
  • 在GitHub多个账号上使用不同的SSH的配置方法
  • CMake 入门1/5:基于阿里云 ECS搭建体验环境
  • ionic入门之数据绑定显示-1
  • # 20155222 2016-2017-2 《Java程序设计》第5周学习总结
  • #数学建模# 线性规划问题的Matlab求解
  • $(function(){})与(function($){....})(jQuery)的区别
  • $(selector).each()和$.each()的区别
  • (10)STL算法之搜索(二) 二分查找
  • (16)Reactor的测试——响应式Spring的道法术器
  • (3)nginx 配置(nginx.conf)
  • (day 2)JavaScript学习笔记(基础之变量、常量和注释)
  • (pojstep1.3.1)1017(构造法模拟)
  • (第27天)Oracle 数据泵转换分区表
  • (附源码)spring boot车辆管理系统 毕业设计 031034
  • (附源码)ssm考试题库管理系统 毕业设计 069043