为什么我的“tel:”链接不起作用

时间:2010-03-08 01:37:11

标签: iphone cocoa-touch

我有一个tableView,其中包含带有电话号码的单元格。该应用程序不是拨打号码。请参阅以下代码

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
 if (indexPath.section == 2) {
  UITableViewCell *selectedCell = [tableView cellForRowAtIndexPath:indexPath];
  NSString *numberToDial = [NSString stringWithFormat:@"tel:%@", selectedCell.detailTextLabel.text];

  NSLog(@"%@",numberToDial);

  [[UIApplication sharedApplication] openURL:[NSURL URLWithString:numberToDial]];
 }
}

控制台输出: 2010-03-08 01:32:30.830 AIB[1217:207] tel:01 8350098

正如您所看到的,该号码将转到控制台,但不会拨打。奇怪的是,如果我将最后一个语句更改为:

[[UIApplication sharedApplication] openURL:[NSURL URLWithString:@"tel:171"]];

手机拨打号码171没有任何问题


如下所示,我的特定问题的解决方案是从电话号码中删除空格。我实现了如下:

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
    if (indexPath.section == 2) {
        UITableViewCell *selectedCell = [tableView cellForRowAtIndexPath:indexPath];
        NSMutableString *numberToDial = [NSMutableString stringWithFormat:@"tel:%@", selectedCell.detailTextLabel.text];

        [numberToDial replaceOccurrencesOfString:@" " 
                                      withString:@"" 
                                         options:NSLiteralSearch 
                                           range:NSMakeRange(0, [numberToDial length])];

        [[UIApplication sharedApplication] openURL:[NSURL URLWithString:numberToDial]];
    }
}

4 个答案:

答案 0 :(得分:5)

您需要清理用户输入,使其成为有效的tel://网址。具体来说,这包括剥离:

  • 空间
  • 哈希(#
  • 星号(*

来自iPhone Dev Center

  

防止用户恶意攻击   重定向电话或更改   电话或帐户的行为,   电话应用支持最多,   但并非所有特殊人物   在电话计划中。具体来说,如果一个   URL包含*或#字符,   电话应用程序不会尝试   拨打相应的电话   号。

来自URLs for URLs for Telephone Calls RFC

  

......空间不得用于手机   URL中的数字作为空格字符   不能在没有的URL中使用   逃避它。

答案 1 :(得分:2)

您需要使用NSString的{​​{1}}方法转义空格。

答案 2 :(得分:1)

您的电话号码不能有空格。脱掉它然后再试一次。

答案 3 :(得分:0)

St3fan是对的,您应该在构建stringByAddingPercentEscapesUsingEncoding实例之前使用NSURL。 iPhone OS会自动为您做其他魔术。如果你没有百分比转义问题字符,那么URLWithString:方法将返回nil。