将字符串解析为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
两个字符串的处理方式不同,因为第一个字符串使用//
符合RFC 1808而第二个字符串不符合。
第一个字符串是标准的互联网URL,第二个字符串省略了“权限组件”(请参阅RFC 2396 Section 3.2)并立即开始路径组件,因此不符合RFC 1808。
RFC 1808定义了“相对统一资源定位器”,它们是目前最熟悉的URI并使用//
格式:
<scheme>://<net_loc>/<path>;<params>?<query>#<fragment>
//<net_loc>
是1808的必要组成部分,RFC 2396声称//
之后的组件称为Authority Component
(参见seciton 3.2),它充当路径的顶部元素或命名空间。该路径从下一个正斜杠开始。
权限组件前面有一个双斜杠“//”,并由下一个斜杠“/”,问号“?”或URI的末尾终止。
使用单个正斜杠省略Authority Component
并立即启动路径组件。
NSURL将URL的Authority Component
公开为host参数,并提到它仅作为符合1808的URL的一部分提供:
[主机]返回值
URL的主机。如果接收方不符合RFC 1808,则返回nil。
这就是为什么NSURL
以不同的方式对待它们,为什么主机组件在第二种情况下是nil
以及为什么路径包含冒号之后的所有内容。