2

将字符串解析为 NSURL 对象时,NSURL将使用单个正斜杠的字符串与在方案后使用双正斜杠的字符串区别对待。

为什么会这样?

这里有一些例子:

NSURL *url = [NSURL URLWithString:@"app-id://path1/path2"];

NSLog(@"%@",url.scheme);    // "app-id"
NSLog(@"%@",url.path);      // "/path2"
NSLog(@"%@",url.host);      // "path1"


NSURL *url = [NSURL URLWithString:@"app-id:/path1/path2"];

NSLog(@"%@",url.scheme);    // "app-id"
NSLog(@"%@",url.path);      // "/path1/path2"
NSLog(@"%@",url.host);      // nil
4

1 回答 1

7

这两个字符串的处理方式不同,因为第一个字符串//符合RFC 1808而第二个字符串不符合。

第一个字符串是标准 Internet URL,第二个字符串省略了“授权组件”(参见RFC 2396 第 3.2 节)并立即开始路径组件,因此不符合 RFC 1808。

RFC1808

RFC 1808定义了“相对统一资源定位器”,它们是当今最熟悉的 URI,并使用以下//格式:

<scheme>://<net_loc>/<path>;<params>?<query>#<fragment>

//<net_loc>是 1808 的必需组件,并且RFC 2396声明 之后的组件//称为Authority Component(参见第 3.2 节),它充当顶部元素或路径的命名空间。路径从下一个正斜杠开始。

权限组件前面有一个双斜杠“//”,并由下一个斜杠“/”、问号“?”或URI 的末尾终止。

单正斜杠

使用单个正斜杠会省略Authority Component并立即启动路径组件。

NSURL

NSURL 将Authority ComponentURL 公开为主机参数,并提到它只能作为符合 1808 的 URL 的一部分使用:

[主机] 返回值

URL 的主机。如果接收方不符合 RFC 1808,则返回 nil。

这就是为什么要NSURL区别对待它们,为什么主机组件是nil第二种情况,为什么路径包含冒号后面的所有内容。

于 2013-12-14T04:52:19.880 回答