NSURLConnection从重定向的URL获取数据

时间:2013-08-19 06:34:14

标签: ios objective-c nsurlconnection nsurlconnectiondelegate

我正在使用NSURLConection及其委托方法从在线TTS api异步获取数据。这是我要加载的网址:

http://tts-api.com/tts.mp3?q=hello world

以上网址重定向并为我们提供了一个我需要下载的MP3文件。我使用以下委托方法下载mp3文件:

- (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data {

    if (connection == connectionToTTSAPI) {
        mp3Manager = [NSFileManager defaultManager];
        localPath = [[[NSBundle mainBundle] resourcePath]stringByAppendingPathComponent:@"hello.mp3"];
        mp3Handler = [NSFileHandle fileHandleForWritingAtPath:localPath];
        if (!mp3Handler) {
            [[NSFileManager defaultManager] createFileAtPath:localPath contents:nil attributes:nil];
            mp3Handler = [NSFileHandle fileHandleForWritingAtPath:localPath];
        }
        @try {
            [mp3Handler seekToEndOfFile];
            [mp3Handler writeData:data];
        }
    }

}

由于我在程序中使用了多个NSURLConnection,因此我设置了一个if条件来识别响应是针对哪个连接的。但我没有得到mp3文件,所以我在委托方法中设置了一个断点,并发现与TTS API的连接永远不会得到响应。我认为这是因为重定向。当我经历其他一些问题时,我已经看到了使用以下方法,但我在NSURLConnectionDelegate中找不到这样的函数,并且作为NSURLConnection的启动器我不知道如何使用该方法用于处理重定向。没有一个结果让我清楚地知道如何使用它。

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

1 个答案:

答案 0 :(得分:0)

iOS的委托方法在NSURLConnectionDataDelegate中定义,让您有机会控制重定向的处理方式(您可以取消,更改或不更改)。

在您的情况下,您希望让它请求重定向响应返回的URL,因此一个简单的实现将是:

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

    return inRequest;
}

我认为这应该是默认行为,所以如果请求没有被处理,问题很可能在其他地方......