即使未安装app,canOpenURL也会返回true以用于自定义URL方案

时间:2015-12-08 06:44:04

标签: ios objective-c url-scheme

 NSString *customURL = @"mycustomurl://"; 

 if ([[UIApplication sharedApplication] canOpenURL:[NSURL URLWithString:customURL]]) {
    [[UIApplication sharedApplication] openURL:[NSURL URLWithString:customURL]];
 } else {
    ...
 }

即使未安装公开自定义URL的目标应用,该应用也会为'canOpenURL'返回true。手机和手机都会出现此问题模拟器。 openURL然后默默地失败。任何想法为什么会发生这种情况/如何捕捉这种情况?

3 个答案:

答案 0 :(得分:4)

如果使用SDK 9.0及更高版本的应用程序,那么您必须确保在主应用程序的info.plist中添加要打开的应用程序方案:

enter image description here

如果不将上述内容添加到主应用程序的info.plist(相应地更改方案),canOpenURL将始终返回NO。除非使用iOS SDK低于9.0的应用程序,否则不会发生。

另外,使用以下逻辑,因为它更安全:

NSString * urlStr = @"mycustomurl://"; 
NSURL * url = [NSURL URLWithString:urlStr];

if ([[UIApplication sharedApplication] canOpenURL:url]) {
    if([[UIApplication sharedApplication] openURL:url]) {
       // App opened
    } else {
       // App not opened
    }
} else {
    // Can not open URL
}

上次检查我建议在设备中打开Safari应用程序,在url字段中输入app scheme url string,按回车键。结果如何继续。

答案 1 :(得分:0)

确保您使用网址类型的 LSApplicationQueriesSchemes

仅适用于 LSApplicationQueriesSchemes

这将无效

URL types

这将工作

LSApplicationQueriesSchemes

答案 2 :(得分:-1)

这是我用来打开优步应用程序,如果它已安装其他打开优步网站

if ([[UIApplication sharedApplication] canOpenURL:[NSURL URLWithString:@"uber://"]])
{
    //Uber is installed
    [[UIApplication sharedApplication] openURL:[NSURL URLWithString:@"uber://"]];
}
else
{
    [[UIApplication sharedApplication] openURL:[NSURL URLWithString:@"https://uber.com"]];
}

不要忘记在info.plist文件中添加此LSApplicationQueriesSchemes

像这样(app uber和twitter的名字已包含在此内)info.plist screenshot