2012-03-28 15 views
2

Ich habe eine URL von einem RSS-Feed, der, wenn er in einem Browser angezeigt wird, auf die vollständige URL umleitet, die IDs enthält, die ich in der App brauche. Gibt es einen Weg in einer App, dass ich die vereinfachte URL nehmen kann, die aus dem Feed kommt (zB www.somesite.com/Thing1) und im Wesentlichen den Link weiterleitet, um die volle URL zurück zu bekommen (zB www.somesite.com/id= 21424255) alles innerhalb der App.iPhone SDK: Erhalte eine weitergeleitete URL

Antwort

2

Sie müssen eine NSURLRequest an die kurze URL durchführen und die Antwort erhalten. Sie wollen es als NSHTTPURLResponse - eine Unterklasse von NSURLResponse Vermutlich, wenn es eine 301-Weiterleitung, können Sie die Antwort-Header lesen und erhalten Sie die URL von der "Location" -Header.

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

Werfen Sie einen Blick auf this Frage für ein detailliertes Beispiel der NSURLConnection mit der Bitte zu schaffen.

Edit: Während der obige Code für andere Header-Felder gilt, wie Adam unten hingewiesen, müssen Sie die connection:willSendRequest:redirectResponse: Delegate-Methode verwenden, um den Redirect-Speicherort zu erfassen, wie die Umleitung automatisch behandelt wird.

3

Wenn die kurze URL zur vollständigen URL umgeleitet wird, wird die Umleitung von NSURLConnection transparent gehandhabt. Um die Umleitungs-URL zu erhalten, müssen Sie

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

auf dem NSURLConnection Delegierten implementieren. Die Umleitungsziel-URL lautet [inRequest URL]

Viel Glück.

1

Zuerst gibt es 3 Möglichkeiten, eine neue URL-Verbindung zu finden. (1) NSURLSession (2) NSURLConnection (3) NSURLDownload. Ich benutze hier NSURLConnection, um Ihnen zu erklären, wie es geht.

(1) Zunächst einmal wählen Sie Ihre URL, die Umleitungen (Ich wähle hier ‚http://www.google.com‘, weil es zu ‚http://www.google.co.in/?gws_rd=cr&ei=LEfeUvCeA8aLrQew04GICQ‘ umgeleitet wird) .Jetzt Erstellen Sie zunächst zwei Eigenschaften in .h-Datei wie unten.

@interface ConfigViewController() 

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

@end 

(2) Dann synthetisieren Sie Ihre Eigenschaften in .m-Datei.

@synthesize request; 
@synthesize connection = _connection; 

(3) Dann erstellen Sie Ihre NSURLRequest und 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 wird sicherstellen, dass Ihre vorbereitete Anfrage nicht Null sein wird, wenn es gleich Null dann wird es nur einen Fehler an diesem Ort zeigt, dann müssen Sie sicherstellen, dass Sie diesen Code werden folgende richtig .

(4) Implementieren Sie jetzt diese zwei Delegation in Ihrer .h-Datei - NSURLConnectionDelegate & NSURLConnectionDataDelegate.

@interface WTViewController : UIViewController <NSURLConnectionDelegate, NSURLConnectionDataDelegate>{ 

IBOutlet UITextView *txtPreviousLbl; 
IBOutlet UITextView *txtNextlbl; 
} 

(5) Implementieren Sie dann diese drei Delegierungsmethoden zu Ihrer .m (Implementierung) -Datei.

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

Hier finden Sie Ihre neue URL in get [[NSUserDefaults standardUserDefaults] objectForKey: @ "serverURL"], Sie einen NSUserDefaults oder NSString an Benutzer in Ihrem gesamten Projekt verwenden können. Hinweis: Bitte vergessen Sie nicht, diesen Code nur in UIViewController zu verwenden.Andernfalls kann Ihre Delegation in anderen Objektdateien nicht funktionieren. Haben Sie einen glücklichen Code ...