我有来自RSS源的网址,在浏览器中查看时,会重定向到包含应用中所需ID的完整网址。在应用程序中是否有一种方法可以使用来自feed的简化URL(即www.somesite.com/Thing1),并基本上转发链接以获取完整的URL(即www.somesite.com/id= 21424255)都在应用程序内。
答案 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中执行此代码。否则你的代表团可能无法在其他目标文件中工作。 有一个快乐的代码...