iPhone SDK:获取转发的URL

时间:2012-03-28 21:57:48

标签: objective-c ios4 nsstring nsurl nsurlrequest

我有来自RSS源的网址,在浏览器中查看时,会重定向到包含应用中所需ID的完整网址。在应用程序中是否有一种方法可以使用来自feed的简化URL(即www.somesite.com/Thing1),并基本上转发链接以获取完整的URL(即www.somesite.com/id= 21424255)都在应用程序内。

3 个答案:

答案 0 :(得分:3)

如果短URL重定向到完整URL,NSURLConnection将透明地处理重定向。要获取重定向网址,您需要实现

- (NSURLRequest *)connection: (NSURLConnection *)inConnection
         willSendRequest: (NSURLRequest *)inRequest
        redirectResponse: (NSURLResponse *)inRedirectResponse
NSURLConnection委托上的

。重定向目标网址为[inRequest URL]

祝你好运。

答案 1 :(得分:2)

您需要对短网址执行NSURLRequest,然后获取回复。你需要它作为NSHTTPURLResponse - NSURLResponse的子类。如果它正在进行301重定向,你可以阅读响应标题并从“位置”标题中获取URL。

NSDictionary *headers = [myHTTPResponse allHeaderFields];
NSString *redirectLocation = [headers objectForKey:@"Location"];

请查看this问题,了解使用请求创建NSURLConnection的更详细示例。

编辑:虽然以上代码适用于其他标题字段,正如Adam在下面指出的那样,您必须使用connection:willSendRequest:redirectResponse:委托方法来捕获重定向位置,因为重定向是自动处理的。

答案 2 :(得分:1)

首先,有3种方法可以找到新的URL连接。(1)NSURLSession(2)NSURLConnection(3)NSURLDownload。我在这里使用NSURLConnection来解释你该怎么做。

(1)首先选择重定向的网址(我在这里选择“http://www.google.com”,因为它会被重定向到“http://www.google.co.in/?gws_rd=cr&ei=LEfeUvCeA8aLrQew04GICQ”。现在首先,创建两个属性在.h文件中如下。

@interface ConfigViewController ()

   @property (nonatomic, retain) NSURLRequest *request;
   @property (nonatomic, strong, readwrite) NSURLConnection *connection;

@end

(2)然后,在.m文件中合成您的属性。

@synthesize request;
@synthesize connection    = _connection;

(3)然后,创建您的NSURLRequest和NSURLConnection。

- (void)viewDidLoad{

    [super viewDidLoad];
// Do any additional setup after loading the view, typically from a nib.

    self.request = [[NSURLRequest alloc] initWithURL:[NSURL URLWithString:@"http://www.google.com"]];
    assert(self.request != nil);
    self.connection = nil;
    self.connection = [NSURLConnection connectionWithRequest:request delegate:self];
    assert(self.connection != nil);
}

断言将确保您准备好的请求不会为nil,如果它将为nil那么它将仅在该位置显示错误,那么您必须确保正确地遵循此代码。

(4)现在,在你的.h文件中实现这两个委托 - NSURLConnectionDelegate& NSURLConnectionDataDelegate。

@interface WTViewController : UIViewController <NSURLConnectionDelegate, NSURLConnectionDataDelegate>{

IBOutlet UITextView *txtPreviousLbl;
IBOutlet UITextView *txtNextlbl;
}

(5)然后,将这3个委托方法实现到.m(实现)文件。

- (NSURLRequest *)connection:(NSURLConnection *)connection willSendRequest:(NSURLRequest *)request redirectResponse:(NSURLResponse *)redirectedResponse{

    NSURLRequest *redirectedRequest = request;
    if (redirectedResponse) {
        redirectedRequest = nil;
    }
    NSLog(@"RedirectedRequest:%@",redirectedRequest);
    return redirectedRequest;
}

- (void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error{
NSLog(@"error:%@",error);
}

- (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response{

    NSLog(@"Response:%@",response);

    NSHTTPURLResponse *httpResponse = (NSHTTPURLResponse *)response;
    NSDictionary *responseDictionary = [httpResponse allHeaderFields];

    NSString *strNewURLLocation = [responseDictionary objectForKey:@"Location"];
    NSLog(@"ResponseDictionary:%@",[responseDictionary objectForKey:@"Location"]);

    [[NSUserDefaults standardUserDefaults] setObject:strNewURLLocation forKey:@"serverurl"];
    NSLog(@"NewURLLocation:%@",[[NSUserDefaults standardUserDefaults] objectForKey:@"serverurl"]);
}

您将在[[NSUserDefaults standardUserDefaults] objectForKey:@“serverurl”]中获取新URL,您可以在整个项目中使用NSUserDefaults或NSString。 注意:请不要忘记仅在UIViewController中执行此代码。否则你的代表团可能无法在其他目标文件中工作。 有一个快乐的代码...