先甩一段NSURL基本使用方法
NSURL *url = [NSURL URLWithString:@"http://www.baidu.com/search?id=1"];
// ?后是第一個參數(shù) &后是后面的參數(shù)
NSLog(@"scheme:%@", [url scheme]); //協(xié)議 http
NSLog(@"host:%@", [url host]); //域名 www.baidu.com
NSLog(@"absoluteString:%@", [url absoluteString]);
//完整的url字符串 http://www.baidu.com:8080/search?id=1
(剛才在真機(jī)上跑了一下权烧,并沒有打印出來端口 8080 啊)
NSLog(@"relativePath: %@", [url relativePath]); //相對路徑 search
NSLog(@"port :%@", [url port]); // 端口 8080
NSLog(@"path: %@", [url path]); // 路徑 search
NSLog(@"pathComponents:%@", [url pathComponents]); // search NSLog(@"Query:%@", [url query]); //參數(shù) id=1
一、URL的定義
URL是個司空見慣的東西琴庵,但要想徹底弄明白NSURL,必須先弄清楚URL的詳細(xì)定義仰美。
根據(jù)iOS SDK關(guān)于NSURL class描述部分的介紹迷殿,NSURL在RFC1808、1738和2732中有介紹咖杂。
1庆寺,RFC 1808
從文檔正文名字可以看出,RFC 1808是對“Relative Uniform Resource Locators”的定義诉字。
Relative URL的定義:
<scheme>://<net_loc>/<path>;<params>?<query>#<fragment>
共分為六部分:
scheme ":" ::= scheme name, as per Section 2.1 of RFC 1738 [2].
"http://" net_loc ::= network location and login information, as per Section 3.1 of RFC 1738 [2].
"/" path ::= URL path, as per Section 3.1 of RFC 1738 [2].
";" params ::= object parameters (e.g., ";type=a" as in Section 3.2.2 of RFC 1738 [2]).
"?" query ::= query information, as per Section 3.3 of RFC 1738 [2].
"#" fragment ::= fragment identifier.
2懦尝,RFC 1738,基本上是對RFC1808的補(bǔ)充描述壤圃。
3陵霉,RFC 2732,是對IPv6協(xié)議下的URL進(jìn)行了進(jìn)一步定義伍绳。
看過以上三點(diǎn)后踊挠,會對URL的組成有個大概的了解,而NSURL不過是把對URL對象的操作封裝起來的類而已冲杀。
二效床、NSURL對象的組成
根據(jù)SDK中的描述,NSURL對象由兩部分組成:
base URL(很可能是nil)权谁,通過baseUrl接口返回剩檀。
相對于base URL的一個字符串,通過relativeString接口返回旺芽。
根據(jù)是否有base URL屬性沪猴,可以將NSURL對象分為兩類卤妒,解析URL時不需要base URL參與的,叫做absolute URL字币,否則叫做relative URL则披。
回想第一部分中提到的RFC1808,它是對Relative URL的定義洗出。
三士复、File URL和File path的區(qū)別
這是在iPhone6.1模擬器下,獲取一個App沙盒內(nèi)Documents子目錄下某個文件的URL:
file://localhost/Users/liuwanwei/Library/Application%20Support/iPhone%20Simulator/6.1/Applications/AD065A2E-4355-436F-AD63-C55724CFE4E8/Documents/image/2013-03-18-11-42-05-2.mp4
對應(yīng)于RFC 1808中的內(nèi)容:
scheme:file
net_loc: //localhost
path:/Users/liuwanwei/Library/Application%20Support/iPhone%20Simulator/6.1/Applications/AD065A2E-4355-436F-AD63-C55724CFE4E8/Documents/image/2013-03-18-11-42-05-2.mp4
params:空
query:空
fragment:空
可以看出翩活,Path只是URL其中一小部分阱洪。
而上面的前三個部分,都可以通過NSURL的接口得到:[url scheme], [url host], [url path]
四菠镇、何時用到base url
從base url和relative url的名字可以很明顯看出他們之間的差別冗荸,但問題是在程序開發(fā)時,何時會用到base url利耍?
這個問題困擾我很久蚌本,在google上搜索很多次之后,也沒有發(fā)現(xiàn)一個使用baseUrl的例子隘梨。