我正在尝试从我的 iOS 应用程序中的 PHP 服务下载文件。我使用来自 Android 和浏览器的相同 PHP 服务,并且服务器部分工作正常。我可以在浏览器中测试 url 并提示下载文件,就像你期望的那样。如果我将 url 直接指向我的 iOS 代码中的文件,我也可以很好地下载文件。这些是 zip 文件。我必须使用这种方法,因为我需要通过 id 获取文件,并且必须传递访问令牌字符串。这些验证正常,所以它们不是问题。
当我连接时,我得到一个带有 httpResponse 状态代码 200 的 didReceiveResponse,我相信这是可以的。然后我得到一个 connectionDidFinishLoading 委托调用,但在两者之间从未得到任何数据或错误。
这是我的连接代码:
- (BOOL)downloadFile:(NSString *)fileName:(int)fileId
{
BOOL retVal = FALSE;
NSString *strUrl = [NSString stringWithFormat:@"%@?id=%d&token=%@", FILE_URL, fileId, accessToken];
NSURL *myURL = [NSURL URLWithString:strUrl];
NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:myURL cachePolicy:NSURLRequestReloadIgnoringLocalCacheData timeoutInterval:60];
// Starts the download
connection = [[NSURLConnection alloc] initWithRequest:request delegate:self];
return TRUE;
}
// 这里是响应代码:
- (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response
{
NSHTTPURLResponse *httpResponse = (NSHTTPURLResponse *)response;
int code = [httpResponse statusCode];
if(code <= 200)
{
[responseData setLength:0];
}
else
{
NSString *msg = [NSString stringWithFormat:@"Error Code: %d. Download has Failed.", code];
UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Download Error!"
message:msg
delegate:nil
cancelButtonTitle:@"OK"
otherButtonTitles:nil];
[alert show];
}
}
// 这是单独接收数据的方法。永远不会被调用
- (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data
{
[responseData appendData:data];
}
// 失败委托方法,也不会被调用
- (void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error
{
NSString *msg = [NSString stringWithFormat:@"Error: %@", [error localizedDescription]];
UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Download Error!"
message:msg
delegate:nil
cancelButtonTitle:@"OK"
otherButtonTitles:nil];
[alert show];
}
就像我说的那样,它可以在 Android 和浏览器上运行,如果我只是将 url 指向文件,它会很好地下载。
我被困住了,我很感激我能得到的任何帮助。