iOS端Labmed跳转LAB Befund应用异常问题及解决方法
解决iOS中检测并启动第三方App跳转异常的问题
问题分析
你碰到的核心问题很明确:明明装了"LAB Befund",但调用canOpenURL:始终返回NO,导致每次都跳去App Store。这其实是iOS 9及以上版本的权限限制要求,再加上你代码里的一个小失误共同导致的。
先看你原代码里的关键错误:
BOOL canOpenURL = [[UIApplication sharedApplication] canOpenURL:[NSURL URLWithString:LABWebURL]];
你这里检测的是App Store的HTTPS链接,而不是"LAB Befund"的自定义URL Scheme!这就导致不管目标App装没装,这个检测都会返回NO(苹果对通用HTTPS Scheme的检测逻辑和自定义Scheme不一样),自然每次都走跳转App Store的分支。
正确解决步骤
要实现"已安装则启动App,否则跳转到App Store"的需求,需要分两步配置+修正代码:
1. 目标App(LAB Befund)的配置
首先确认"LAB Befund"的info.plist里已经定义了自定义URL Scheme:
- 在
URL types下新增一个条目,将URL Schemes设置为LAB Befund(必须和你代码里用的Scheme完全一致,大小写敏感)
2. 你的App(Labmed)的配置(iOS 9+强制要求)
iOS 9开始,苹果限制了App可检测的URL Scheme范围,你必须在自己的info.plist里添加允许检测的Scheme列表:
- 新增
LSApplicationQueriesSchemes(类型为Array) - 添加一个字符串项,内容为
LAB Befund(和目标App的Scheme完全匹配)
3. 修正你的代码
把检测目标改成第三方App的自定义Scheme,而不是App Store链接:
// 目标App的自定义URL Scheme NSString *LABAppURL = @"LAB Befund://openApp?param1=XXX¶m2=YYY"; // App Store跳转链接 NSString *LABWebURL = @"https://itunes.apple.com/de/app/lab-befund/id1019115877?mt=8"; // 检测是否能打开目标App的Scheme BOOL canOpenURL = [[UIApplication sharedApplication] canOpenURL:[NSURL URLWithString:LABAppURL]]; NSLog(@"can open: %d", canOpenURL); // iOS 10+推荐使用带回调的API NSString *targetUrl = canOpenURL ? LABAppURL : LABWebURL; [[UIApplication sharedApplication] openURL:[NSURL URLWithString:targetUrl] options:@{} completionHandler:^(BOOL success) { if (!success) { NSLog(@"跳转失败"); } }];
额外注意点
- URL Scheme是大小写敏感的,代码、目标App配置、
LSApplicationQueriesSchemes里的内容必须完全一致 - 尽量避免Scheme里带空格,有些场景下可能会导致识别异常,如果可以的话建议和目标App开发者确认是否用了无空格的Scheme
内容的提问来源于stack exchange,提问作者Cyu.
相关产品推荐
相关产品推荐

