(0089)iOS开发之iOS应用间相互跳转(URL Scheme)

需求:假设有应用A和应用B两个应用,现在需要从应用A跳转到应用B中。如果手机中没有安装跳到下载页,如果已经安装直接打开APP。

认识URL Scheme

URL Schemes是苹果给出的用来跳转到系统应用或者跳转到别人的应用的一种机制。同时还可以在应用之间传数据。所以想要打开别人的APP或者让别人打开我们的APP,那就需要通过URL Schemes了!

1、一些概念的补充
协议:双方互相遵守的一种规范,只有遵守共同的协议规范才能进行彼此的通信。比如我们最熟悉的网络协议——http协议。
URL:资源的路径或地址。在IOS中有一个专门用于包装资源路径的类——NSURL。
一个完整URL的组成

例如:http://123.0.0.1/path?page=100
“http://”:协议类型
“123.0.0.1”:服务器ip地址
“/path”:资源存放的是路径
“page=100”:请求的参数

NSURL包装一个完整地址

  NSURL *url = [NSURL URLWithString:@"http://123.0.0.1/path?page=100"];
  NSLog(@"scheme(协议):%@",url.scheme);
  NSLog(@"host(域名):%@",url.host);
  NSLog(@"path(路径):%@",url.path);
  NSLog(@"query(参数):%@",url.query);

打印结果如下:

2016-12-02 14:50:38.442 TestDemo[5632:406869] scheme(协议):http
2016-12-02 14:50:38.442 TestDemo[5632:406869] host(域名):123.0.0.1
2016-12-02 14:50:38.442 TestDemo[5632:406869] path(路径):/path
2016-12-02 14:50:38.442 TestDemo[5632:406869] query(参数):page=100
2、跳转的原理

在iOS中,从一个app打开另一个app,实际上是两个app之间的交互和通信。我们知道一些跳转系统应用的用法:

//拨打系统电话
 NSURL *url = [NSURL URLWithString:@"tel://10086"];
 [[UIApplication sharedApplication] openURL:url];

//发送系统短信
 NSURL *url = [NSURL URLWithString:@"sms://1383838438"];
 [[UIApplication sharedApplication] openURL:url];

拨打系统电话、发送系统短信其实就是应用间的跳转。执行以上方法就会从你当前的应用跳转到系统的拨打电话界面、或者发送短信界面,普通的应用间的跳转只是传递的NSURL参数不一样,完成跳转到不同的应用场景。

总结:
一个应用能打开另一个应用的必然条件是:另一个应用必须配置一个scheme(协议),这样应用程序才能根据协议找到需要打开的应用。

3、实现两个app间的跳转

创建两个demo 工程:发达ProtocolTest。现在我要从应用:发达 打开应用:ProtocolTest

  1. 在被跳转的ProtocolTest配置一个协议scheme:projectB
    ( 名字可随意配置,当然最好是英文并且跟你项目相关)
    ProtocolTest的bundleID是: com.suning.ProtocolTest

targets -> info -> URL Types ->URL Scheme ->填写协议
在这里插入图片描述
方法二:
在这里插入图片描述以上设置是等效的,用一种设置即可。

  1. 在工程 发达 中实现跳转的代码,发达的bundleID是: com.suning.–
//
//  ViewController.m
//  发达
//
//  Created by lzz on 2019/3/8.
//  Copyright © 2019 lzz. All rights reserved.
//

#import "ViewController.h"
// 这是一个未发布到AppStore的企业版应用的下载地址
#define WOHAIBAO_DOWNLOAD_URL @"https://daweb.cnsuning.com/snf-da-web/download.html"

@interface ViewController ()

@end

@implementation ViewController
  
- (void)viewDidLoad {
    [super viewDidLoad];
    // Do any additional setup after loading the view, typically from a nib.
    
    self.title = @"你哈皮";
}


- (IBAction)pushLoadBundle:(id)sender {
	// ?token=123abct&registered=1 这是参数
    [self openScheme:@"projectB://?token=123abct&registered=1"];
}

- (void)openScheme:(NSString *)scheme {
    UIApplication *application = [UIApplication sharedApplication];
    NSURL *URL = [NSURL URLWithString:scheme];
    // 这里做了判断,兼容iOS 9以前的API
    if ([application respondsToSelector:@selector(openURL:options:completionHandler:)]) {
        [application openURL:URL options:@{}
           completionHandler:^(BOOL success) {
               NSLog(@"Open %@: %d",scheme,success);
               if (!success) {
               	// 打不开,表示手机中不存在,跳到下载页
                   [self openScheme:WOHAIBAO_DOWNLOAD_URL];
               }
           }];
    } else {
        if ([[UIApplication sharedApplication] canOpenURL:URL]) {
            [[UIApplication sharedApplication] openURL:URL];
        }else{
            // 打不开,表示手机中不存在,跳到下载页
            [self openScheme:WOHAIBAO_DOWNLOAD_URL];
        }
    }
}

@end

  1. 在被跳转的ProtocolTest 的AppDelegate.m中添加接受参数的方法
// 公共处理方法
- (void)handleUrl:(NSURL *)url {
    NSString *urlStr = [url absoluteString];
    NSLog(@"urlStr---%@",urlStr);
    
    NSString *queryStr = [url query];
    NSLog(@"queryStr---%@",queryStr);
    
    // &拼接的参数解析
    NSArray *parameArr = [queryStr componentsSeparatedByString:@"&"];
    NSLog(@"parameArr---%@",parameArr);
    
    for (NSString *canshu in parameArr) {
        NSArray *canshuArr = [canshu componentsSeparatedByString:@"="];
        NSLog(@"canshuArr---%@",canshuArr);
    }
    
    UIAlertView *alertView=[[UIAlertView alloc] initWithTitle:@"heihie" message:urlStr delegate:self cancelButtonTitle:nil otherButtonTitles:@"hah", nil];
    [alertView show];
}

// iOS 9之前代理
- (BOOL)application:(UIApplication *)application openURL:(NSURL *)url sourceApplication:(nullable NSString *)sourceApplication annotation:(id)annotation
{
    // com.suning.--
    if (sourceApplication) {
        if (([sourceApplication isEqualToString:@"com.suning.--"])) {
            [self handleUrl:url];
        }
    }
    
    return YES;
}
// iOS 9之后的代理
- (BOOL)application:(UIApplication *)app openURL:(NSURL *)url options:(NSDictionary<UIApplicationOpenURLOptionsKey,id> *)options
{
    if (options) {
        NSString *sourceApplicationBundleId= options[@"UIApplicationOpenURLOptionsSourceApplicationKey"];
        if (([sourceApplicationBundleId isEqualToString:@"com.suning.--"])) {
            [self handleUrl:url];
        }
    }
    
    return YES;
}

跳转后接受到的参数,以弹框的形式显示出来
在这里插入图片描述

这样就完成了从 **应用A** 到**应用B**的跳转了。
我用真机iOS 12.3测试了,也用模拟器iOS 8.4测试了,均能正常跳转。

4、网上说:iOS 9.0以后,需要配置协议白名单。我没有配置也能正常跳转。我把设置白名单的方法贴一下。
在ProtocolTest的info.plist文件中增加一个LSApplicationQueriesSchemes字段,把它设置为数组类型,并配置需要跳转的协议名单。
在这里插入图片描述

⚠️Universal Links方式跳转:请自行百度
因为在微信、QQ里打开会禁止scheme方式打开app,苹果iOS 9推出了Universal Links方式刚好可以解决这一问题。

参看:

iOS应用之间跳转
iOS App之间跳转

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
URL Scheme跳转是一种在iOS中实现App跳转的方式。它可以通过在Safari或其他浏览器中输入特定的URL Scheme来启动目标App,并且可以通过在URL中添加自定义的参来传递信息。URL Scheme的形式类似于网页,可以在Safari中输入类似"yourscheme://xxxxx"的URL来进行跳转。如果配置成功,则会弹出提示框询问是否访问该应用。 在iOS中,还有另一种常见的跳转方式叫做Universal Links。与URL Scheme不同,Universal Links是通过在网页上添加普通的超链接来实现跳转。当用户点击这个超链接时,会直接在对应的App内打开相关页面。相比URL Scheme,Universal Links更加方便,因为它不需要在URL中添加特定的Scheme,并且可以在App内部直接处理跳转逻辑。 总结起来,URL Scheme跳转是通过在浏览器中输入特定的URL Scheme来启动目标App传递参数,而Universal Links是通过在网页上添加超链接来实现跳转到对应的App内部。两种方式都可以实现App跳转,具体使用哪种方式取决于具体的需求和场景。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* *3* [IOS应用跳转URL scheme和Universal Links](https://blog.csdn.net/shaobing32/article/details/131170384)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 100%"] [ .reference_list ]
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值