iOS URL Types和LSApplicationQueriesSchemes

一、踩坑反思

  1. 起因:调试跳转第三方App时,无法跳转。
  2. 过程:在URL Types中添加Schemes进行模拟跳转,上传开发代码到git时未能及时删除模拟代码,导致对第三方App造成影响,用户想跳转第三方App时跳转到了我们的App。
  3. 结果:删除URL Types中第三方Schemes,强升进行挽救,此处反思记录。

针对此次造成的影响,对info.plist中的URL TypesLSApplicationQueriesSchemes进行详细说明,共勉。

二、LSApplicationQueriesSchemes

1. 附上LSApplicationQueriesSchemes白名单配置:

2. 跳转代码

当我们想跳转第三方应用时,通常使用如下方法直接跳转:

NSURL *appUrl = [NSURL URLWithString:@"weixin://"];
[[UIApplication sharedApplication] openURL:appUrl];

或者先判断再进行跳转:

NSURL *appUrl = [NSURL URLWithString:@"weixin://"];
BOOL appIsExist = [[UIApplication sharedApplication] canOpenURL:appUrl];
if (appIsExist) {
    [[UIApplication sharedApplication] openURL:appUrl];
}
  • 当我们使用canOpenURL:判断手机内是否安装此App时,则必须在LSApplicationQueriesSchemes白名单中配置第三方Scheme: weixin,否则无法跳转,报错-canOpenURL: failed for URL: "weixin://" - error: "This app is not allowed to query for scheme weixin"
  • 但是当仅使用openURL:时跳转无限制。
  • 此处建议使用canOpenURL:进行跳转判断,提前发现问题,规避问题。

三、URL types

1. 附上URL Types配置:

2. URL types说明

a. 设置方式:

项目 -> info -> URL types -> URL Schemes,设置后就拥有了自己应用的标识scheme

注意:URL Schemes 是一个可以让 app 相互之间可以跳转的协议。每个 app 的URL Scheme都是不一样的,如果存在一样的Scheme,那么系统就会响应先安装的那个 app 的 Scheme,因为后安装的 app 的Scheme被覆盖掉了,是不能被调用的。

b. 配置说明:

URL types
URL Schemes
URL Identifier是自定义的URL Schemes名字,一般采用翻转域名的方法保证该名字的唯一性,也可以不设置,若设置必须保证唯一性。

3. 验证

在Safari浏览器中,输入scheme://,若能打开,则配置URL Schemes成功。

四、总结

  1. Scheme跳转是iOS APP通信最常用到的通信方式,APP1通过openURL: 跳转到APP2,并且可以在URL中带上想要的参数,有点类似HTTPget请求。
  2. URL types里的字段是为了让别的应用能调起你自己的app,而LSApplicationQueriesSchemes里的字段是让系统允许你自己的app调起第三方app的。就相当于你LSApplicationQueriesSchemes中的字段是别人app中的URL types字段,而你URL types中的字段就是别人app中的LSApplicationQueriesSchemes中的字段。

此处重复强调:URL Schemes 是一个可以让 app 相互之间可以跳转的协议。每个 app 的URL Scheme都是不一样的,若配置与其它App一样的URL Scheme,那么系统就会响应先安装的那个 app 的 URL Scheme,后安装的 app 的URL Scheme会被覆盖掉,不能被调用。因此配置URL type -> URL Schemes时一定要慎重再慎重,避免影响第三方App使用。

五、规避措施

即使有组内代码Review,但是在上传git时,必须对代码进行自我Review,任何调试代码不得上传git,若必须要上传提供测试,则新建不合并的临时分支。

你可能感兴趣的:(iOS URL Types和LSApplicationQueriesSchemes)