就用一个很简单的例子

http://www.google.com谷歌的首页

都知道现在浏览器中打开google.com的话事实上会变成http://www.google.com.hk

网址被重定向了

如何在app中完成重定向呢

使用NSURLConnetion类的NSURLConnectionDataDelegate委托

NSURLConnectionDataDelegate委托中的这个方法

  1. - (NSURLRequest *)connection:(NSURLConnection *)connection willSendRequest:(NSURLRequest *)request redirectResponse:(NSURLResponse *)response

可以得到重定向以后的URL

看代码

  1. #import "ViewController.h"
  2. @interface ViewController ()
  3. @end
  4. @implementation ViewController
  5. - (void)viewDidLoad {
  6. [super viewDidLoad];
  7. NSURL *url = [NSURL URLWithString:@"http://www.google.com"];
  8. NSURLRequest *request = [NSURLRequest requestWithURL:url];
  9. NSURLConnection *connection = [[NSURLConnection alloc] initWithRequest:request delegate:self];
  10. if (!connection) {
  11. NSLog(@"FAIL");
  12. }
  13. }
  14. - (NSURLRequest *)connection:(NSURLConnection *)connection willSendRequest:(NSURLRequest *)request redirectResponse:(NSURLResponse *)response {
  15. NSLog(@"================================================");
  16. NSLog(@"will send request\n%@", [request URL]);
  17. NSLog(@"redirect response\n%@", [response URL]);
  18. return request;
  19. }
  20. @end

以上省略了部分无关代码

解释一下代码

在viewDidLoad方法中进行了一次连接 正是谷歌的首页

再看看这个

  1. - (NSURLRequest *)connection:(NSURLConnection *)connection willSendRequest:(NSURLRequest *)request redirectResponse:(NSURLResponse *)response

这个方法在请求将要被发送出去之前会调用

返回值是一个NSURLRequest就是那个真正将要被发送的请求

第二个参数request就是被重定向处理过后的请求 在这里就可以拿到需要的URL

第三个参数response是一个将要触发重定向的请求

这里把request跟response中的URL打出来看一下

并直接返回request

运行看看结果

  1. ====will send request====
  2. http://www.google.com/
  3. ====redirect response====
  4. (null)
  5. ====will send request====
  6. 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
  7. ====redirect response====
  8. http://www.google.com/
  9. ====will send request====
  10. http://www.google.com.hk/
  11. ====redirect response====
  12. 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

可以看出进行了两次重定向

第一次

  1. ====will send request====
  2. http://www.google.com/
  3. ====redirect response====
  4. (null)

由于是第一次调用 没有进行重定向处理 所以redirect response是null

而想要被发送的请求就是www.google.com

第二次

  1. ====will send request====
  2. 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
  3. ====redirect response====
  4. 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

第三次

  1. ====will send request====
  2. http://www.google.com.hk/
  3. ====redirect response====
  4. 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就好了

最新文章

  1. tornado学习笔记19 Tornado框架分析
  2. Lua系统库
  3. gulp基本用法
  4. PSP进度(11~16)
  5. Linux共享对象之编译参数fPIC
  6. mysql之预处理语句prepare、execute、deallocate
  7. iOS开发小技巧--设置按钮圆角
  8. mp3文件 ID3v2 帧标识的含义
  9. asp.net 后台使用js弹窗失效问题
  10. 【The Most Important】浅谈JSP表单Post方式中文乱码问题
  11. python数据可视化(matplotlib)
  12. 201521123004 《Java程序设计》第1周学习总结
  13. 记录1-更换mac pro内存,硬盘及恢复系统
  14. ICPC青岛站网络赛-C-高效模拟
  15. 洛谷 P4705 玩游戏 解题报告
  16. 在linux下面解压用的zxpf是什么意思,它跟zxvf有啥区别
  17. mac 报错Root chmod operation not permitted on file
  18. TCP客户端图片上传服务端保存本地示例
  19. python标准库介绍——32 Queue 模块详解
  20. springmvc DispatchServlet初始化九大加载策略(二)

热门文章

  1. Linux下RPM软件包的安装及卸载
  2. C# 学习笔记02 ADO.net
  3. MyBatis(3.2.3) - One-to-many mapping
  4. js 后台弹窗
  5. KSImageNamed-Xcode插件在xcode 6.4/6.3或其他版本中不能使用解决方案
  6. c# using 引用和别名的使用
  7. OC4_内存管理法则
  8. 引用类型之Function类型
  9. Poj 2262 / OpenJudge 2262 Goldbach's Conjecture
  10. xamarin android——数据绑定到控件(一)