• URL Schemes


    APP 被唤醒离不开对URL Schemes的认知。

    苹果选择沙盒来保障用户的隐私和安全,但沙盒也阻碍了应用间合理的信息共享,于是有了 URL Schemes 这个解决办法。

    URL Schemes 是什么

    通过对比网页链接来理解 iOS 上的 URL Schemes,应该就容易多了。

    URL Schemes 有两个单词:

    • URL,我们都很清楚,http://www.apple.com 就是个 URL,我们也叫它链接或网址;
    • Schemes,表示的是一个 URL 中的一个位置——最初始的位置,即 ://之前的那段字符。比如 http://www.apple.com 这个网址的 Schemes 是 http。

    根据我们上面对 URL Schemes 的使用,我们可以很轻易地理解,在以本地应用为主的 iOS 上,我们可以像定位一个网页一样,用一种特殊的 URL 来定位一个应用甚至应用里某个具体的功能。而定位这个应用的,就应该这个应用的 URL 的 Schemes 部分,也就是开头儿那部分。比如短信,就是 sms

    你可以完全按照理解一个网页的 URL ——也就是它的网址——的方式来理解一个 iOS 应用的 URL,拿苹果的网站和 iOS 上的微信来做个简单对比:

     网页(苹果)iOS 应用(微信)
    网站首页/打开应用 http://www.apple.com weixin://
    子页面/具体功能 http://www.apple.com/mac/(Mac页面) weixin://dl/moments(朋友圈)

    在这里,http://www.apple.com 和 weixin:// 都声明了这是谁的地盘。

    URL 编码(Encode)

    什么时候要编码?

    URL 中的字符可以分为两类[3],一部分可以在链接中正常显示,比如字母、数字还有/等一部分符号。除此之外,全部不能正常显示,需要进行编码才能够作为 URL 的一部分出现。比如空格,在 URL 中就必须表示为 %20转换的规则不用深究,网上有很多工具(比如 URL 解码工具)提供 URL 的编码和解码功能,可以把编码过的乱七八糟的 URL 解码为我们看得清爽的字符:

    Hi%2C+%E6%88%91%E6%98%AF+%40JailbreakHum 转换为 Hi, 我是 @JailbreakHum

    这些工具当然也可以反过来把我们常用的字符转换成可以在 URL 中使用的字符。

    所以理论上,所有 URL 不支持的字符,都要编码。编码的任务也就是这么简单,把 URL 不支持的字符换位它支持的字符。既然如此,为什么有的时候不用编码?

    项目中关键的配置

    在项目Info的 Url Type中配置(被唤起端

    Url Type,表示可以被哪些带前缀Url打开,而不是可以打开以这些前缀开头的app。

    • 说明
      • URL identifier只是一个标示符,随意填写,建议写成:com.*.*反转域名的方法保证该名字的唯一性。
      • URL Scheme就是你用来通信的命令前缀,用来定位一个应用。

    Plist文件中配置 (被唤起端

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

    在代理方法- (BOOL)application:(UIApplication *)application openURL:(NSURL *)url sourceApplication:(NSString *)sourceApplication annotation:(id)annotation中判断唤起的来源source app,根据Url所携带的参数进行不同的操作。比如跳转到制定的页面,相关的逻辑处理等等.

    - (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; 
    }

    以上配置是在被唤起应用中配置的。

    唤起端

    一般情况下,唤起端可以直接调用appDelegate的代理方法去唤醒其他应用。

    - (void)awakeOtherApp
    { 
      NSString *customURL = @"otherApp://"; 
    
      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]; 
      } 
    }
    • 这里需要注意一下在iOS9以后,唤起端需要配置一下

    LSApplicationQueriesSchemes.iOS9之后需要,iOS9之后提高了app的安全性,需要给出一个类似白名单的东西,在白名单里面的才能打开app。不然报错: -canOpenURL: failed for URL: "OpenAppTest://mark?id=007" - error: "This app is not allowed to query for scheme OpenAppTest"

     
    参考:
     http://www.jianshu.com/p/7a308f5b89fc
     http://sspai.com/31500
  • 相关阅读:
    BP神经网络的数学原理及其算法实现
    机器学习必知的10大算法
    支持向量机通俗导论(理解SVM的三层境界)
    svm算法 最通俗易懂讲解
    read/write/fsync与fread/fwrite/fflush的关系和区别
    ubuntu16.04编译QT5.6所依赖的库
    Linux下的tar压缩解压缩命令详解
    Ubuntu16下编译linux内核,报"mkimage" command not found错的解决
    Git之(一)Git是什么[转]
    mac上完整卸载删除:android studio方案
  • 原文地址:https://www.cnblogs.com/richard-youth/p/4988122.html
Copyright © 2020-2023  润新知