iOS中使用URL Scheme进行App跳转的教程

URL Scheme的作用

我们都知道苹果手机中的APP都有一个沙盒,APP就是一个信息孤岛,相互是不可以进行通信的。但是iOS的APP可以注册自己的URL Scheme,URL Scheme是为方便app之间互相调用而设计的。我们可以通过系统的OpenURL来打开该app,并可以传递一些参数。

例如:你在Safari里输入www.alipay.com,就可以直接打开你的支付宝app,前提是你的手机装了支付宝。如果你没有装支付宝,应该显示的是支付宝下载界面,点击会跳到AppStore的支付宝下载界面。

URL Scheme必须能唯一标识一个APP,如果你设置的URL Scheme与别的APP的URL Scheme冲突时,你的APP不一定会被启动起来。因为当你的APP在安装的时候,系统里面已经注册了你的URL Scheme。

一般情况下,是会调用先安装的app。但是iOS的系统app的URL Scheme肯定是最高的。所以我们定义URL Scheme的时候,尽量避开系统app已经定义过的URL Scheme。

注册URL Scheme

1.在info.plist里添加URL types

每一个项目里面都会有一个info.plist配置文件。找到info.plist,右键选择Add Row,然后选择URL types。如图所示:

iOS中使用URL Scheme进行App跳转的教程

2.添加URL Schemes

添加完URL types,点击展开。右键选择Add Row,添加URL Schemes:
iOS中使用URL Scheme进行App跳转的教程
3.设置URL Schemes

设置URL Schemes为iOSDevTip

iOS中使用URL Scheme进行App跳转的教程

4.设置URL Identifier

URL Identifier是自定义的 URL scheme 的名字,一般采用反转域名的方法保证该名字的唯一性,比如 com.iOSStrongDemo.www

iOS中使用URL Scheme进行App跳转的教程

添加成功启动提示

为了方便测试,我们在AppDelegate里面添加一个UIAlertView,当app被成功打开时,会提出提示:

 

 - (BOOL)application:(UIApplication *)application handleOpenURL:(NSURL*)url{
     // 接受传过来的参数
     NSString *text = [[url host] stringByReplacingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
     UIAlertView *alertView = [[UIAlertView alloc] initWithTitle:@"打开啦"
                                            message:text
                                           delegate:nil
                                  cancelButtonTitle:@"OK"
                                  otherButtonTitles:nil];
     [alertView show];
     return YES;
 }

 

Safari启动自定义的URL Schemes APP

既然已经配置好URL Schemes,那么我们可以来款速测试一下,我们设置的URL Schemes是否有效。打开Safari,在地址栏里输入:iOSDevTip://

iOS中使用URL Scheme进行App跳转的教程

果然成功打开:

iOS中使用URL Scheme进行App跳转的教程

也可以在地址栏中输入:iOSDevTip://com.iOSStrongDemo.www。也是可以打开注册了URL Schemes的APP的。通过另一个APP启动注册了URL Schemes的APP


  NSString *url = @"iOSDevTip://";
 //    NSString *url = @"iOSDevTip://com.iOSStrongDemo.www";
 if ([[UIApplication sharedApplication]
      canOpenURL:[NSURL URLWithString:url]])
 {
     [[UIApplication sharedApplication] openURL:[NSURL URLWithString:url]];
 }
 else
 {
     NSLog(@"can not open URL scheme iOSDevTip");
 }


打开注册iOSDevTip的APP格式为: URL Scheme://URL identifier,直接调用URL Scheme也可打开程序, URL identifier是可选的。

 

通过注册的URL Scheme向目标APP传递参数

通过URL Scheme启动APP很简单就可以做到,但有时候我们想在启动APP的时候传递一些参数,这个时候我们就可以通过URL Scheme自定义URL来传递参数了。

昨天我们在AppDelegate调用了UIApplicationDelegate的代理方法:

复制代码 代码如下:

- (BOOL)application:(UIApplication *)application handleOpenURL:(NSURL*)url 
{ 
    // 接受传过来的参数 
    NSString *text = [[url host] stringByReplacingPercentEscapesUsingEncoding:NSUTF8StringEncoding]; 
    UIAlertView *alertView = [[UIAlertView alloc] initWithTitle:@"打开啦" 
                                           message:text 
                                          delegate:nil 
                                 cancelButtonTitle:@"OK" 
                                 otherButtonTitles:nil]; 
    [alertView show]; 
    return YES; 
} 


我们来看看苹果给这个方法的注释: 

 - (BOOL)application:(UIApplication *)application handleOpenURL:(NSURL *)url;  // Will be deprecated at some point, please replace with application:openURL:sourceApplication:annotation:


这个方法在未来将被废弃,可以用application:openURL:sourceApplication:annotation:来代替。

 

URL传参格式

昨天我们在iOSStrongDemo注册的URL Scheme还记得是什么吗?你应该还有印象的就是iOS开发的ID:iOSDevTip。

假设我们想要传递两个参数分别是名字name和手机号phone,格式如下:

iOSDevTip://?name=ligang&phone=13888888888

有没有似曾相识的感觉。我们用get方式请求一个接口是不是就是这样的。

被启动的APP处理传过来的参数

 - (BOOL)application:(UIApplication *)application
         openURL:(NSURL *)url
   sourceApplication:(NSString *)sourceApplication
          annotation:(id)annotation
 {
     NSLog(@"sourceApplication: %@", sourceApplication);
     NSLog(@"URL scheme:%@", [url scheme]);
     NSLog(@"URL query: %@", [url query]);
 
    // 接受传过来的参数     UIAlertView *alertView = [[UIAlertView alloc] initWithTitle:@"打开啦"                                                         message:[url query]                                                        delegate:nil                                               cancelButtonTitle:@"OK"                                               otherButtonTitles:nil];     [alertView show]; 
    return YES; } 


当APP被启动是,会调用代理方法application:openURL:sourceApplication:annotation:。参数URL就是启动APP的URL,参数sourceApplication就是来源APP的Bundle ID。

 

我们依然通过Safari来测试,在Safari的地址栏中输入:iOSDevTip://?name=ligang&phone=13888888888

iOS中使用URL Scheme进行App跳转的教程

即可打开APP,看看参数是否传递过来:

iOS中使用URL Scheme进行App跳转的教程

最后我们看一下打印:

2015-07-15 22:38:25.655 iOSStrongDemo[9983:2894855] sourceApplication: com.apple.mobilesafari
2015-07-15 22:38:28.664 iOSStrongDemo[9983:2894855] URL scheme:iosdevtip
2015-07-15 22:38:28.665 iOSStrongDemo[9983:2894855] URL query: name=ligang&phone=13888888888

sourceApplication打印出来是com.apple.mobilesafari,从这里可以看出来,是从Safari启动我们的APP的。

我们虽然自定义了URL Scheme,但是我们不能阻止别人通过自定义的URL Scheme来打开我们的应用。怎么解决呢?

我们可以指定相应的sourceApplication,也就是相应的Bundle ID,通过Bundle ID来决定是否可以打开我们的APP:

 - (BOOL)application:(UIApplication *)application
         openURL:(NSURL *)url
   sourceApplication:(NSString *)sourceApplication
          annotation:(id)annotation{

     NSLog(@"sourceApplication: %@", sourceApplication);
     NSLog(@"URL scheme:%@", [url scheme]);
     NSLog(@"URL query: %@", [url query]);
 
    if ([sourceApplication isEqualToString:@"com.3Sixty.CallCustomURL"]){         // 接受传过来的参数         UIAlertView *alertView = [[UIAlertView alloc] initWithTitle:@"打开啦"                                                             message:[url query]                                                            delegate:nil                                                   cancelButtonTitle:@"OK"                                                   otherButtonTitles:nil];         [alertView show]; 
        return YES;     }else{         return NO;     } 
} 


这样我们就可以通过Bundle ID来决定是否允许打开我们的APP。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
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 ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值