【问题标题】:NSURL with string带有字符串的 NSURL
【发布时间】:2011-08-10 21:13:02
【问题描述】:

我对 NSURL 有疑问。我正在尝试使用字符串创建 NSURL

代码

    NSString *prefix = (@"tel://1234567890 ext. 101");
    NSString *dialThis = [NSString stringWithFormat:@"%@", prefix];
    NSURL *url = [[NSURL alloc] initWithString:dialThis];
    NSLog(@"%@",url);

也试过了

    NSURL *url = [NSURL URLWithString:dialThis];

但它给出了 null 。怎么了?

谢谢..

【问题讨论】:

  • 我不确定,但你可以尝试 NSString *prefix = (@"tel://1234567890 ext. 101");更改为 NSString *prefix = @"tel://1234567890 ext. 101";

标签: iphone nsurl


【解决方案1】:

您的问题是 URL 中未转义的空格。例如,这有效:

    NSURL *url = [NSURL URLWithString:@"tel://1234567890x101"];

编辑:就像这样..

    NSURL *url2 = [NSURL URLWithString:[@"tel://1234567890 ext. 101"
        stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]];

【讨论】:

  • 但实际字符串来自 XML 解析say(123-456-7891 ext. 101),我想要拨打电话功能。
  • 我使用了它提供的代码:tel://1234567890%20ext.%20101 作为输出!!! “%”符号???
  • 这是因为 %20 表示转义 URI 中的空格字符。
【解决方案2】:

在将任何字符串作为您无法控制的 URL 传递之前,您必须对空格进行编码:

 NSString *dialThis = [prefix stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
 // tel://1234567890%20ext.%20101

附带说明,iOS 不会拨打任何分机。用户必须手动执行此操作。

来自Apple URL Scheme Reference: Phone Links

为防止用户恶意重定向电话或更改电话或帐户的行为,电话应用程序支持 tel 方案中的大多数(但不是全部)特殊字符。具体来说,如果 URL 包含 * 或 # 字符,电话应用程序不会尝试拨打相应的电话号码。

【讨论】:

    【解决方案3】:

    我不确定“分机”。在电话号码中可以用什么值来代替?不过你可以这样试试,

    NSString *prefix = [NSString stringWithString: @"tel://1234567890 ext. 101"];
    
        NSString *dialThis = [NSString stringWithFormat:@"%@", prefix];
    
        NSURL *url = [NSURL URLWithString:[dialThis stringByReplacingOccurrencesOfString:@" ext. " withString:@"#"]];
    // it might also represent by the pause symbol ','.
    

    你可以去找分机。相当于手机里的什么符号,然后替换掉。

    但不知道它是否可以在实际情况下工作......

    【讨论】:

    • 现在我只想将 url 打印为 tel://1234567890 分机。 101
    • 就像 Jim Blackler 上面所说的,NSURL 不直接支持 'space',因此对于普通的 web url,它必须使用 %20 编码,但是现在它是一个电话链接,所以'分机'在正常情况下必须用符号表示,但 Black Frog 指出 Apple 不允许使用任何“#”,但尝试它没有坏处。
    • 嗯好吧....我可以在模拟器中启动电话功能吗?我尝试了一些静态网址,但没有任何反应!
    • 模拟器无法拨打电话,必须在电话中。
    【解决方案4】:

    与 iOS 9.0 一样,

    stringByAddingPercentEscapesUsingEncoding:

    已被弃用。

    使用以下方法将String转换为NSURL

    let URL = "URL GOES HERE"
    let urlString = URL.stringByAddingPercentEncodingWithAllowedCharacters(NSCharacterSet.URLFragmentAllowedCharacterSet())
    

    【讨论】:

      【解决方案5】:

      如果你有一些你认为应该是 URL 字符串但对 URL 字符串应该如何构造一无所知的东西,你可以使用 NSURL 的 URLWithDataRepresentation:relativeToURL: 方法。它解析 URL 字符串(作为 NSData 中的字节)并根据需要对字符进行百分比编码。将 NSString 转换为 NSData 时,使用 NSUTF8StringEncoding 以获得最佳效果。

      NSURL *url = [NSURL URLWithDataRepresentation:[@"tel:1234567890 ext. 101" dataUsingEncoding:NSUTF8StringEncoding] relativeToURL:nil];
      NSLog(@"%@",url);
      

      使用字符串 1234567890%20ext.%20101

      创建一个 URL

      尝试做正确的事。但是,为了获得最佳结果,您应该找到您使用的 URL 方案的规范,并按照它的语法来创建您的 URL 字符串。对于电话方案,即https://www.rfc-editor.org/rfc/rfc3966

      附:您使用“tel://”而不是“tel:”,这对于 tel URL 是不正确的。

      【讨论】:

        【解决方案6】:

        试试这个,它对我有用....

        NSString *prefix = (@"tel://1234567890 ext. 101");
        NSString *dialThis = [NSString stringWithFormat:@"%@", prefix];
        NSURL *url = [NSURL URLWithString:[queryString stringByReplacingOccurrencesOfString:@" " withString:@"%20"]];
        NSLog(@"%@",url);
        

        【讨论】:

          【解决方案7】:

          制作一个可用于项目任何部分的扩展:

          extension String {
              var asNSURL: NSURL! {
                  return NSURL(string: self)
              }
          }
          

          从现在开始你可以使用

          let myString = "http://www.example.com".asNSURL
          

          myString.asNSURL
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2014-09-29
            • 1970-01-01
            • 2012-03-30
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多