一、踩坑反思
- 起因:调试跳转第三方App时,无法跳转。
- 过程:在
URL Types中添加Schemes进行模拟跳转,上传开发代码到git时未能及时删除模拟代码,导致对第三方App造成影响,用户想跳转第三方App时跳转到了我们的App。 - 结果:删除
URL Types中第三方Schemes,强升进行挽救,此处反思记录。
针对此次造成的影响,对info.plist中的URL Types和LSApplicationQueriesSchemes进行详细说明,共勉。
二、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:成功。
四、总结
Scheme跳转是iOS APP通信最常用到的通信方式,APP1通过openURL: 跳转到APP2,并且可以在URL中带上想要的参数,有点类似HTTP的get请求。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,若必须要上传提供测试,则新建不合并的临时分支。