• 深度跳转-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 的跳转

    1. #pragma mark - DemoA -> DemoB
    2. - (IBAction)jumpToDemoB:(id)sender {
    3. NSString *urlString = @"demobscheme://";//没有参数
    4. NSURL *url = [NSURL URLWithString:urlString];
    5. if ([[UIApplication sharedApplication] canOpenURL:url]) {
    6. [[UIApplication sharedApplication] openURL:url options:@{} completionHandler:^(BOOL success) {
    7. }];
    8. }
    9. else {
    10. [self showMessage:@"没有该应用"];
    11. }
    12. }

    在 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 页面的标识符

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

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

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

    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 删除。 

  • 相关阅读:
    1.2 什么是eBPF?(下)
    Nginx安装与虚拟主机配置shell脚本
    2.1.3 面向对象:类的方法(一)(Python)
    数仓建模—数仓架构发展史
    neo4j入门并使用案例说明
    EFLK日志平台(filebeat-->kafka-->logstash-->es-->kiabana)
    Linux Driver优化S4 hibernate休眠速度
    【小技巧】获取matlab中cdfplot函数的x轴,y轴的数值
    冷热电气多能互补的微能源网鲁棒优化调度附Matlab代码
    Python系列(20)—— 排序算法
  • 原文地址:https://blog.csdn.net/weixin_42232156/article/details/126662228