iPhone SDK: получить переадресованный URL - PullRequest
2 голосов
/ 29 марта 2012

У меня есть URL-адрес из RSS-канала, который при просмотре в браузере перенаправляет на полный URL-адрес, содержащий идентификаторы, которые мне нужны в приложении. Есть ли способ в приложении, чтобы я мог взять упрощенный URL-адрес, полученный из канала (например, www.somesite.com/Thing1), и по существу переслать ссылку, чтобы получить полный URL-адрес (например, www.somesite.com/id= 21424255) все в приложении.

Ответы [ 3 ]

3 голосов
/ 29 марта 2012

Если короткий URL перенаправляет на полный URL, NSURLConnection прозрачно обрабатывает перенаправление.Чтобы получить URL перенаправления, вам нужно внедрить

- (NSURLRequest *)connection: (NSURLConnection *)inConnection
         willSendRequest: (NSURLRequest *)inRequest
        redirectResponse: (NSURLResponse *)inRedirectResponse

в делегате NSURLConnection.Целевой URL перенаправления: [inRequest URL]

Удачи.

2 голосов
/ 29 марта 2012

Вам нужно будет ввести NSURLRequest для короткого URL-адреса и получить ответ.Вам понадобится NSHTTPURLResponse - подкласс NSURLResponse Предположительно, если он выполняет перенаправление 301, вы можете прочитать заголовки ответа и получить URL из заголовка "Location".

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

Посмотрите на этот вопрос для более подробного примера создания NSURLConnection с запросом.

Редактировать: Хотя приведенный выше код верен для других полей заголовка, как указал Адамниже вам нужно будет использовать метод делегата connection:willSendRequest:redirectResponse: для захвата места перенаправления, поскольку перенаправление обрабатывается автоматически.

1 голос
/ 21 января 2014

Прежде всего, есть 3 способа узнать новое соединение URL. (1) NSURLSession (2) NSURLConnection (3) NSURLDownload.Я использую здесь NSURLConnection, чтобы объяснить вам, как это сделать.

(1) Прежде всего выберите ваш URL, который перенаправляет (я выбираю здесь 'http://www.google.com',, потому что он будет перенаправленсначала 'http://www.google.co.in/?gws_rd=cr&ei=LEfeUvCeA8aLrQew04GICQ').Now. Создайте два свойства в файле .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);
}

assert гарантирует, что ваш подготовленный запрос не будет равен нулю, если он будет равен нулю, то будет отображаться ошибка только в этом месте., затем вы должны убедиться, что вы правильно следуете этому коду.

(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"]);
}

Здесь вы получите новый URL-адрес в [[NSUserDefaults standardUserDefaults] objectForKey: @ "serverurl"], вы можетеиспользуйте NSUserDefaults или NSString to пользователь во всем вашем проекте.Примечание: пожалуйста, не забудьте сделать этот код только в UIViewController.иначе может быть возможно, что ваша делегация не будет работать с другими объектными файлами.Удачного кода ...

...