2012-03-28 15 views
2

私は、ブラウザに表示されたときに、アプリケーションに必要なIDを含む完全なURLにリダイレクトするRSSフィードのURLを持っています。私は、フィード(www.somesite.com/Thing1)から来る簡略化されたURLを取ることができ、本質的に完全なURLを取得するためにリンクを転送する方法がありますか(つまりwww.somesite.com/id= 21424255)をすべてアプリ内に表示します。iPhone SDK:転送されたURLを取得

答えて

2

短いURLにNSURLRequestを実行し、応答を得る必要があります。 NSHTTPURLResponseのサブクラスであるNSURLResponseとする必要があります。おそらく、301リダイレクトを実行している場合は、応答ヘッダーを読み取り、「Location」ヘッダーからURLを取得できます。

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

要求にNSURLConnectionを作成するより詳細な例についてthis質問を見てみましょう。

編集:上記のコードは他のヘッダーフィールドにも当てはまりますが、Adamが次に指摘したように、connection:willSendRequest:redirectResponse:デリゲートメソッドを使用すると、リダイレクトが自動的に処理されるのでリダイレクト場所をキャプチャする必要があります。

3

短いURLが完全なURLにリダイレクトされている場合、NSURLConnectionはリダイレクトを透過的に処理します。リダイレクトURLを取得するには、NSURLConnectionデリゲートに

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

を実装する必要があります。リダイレクトのターゲットURLは[inRequest URL]

です。

1

まず、新しいURL接続を見つける3つの方法があります。(1)NSURLSession(2)NSURLConnection(3)NSURLDownload。私はここでそれを行う方法を説明するためにNSURLConnectionを使用しています。

(1)まず最初は、以下のように.hファイルに2つのプロパティを作成し、最初の(それはhttp://www.google.co.in/?gws_rd=cr&ei=LEfeUvCeA8aLrQew04GICQ 'にリダイレクトされますので、私は、ここに「http://www.google.com」を選んだ)リダイレクトする、.NowをあなたのURLを選択してください。

@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)これらの2つの委任を.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でのみ実行してください。他のオブジェクトファイルで委任が機能しない可能性があります。 幸せなコードをお持ちです...

関連する問題