標籤:
就用一個很簡單的例子
http://www.google.comGoogle的首頁
都知道現在瀏覽器中開啟google.com的話事實上會變成http://www.google.com.hk
網址被重新導向了
如何在app中完成重新導向呢
使用NSURLConnetion類的NSURLConnectionDataDelegate委託
NSURLConnectionDataDelegate委託中的這個方法
- - (NSURLRequest *)connection:(NSURLConnection *)connection willSendRequest:(NSURLRequest *)request redirectResponse:(NSURLResponse *)response
可以得到重新導向以後的URL
看代碼
- #import "ViewController.h"
-
- @interface ViewController ()
-
- @end
-
- @implementation ViewController
-
- - (void)viewDidLoad {
- [super viewDidLoad];
-
- NSURL *url = [NSURL URLWithString:@"http://www.google.com"];
- NSURLRequest *request = [NSURLRequest requestWithURL:url];
- NSURLConnection *connection = [[NSURLConnection alloc] initWithRequest:request delegate:self];
-
- if (!connection) {
- NSLog(@"FAIL");
- }
- }
-
- - (NSURLRequest *)connection:(NSURLConnection *)connection willSendRequest:(NSURLRequest *)request redirectResponse:(NSURLResponse *)response {
- NSLog(@"================================================");
- NSLog(@"will send request\n%@", [request URL]);
- NSLog(@"redirect response\n%@", [response URL]);
-
- return request;
- }
-
- @end
以上省略了部分無關代碼
解釋一下代碼
在viewDidLoad方法中進行了一次串連 正是Google的首頁
再看看這個
- - (NSURLRequest *)connection:(NSURLConnection *)connection willSendRequest:(NSURLRequest *)request redirectResponse:(NSURLResponse *)response
這個方法在請求將要被發送出去之前會調用
傳回值是一個NSURLRequest就是那個真正將要被發送的請求
第二個參數request就是被重新導向處理過後的請求 在這裡就可以拿到需要的URL
第三個參數response是一個將要觸發重新導向的請求
這裡把request跟response中的URL打出來看一下
並直接返回request
運行看看結果
- ====will send request====
- http://www.google.com/
- ====redirect response====
- (null)
-
-
- ====will send request====
- http://www.google.com.hk/url?sa=p&hl=zh-CN&pref=hkredirect&pval=yes&q=http://www.google.com.hk/&ust=1347589441099727&usg=AFQjCNEsBYcrlh_jqpBWRwsc0NpBj2_lFg
- ====redirect response====
- http://www.google.com/
-
-
- ====will send request====
- http://www.google.com.hk/
- ====redirect response====
- http://www.google.com.hk/url?sa=p&hl=zh-CN&pref=hkredirect&pval=yes&q=http://www.google.com.hk/&ust=1347589441099727&usg=AFQjCNEsBYcrlh_jqpBWRwsc0NpBj2_lFg
可以看出進行了兩次重新導向
第一次
- ====will send request====
- http://www.google.com/
- ====redirect response====
- (null)
由於是第一次調用 沒有進行重新導向處理 所以redirect response是null
而想要被發送的請求就是www.google.com
第二次
- ====will send request====
- http://www.google.com.hk/url?sa=p&hl=zh-CN&pref=hkredirect&pval=yes&q=http://www.google.com.hk/&ust=1347589441099727&usg=AFQjCNEsBYcrlh_jqpBWRwsc0NpBj2_lFg
- ====redirect response====
- http://www.google.com/
這個時候redirect response就不是null了 就是第一次中的那個request 也就是說這一次的重新導向是由www.google.com這個URL引發的
而重新導向的結果就是http://www.google.com.hk/url?sa=p&hl=zh-CN&pref=hkredirect&pval=yes&q=http://www.google.com.hk/&ust=1347589441099727&usg=AFQjCNEsBYcrlh_jqpBWRwsc0NpBj2_lFg
第三次
[html] view plaincopy
- ====will send request====
- http://www.google.com.hk/
- ====redirect response====
- http://www.google.com.hk/url?sa=p&hl=zh-CN&pref=hkredirect&pval=yes&q=http://www.google.com.hk/&ust=1347589441099727&usg=AFQjCNEsBYcrlh_jqpBWRwsc0NpBj2_lFg
當然這個http://www.google.com.hk/url?sa=p&hl=zh-CN&pref=hkredirect&pval=yes&q=http://www.google.com.hk/&ust=1347589441099727&usg=AFQjCNEsBYcrlh_jqpBWRwsc0NpBj2_lFg
這個網址不是那個熟悉的網址
因為還要一次重新導向
這次就跟上面一樣了 那個很長的URL這次出現在了redirect response裡 觸發了這次重新導向
結果可以看到
就是那個熟悉的www.google.com.hk
當獲得想要的URL以後可以調用[connection cancel];方法來取消串連
並返回nil就好了
iOS應用中URL地址如何重新導向-b