我正在尝试从我的iOS应用中的PHP服务下载文件。我从Android和浏览器使用相同的PHP服务,服务器部分工作正常。我可以在浏览器中测试网址,并提示您按照预期下载文件。 如果我直接从我的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和浏览器一样,如果我只是将网址指向该文件就可以下载了。
我被困住了,我感谢我能得到的任何帮助。
答案 0 :(得分:0)
我想在你的第一个方法下载文件中再写两行:
- (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];
if (connection)
{
self.responseData = [NSMutableData data];
}
return TRUE;
}
并将responseData对象的属性设置为非原子并保留在.h文件中并在ur .m文件中合成它。同时在ur dealloc中释放它,并在viewDidUnload中将其设为nil。
另外 我不知道你用ur方法调用什么类型的Web服务。但是有两种类型的Web服务GET和POST。你不能调用POST服务只在你的方法中将GET改为POST [request setHTTPMethod:@“POST”];
请尝试使用AFNetworking类或ASIHTTPRequest类 有一些Web服务的示例项目可以帮助您
用于AFNetworking:
https://github.com/AFNetworking/AFNetworking
http://mobile.tutsplus.com/tutorials/iphone/afnetworking-1-0/
用于ASIHTTPRequest
答案 1 :(得分:0)
原来这是服务器上的网址。在Apple文件夹而不是Android文件夹中设置了安全设置。