IOS之URL Scheme的使用

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了IOS之URL Scheme的使用相关的知识,希望对你有一定的参考价值。

本文转载自(下载示例代码请打开第一个链接):

http://www.cocoachina.com/industry/20140522/8514.html

http://blog.csdn.net/wbw1985/article/details/26264029

1 URL Scheme是什么

android的URL Scheme类似,是为方便app之间互相调用而设计的。你可以通过一个类似URL的链接,通过系统的OpenURL来打开该app,并可以传递一些参数。每个URL必须能唯一标识一个APP,如果你设置的URL Scheme与别的APP的URL Scheme一致。那么,你的APP不一定会被调用起来,原因是当APP在安装的时候就已经在系统里面注册了此APP的URL Scheme,如果你的是后安装的,那么系统不会调用你的APP,因为你的APP设置的URL scheme被覆盖了。当然系统的APP的URL Scheme是优先级高的,不用想着能覆盖系统APP的URL Scheme的注册调用。

我就碰到了这个问题:在测试机里面安装了同一个应用的两个版本(只是名字不同,代码一样),在其中一个app内进行微信分享的时候,完事后点击"回到应用",却回到了另一个版本的app中去了。原因就是进行分享操作的app是后安装的。找到原因之后,也是醉了!

2 URL Scheme是干什么的

大家知道在ios系统里面APP之间是相互隔离的,不像Android,每个组件都可以作为一个独立的功能被其他APP调用,但是,IOS系统里面也需要完成类似于三方功能如支付、搜索跳转、导航等等跨APP的功能,怎么实现呢,苹果就使用了URL Scheme来实现了这个功能。通过各个APP设计的符合苹果的统一规范的URL Scheme,系统就会自动去调用相关的APP来完成你的请求。

比如:我们的APP需要使用支付宝的三方支付功能、我的APP需要使用微信分享好的文章,那么此时就可以通过URL Scheme来传递这些数据到支付宝APP或者微信APP,系统会通过这些APP的URL Scheme来调起这些APP,完成你所需要做的跨APP的功能。

3 URL Scheme怎么玩

注册自定义 URL Scheme
注册自定义 URL Scheme 的第一步是创建 URL Scheme — 在 Xcode Project Navigator 中找到并点击工程 info.plist 文件。当该文件显示在右边窗口,在列表上点击鼠标右键,选择 Add Row:
 
向下滚动弹出的列表并选择 URL types。
技术分享
 
点击左边剪头打开列表,可以看到 Item 0,一个字典实体。展开 Item 0,可以看到 URL Identifier,一个字符串对象。该字符串是你自定义的 URL scheme 的名字。建议采用反转域名的方法保证该名字的唯一性,比如 com.yourCompany.yourApp。
技术分享
 
 
点击 Item 0 新增一行,从下拉列表中选择 URL Schemes,敲击键盘回车键完成插入。 

 技术分享

 

注意: URL Schemes 是一个数组,允许应用定义多个 URL schemes。 

 技术分享

 

展开该数据并点击 Item 0。你将在这里定义自定义 URL scheme 的名字。只需要名字,不要在后面追加 :// — 比如,如果你输入 iOSDevApp,你的自定义 url 就是 iOSDevApp:// 

技术分享

 

此时,整个定义如下图: 

 技术分享

 

虽然我赞同 Xcode 使用描述性的名字的目的,不过看到创建的实际的 key 也是非常有用的。这里有一个方便的技巧,右键点击 plist 并选择 Show Raw Keys/Values,就能看到以下效果: 

技术分享

 

还有另一种有用的输出格式,XML,因为可以非常容易的看到字典和原始数组及其包括的实体的结构。点击 plist 并选择 Open As – Source Code: 

技术分享

 

从 Safari 中调用自定义 URL Scheme
定义了 URL scheme,我们可以运行一个快速测试来验证应用是否如我们所期望的被调用。在这之前,我创建了一个准 UI 以辨别带有自定义 URL 的应用。该应用只有一个 UILabel,带有文本 “App With Custom URL”
技术分享
 
使用模拟器调用应用的步骤:
1. 在 Xcode 中运行应用
2. 一旦应用被安装,自定义 URL scheme 就会被注册
3. 通过模拟器的硬件菜单中选择 Home 来关闭应用
4. 启动 Safari
5. 在浏览器地址栏输入之前定义的 URL scheme(如下) 
技术分享
 
此时 Safari 将会关闭,应用会被带回到前台。祝贺你刚刚使用自定义 URL scheme 调用了一个 iPhone 应用。
 
从另一个 iPhone 应用中调用自定义 URL Scheme
让我们看看如何从另一个应用中调用自定义 URL scheme。我又创建了一个非常简单的 iPhone 应用,它只有一个 UILabel 和一个 UIButton — 前者显示了一段信息,告诉你这个应用将要通过自定义 URL scheme 来调用另一个应用,按钮则开始这个行为
技术分享
 
buttonPressed 方法中的代码处理 URL 调用:
- (void)buttonPressed:(UIButton *)button 
{ 
  NSString *customURL = @"iOSDevTips://"; 
 
  if ([[UIApplication sharedApplication] 
    canOpenURL:[NSURL URLWithString:customURL]]) 
  { 
    [[UIApplication sharedApplication] openURL:[NSURL URLWithString:customURL]]; 
  } 
  else 
  { 
    UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"URL error" 
                          message:[NSString stringWithFormat: 
                            @"No custom URL defined for %@", customURL] 
                          delegate:self cancelButtonTitle:@"Ok" 
                          otherButtonTitles:nil]; 
    [alert show]; 
  } 
} 
 
第 5 行代码检查自定义 URL 是否被定义,如果定义了,则使用 shared application 实例来打开 URL (第 8 行)。openURL: 方法启动应用并将 URL 传入应用。在此过程中,当前的应用被退出。
 
通过自定义 URL Scheme 向应用传递参数
有时你需要通过自定义 URL 向应用中传递参数。让我们看看该如何完成这个工作。
NSURL 作为从一个应用调用另一个的基础,遵循 RFC 1808 (Relative Uniform Resource Locators) 标准。 因此你所熟悉的基于网页内容的 URL 格式在这里也适用。
 
在自定义了 URL scheme 的应用中,app delegate 必须实现以下方法: 
- (BOOL)application:(UIApplication *)application 
  openURL:(NSURL *)url 
  sourceApplication:(NSString *)sourceApplication 
  annotation:(id)annotation 

 

从一个应用传递参数到另一个的诀窍是通过 URL。例如,假设我们使用以下的 URL scheme,想传递一个名为 “token”的参数和一个标识注册状态的标志,我们可以像这样创建一个 URL:

NSString *customURL = @"iOSDevTips://?token=123abct&registered=1"; 
 
在 web 开发中,字符串 ?token=123abct&registered=1 被称作查询询串(query string)。
 
在被调用(设置了自定义 URL)的应用的 app delegate 中,获取参数的代码如下: 
- (BOOL)application:(UIApplication *)application openURL:(NSURL *)url 
        sourceApplication:(NSString *)sourceApplication annotation:(id)annotation 
{ 
  NSLog(@"Calling Application Bundle ID: %@", sourceApplication); 
  NSLog(@"URL scheme:%@", [url scheme]); 
  NSLog(@"URL query: %@", [url query]); 
 
  return YES; 
} 
 
以上代码在应用被调用时的输出为: 
 
Calling Application Bundle ID: com.3Sixty.CallCustomURL 
URL scheme:iOSDevTips 
URL query: token=123abct&registered=1 
 
注意 “Calling Application Bundle ID”,你可以用这个来确保只有你定义的应用可以与你的应用直接交互。
 
让我们改变一下代码,来验证发起调用的应用的 Bundle ID 是否合法: 
- (BOOL)application:(UIApplication *)application openURL:(NSURL *)url 
        sourceApplication:(NSString *)sourceApplication annotation:(id)annotation 
{ 
  // Check the calling application Bundle ID 
  if ([sourceApplication isEqualToString:@"com.3Sixty.CallCustomURL"]) 
  { 
    NSLog(@"Calling Application Bundle ID: %@", sourceApplication); 
    NSLog(@"URL scheme:%@", [url scheme]); 
    NSLog(@"URL query: %@", [url query]); 
 
    return YES; 
  } 
  else 
    return NO; 
} 
有一点要特别注意,你不能阻止其他应用通过自定义 URL scheme 调用你的应用,然而你可以跳过后续的操作并返回 NO,就像上面的代码那样。也就是说,如果你想阻止其它应用调用你的应用,创建一个与众不同的 URL scheme。尽管这不能保证你的应用不会被调用,但至少大大降低了这种可能性。

 

以上是关于IOS之URL Scheme的使用的主要内容,如果未能解决你的问题,请参考以下文章

React Native之配置URL Scheme(iOS Android)

第一次使用Url scheme时App中iOS自定义Url Scheme打不开

Xamarin.Forms 中iOS通过URL Scheme判断应用是否安装

iOS 9 无法使用 URL SCHEME 打开 Instagram 应用

iOS 9 无法使用 URL SCHEME 打开 Instagram 应用

ios和android应用都可以注册自定义url scheme吗