canOpenURL无法实现系统范围的URL方案

时间:2015-08-19 23:34:47

标签: ios objective-c ios9 uiapplication

我正在运行iOS 9b5。

在我的应用中,如果设备可以拨打电话,我想将文本颜色设置为蓝色,以便它看起来可以点亮。如果没有,我把它留黑。

为了确定设备功能,我使用:

[[UIApplcation sharedApplication] canOpenURL:@"telprompt://5555555555"]  

众所周知,iOS 9要求我们将我们在应用中使用的任何网址方案列入白名单作为隐私措施。

我在Info.plist中有这个:

<key>LSApplicationQueriesSchemes</key>  
<array>  
  <string>telprompt</string>  
</array>  

无论我做什么,我仍然得到canOpenURL:网址失败:&#34; telprompt://&#34; - 错误:&#34;(null)&#34;。我试过tel://和sms://我似乎无法避免系统日志警告。

是否有人知道如何检测设备是否可以拨打电话而不会触发这些警告?

6 个答案:

答案 0 :(得分:9)

我到目前为止发现的是,如果控制台记录-canOpenURL: failed for URL: "xxx://" - error: "(null)",它实际上是有效的。一旦出现除null之外的任何其他错误,它可能无法正常工作。如果错误为"This app is not allowed to query for scheme xxx",则您必须将此方案添加到您应用的.plist中:

<key>LSApplicationQueriesSchemes</key>
<array>
    <string>xxx</string>
</array>

控制台输出看起来像错误的奇怪行为,尽管确实没有。

答案 1 :(得分:5)

我在IOS9设备中遇到了同样的错误。所以我使用下面的代码片段来避免这个错误。

NSString *cleanedString = [[[PHONE NUMBER] componentsSeparatedByCharactersInSet:[[NSCharacterSet characterSetWithCharactersInString:@"0123456789-+()"] invertedSet]] componentsJoinedByString:@""];
NSString *escapedPhoneNumber = [cleanedString stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
NSString *phoneURLString = [NSString stringWithFormat:@"telprompt:%@", escapedPhoneNumber];
NSURL *phoneURL = [NSURL URLWithString:phoneURLString];

if ([[UIApplication sharedApplication] canOpenURL:phoneURL]) {
    [[UIApplication sharedApplication] openURL:phoneURL];
}

答案 2 :(得分:2)

由于iOS9不推荐使用stringByAddingPercentEscapesUsingEncoding,因此可以使用以下方法清除telprompt:URL。

NSString *cleanedString = [[[PHONE NUMBER] componentsSeparatedByCharactersInSet:[[NSCharacterSet characterSetWithCharactersInString:@"0123456789-+()"] invertedSet]] componentsJoinedByString:@""];
//NSString *escapedPhoneNumber = [cleanedString stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
NSString *escapedPhoneNumber = [cleanedString stringByAddingPercentEncodingWithAllowedCharacters: [NSCharacterSet URLQueryAllowedCharacterSet]];
NSString *phoneURLString = [NSString stringWithFormat:@"telprompt:%@", escapedPhoneNumber];
NSURL *phoneURL = [NSURL URLWithString:phoneURLString];

if ([[UIApplication sharedApplication] canOpenURL:phoneURL]) {
    [[UIApplication sharedApplication] openURL:phoneURL];
}

答案 3 :(得分:2)

在iOS9中,我正在使用此代码并且它可以工作:

NSString *assistanceNumber = [[NSUserDefaults standardUserDefaults] objectForKey:@"AssistanceCallMISDN"];
    assistanceNumber= [[assistanceNumber componentsSeparatedByCharactersInSet:[[NSCharacterSet characterSetWithCharactersInString:@"0123456789-+()"] invertedSet]] componentsJoinedByString:@""];
    assistanceNumber = [assistanceNumber stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];


    NSURL *phoneUrl = [NSURL URLWithString:[@"telprompt://" stringByAppendingString:assistanceNumber]];
    NSURL *phoneFallbackUrl = [NSURL URLWithString:[@"tel://" stringByAppendingString:assistanceNumber]];

    if ([UIApplication.sharedApplication canOpenURL:phoneUrl]) {
        [UIApplication.sharedApplication openURL:phoneUrl];
    } else if ([UIApplication.sharedApplication canOpenURL:phoneFallbackUrl]) {
        [UIApplication.sharedApplication openURL:phoneFallbackUrl];
    } else
    {
        [[[UIAlertView alloc] initWithTitle:@"" message:[NSString stringWithFormat:@"No se ha podido realizar la llamada a través de la aplicación. Puede llamar usted al %@", assistanceNumber] delegate:self cancelButtonTitle:@"Ok" otherButtonTitles:nil] show];
        [_viewEmergency setHidden:YES];
    }

我的信息列表

<key>LSApplicationQueriesSchemes</key>
<array>
    <string>telprompt</string>
    <string>tel</string>
</array>

答案 4 :(得分:0)

试试这个:

NSString *phone_number = [[yourPhoneNumber componentsSeparatedByCharactersInSet:[[NSCharacterSet characterSetWithCharactersInString:@"0123456789-+()"] invertedSet]] componentsJoinedByString:@""];
[[UIApplication sharedApplication] openURL:[NSURL URLWithString:[NSString stringWithFormat:@"telprompt://%@", phone_number]]];

答案 5 :(得分:0)

尝试在真实设备而不是模拟器上运行此功能。无需为LSApplicationQueriesSchemes计划添加tel