NSURL 装载URL结构的物件

NSURL 装载URL结构的物件

NSURL功能主要是要处理输入的网址内容是否符合RFC 1738的规格合法性,如此一来可以利用这个物件先将网址检查后再依照NSURL提供的方法取得需要的内容会比自行检查及处理网址内容资讯来的方便。

URL 结构

URL一开始是由<scheme>:<scheme-specific-part>所组成的,由<scheme>来决定通讯的方式,<scheme-specific-part>决定通讯路径的结构,中间隔着:冒号,下面由这两块来介绍:

scheme

scheme主要是表达用何种的通讯方式,例如:

   ftp                     File Transfer protocol
   http                    Hypertext Transfer Protocol
   gopher                  The Gopher protocol
   mailto                  Electronic mail address
   news                    USENET news
   nntp                    USENET news using NNTP access
   telnet                  Reference to interactive sessions
   wais                    Wide Area Information Servers
   file                    Host-specific file names
   prospero                Prospero Directory Service

当然还可以自行其他的scheme来表示,像iOS内部也有自订的scheme,可以参照Apple URL Scheme Reference,如果你在网址列输入tel:1234567890时,它就会启动播号介面并输入1234567890号码,在某些应用下,也可以透过设定档的方式替自已的APP自订scheme前缀字,这样输入你自订的sheme也能开启自已的应用。

资料填完整后就能注册一个属于自已应用的scheme,在网址列就能使用该scheme,很像档案关联性的感觉。

scheme-specific-part

这部分的内容为沟通的内容,下面的格式为Internet所使用的(http、ftp、telnet…):

//user:password@hostname:port/absolute-path?query

举个例子:

//guest:guest@tw.yahoo.com/index.html

如果有些资讯未输入,则会依照通讯方式让处理的程式补上预设值,比如在网页(http)通讯方式时未输入port则内定值是80

NSURL 用法

解析网址

当你要利用NSURL物件将网址解析时,直接在初始化时输入完整的网址:

//-----------start-----------
    NSURL *urlLink = [NSURL URLWithString:@"http://user:password@cms.35g.tw:80/coding/index.php?page"];

    NSLog(@"absoluteString:%@",[urlLink absoluteString]);
    NSLog(@"host:%@",[urlLink host]);
    NSLog(@"port:%i",[urlLink port].intValue);
    NSLog(@"scheme:%@",[urlLink scheme]);
    NSLog(@"query:%@",[urlLink query]);
//------------end------------

输出结果:

absoluteString:http://user:password@cms.35g.tw:80/coding/index.php?page
host:cms.35g.tw
port:80
scheme:http
query:page

会依照Internet的沟通格式解析,这样你要直接取得网址的部分资讯就能快速的得到。

组成完整网址

当你是要使用NSURL物件变动一些网址内容并生成完整的网址表达格式也能利用它完成。

例如要产生http://tw.yahoo.com/file.html时,要使用下面的方式去产生,

//-----------start-----------
NSURL *url = [NSURL URLWithString:@"file.html" relativeToURL:[NSURL URLWithString:@"http://tw.yahoo.com"]];
//------------end------------

如此一来,relativeToURL输入的内容,你在NSURL方法中就可以取得baseURL的值,例子结果它会是你输入的httpt://tw.yahoo.com,这样你就能使用basURL来产生其它的完整网址内容,下面的例子使用NSURL来产生两个网址:

//-----------start-----------
    NSURL *url = [NSURL URLWithString:@"file.html" relativeToURL:[NSURL URLWithString:@"http://tw.yahoo.com"]];
    NSLog(@"absoluteString = %@", [url absoluteString]);
    NSLog(@"baseURL:%@",[url baseURL]);
    //
    NSURL *url1= [[url baseURL] URLByAppendingPathComponent:@"1234.html"];
    NSLog(@"absoluteString = %@", [url1 absoluteString]);
//------------end------------

输出结果:

absoluteString = http://tw.yahoo.com/file.html
baseURL:http://tw.yahoo.com
absoluteString = http://tw.yahoo.com/1234.html

不过个人建议这样产生网址的方式真的很麻烦,但我想这个用意应该是利用你输入的完整网址后,利用取得的host、scheme当做baseURL,间接的再输入新的路径来产生新的网址,像下面这样:

//-----------start-----------
    NSURL *urlLink = [NSURL URLWithString:@"http://user:password@cms.35g.tw:80/coding/index.php?page"];

    NSLog(@"absoluteString:%@",[urlLink absoluteString]);
    NSLog(@"host:%@",[urlLink host]);
    NSLog(@"port:%i",[urlLink port].intValue);
    NSLog(@"scheme:%@",[urlLink scheme]);
    NSLog(@"query:%@",[urlLink query]);
    //
    NSString *n1 = [NSString stringWithFormat:@"%@://%@",[urlLink scheme],[urlLink host]];
    //取得host及scheme组成xxx://xxx.com.tw
    NSURL *url = [NSURL URLWithString:@"file.html" relativeToURL:[NSURL URLWithString:n1]];

    NSLog(@"absoluteString = %@", [url absoluteString]);
    NSLog(@"baseURL:%@",[url baseURL]);
    //
    NSURL *url1= [[url baseURL] URLByAppendingPathComponent:@"1234.html"];
    NSLog(@"absoluteString = %@", [url1 absoluteString]);
//------------end------------

输出结果:

absoluteString:http://user:password@cms.35g.tw:80/coding/index.php?page
host:cms.35g.tw
port:80
scheme:http
query:page
absoluteString = http://cms.35g.tw/file.html
baseURL:http://cms.35g.tw
absoluteString = http://cms.35g.tw/1234.html

以上为NSURL的用法,不过NSURL最常用在Framework需要网址时,用NSURL物件来传递网址内容,例如NSURLRequest

参考网页:

URLLoadingSystem

NSURL Class Reference

RFC 1808 – Relative Uniform Resource Locators