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
。