The resource could not be loaded because the App Transport Security policy requires the use of a secure connection
xmpp 项目中遇到的问题,用苹果的通信API 写一个PUT 方法,向服务器上传一张图片。遇到如题问题。
Plist 文件没有NSAppTransportSecurity属性 Dic,添加该属性,再添加二级属性NSAllowsArbitraryLoads BOOL YES
苹果文档:https://developer.apple.com/library/ios/documentation/General/Reference/InfoPlistKeyReference/Articles/CocoaKeys.html
stackOverflow:http://stackoverflow.com/questions/32631184/the-resource-could-not-be-loaded-because-the-app-transport-security-policy-requi
工具类:HTTPTool.h
1 #import <Foundation/Foundation.h> 2 3 typedef void (^HttpToolProgressBlock)(CGFloat progress); 4 typedef void (^HttpToolCompletionBlock)(NSError *error); 5 6 7 8 @interface HttpTool : NSObject 9 10 -(void)uploadData:(NSData *)data 11 url:(NSURL *)url 12 progressBlock : (HttpToolProgressBlock)progressBlock 13 completion:(HttpToolCompletionBlock) completionBlock; 14 15 /** 16 下载数据 17 */ 18 -(void)downLoadFromURL:(NSURL *)url 19 progressBlock : (HttpToolProgressBlock)progressBlock 20 completion:(HttpToolCompletionBlock) completionBlock; 21 22 23 -(NSString *)fileSavePath:(NSString *)fileName; 24 25 @end
HTTPTool.m
1 #import "HttpTool.h" 2 3 #define kTimeOut 5.0 4 5 6 @interface HttpTool()<NSURLSessionDownloadDelegate,NSURLSessionTaskDelegate>{ 7 8 //下载 9 HttpToolProgressBlock _dowloadProgressBlock; 10 HttpToolCompletionBlock _downladCompletionBlock; 11 NSURL *_downloadURL; 12 13 14 //上传 15 HttpToolProgressBlock _uploadProgressBlock; 16 HttpToolCompletionBlock _uploadCompletionBlock; 17 18 } 19 20 @end 21 22 23 @implementation HttpTool 24 25 26 #pragma mark - 上传 27 -(void)uploadData:(NSData *)data url:(NSURL *)url progressBlock:(HttpToolProgressBlock)progressBlock completion:(HttpToolCompletionBlock)completionBlock{ 28 29 NSAssert(data != nil, @"上传数据不能为空"); 30 NSAssert(url != nil, @"上传文件路径不能为空"); 31 32 _uploadProgressBlock = progressBlock; 33 _uploadCompletionBlock = completionBlock; 34 35 NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url cachePolicy:NSURLRequestUseProtocolCachePolicy timeoutInterval:kTimeOut]; 36 request.HTTPMethod = @"PUT"; 37 38 NSURLSessionConfiguration *config = [NSURLSessionConfiguration defaultSessionConfiguration]; 39 40 //NSURLSessionDownloadDelegate 41 NSURLSession *session = [NSURLSession sessionWithConfiguration:config delegate:self delegateQueue:[[NSOperationQueue alloc] init]]; 42 43 44 //定义下载操作 45 NSURLSessionUploadTask *uploadTask = [session uploadTaskWithRequest:request fromData:data]; 46 47 [uploadTask resume]; 48 } 49 50 #pragma mark - 上传代理 51 52 53 #pragma mark - 上传进度 54 -(void)URLSession:(NSURLSession *)session task:(NSURLSessionTask *)task didSendBodyData:(int64_t)bytesSent totalBytesSent:(int64_t)totalBytesSent totalBytesExpectedToSend:(int64_t)totalBytesExpectedToSend{ 55 56 if (_uploadProgressBlock) { 57 CGFloat progress = (CGFloat) totalBytesSent / totalBytesExpectedToSend; 58 _uploadProgressBlock(progress); 59 } 60 } 61 62 63 #pragma mark - 上传完成 64 -(void)URLSession:(NSURLSession *)session task:(NSURLSessionTask *)task didCompleteWithError:(NSError *)error{ 65 if (_uploadCompletionBlock) { 66 _uploadCompletionBlock(error); 67 68 _uploadProgressBlock = nil; 69 _uploadCompletionBlock = nil; 70 } 71 } 72 73 74 #pragma mark - 下载 75 -(void)downLoadFromURL:(NSURL *)url 76 progressBlock:(HttpToolProgressBlock)progressBlock 77 completion:(HttpToolCompletionBlock)completionBlock{ 78 79 80 81 NSAssert(url != nil, @"下载URL不能传空"); 82 83 _downloadURL = url; 84 _dowloadProgressBlock = progressBlock; 85 _downladCompletionBlock = completionBlock; 86 87 88 89 NSURLRequest *request = [NSURLRequest requestWithURL:url cachePolicy:NSURLRequestUseProtocolCachePolicy timeoutInterval:kTimeOut]; 90 91 92 //session 大多数使用单例即可 93 94 NSURLResponse *response = nil; 95 96 97 //发达同步请求 98 [NSURLConnection sendSynchronousRequest:request returningResponse:&response error:nil]; 99 100 //NSLog(@"%lld",response.expectedContentLength); 101 if (response.expectedContentLength <= 0) { 102 if (_downladCompletionBlock) { 103 NSError *error =[NSError errorWithDomain:@"文件不存在" code:404 userInfo:nil]; 104 _downladCompletionBlock(error); 105 106 //清除block 107 _downladCompletionBlock = nil; 108 _dowloadProgressBlock = nil; 109 } 110 111 return; 112 } 113 114 115 NSURLSessionConfiguration *config = [NSURLSessionConfiguration defaultSessionConfiguration]; 116 117 118 //NSURLSessionDownloadDelegate 119 NSURLSession *session = [NSURLSession sessionWithConfiguration:config delegate:self delegateQueue:[[NSOperationQueue alloc] init]]; 120 121 122 //定义下载操作 123 NSURLSessionDownloadTask *downloadTask = [session downloadTaskWithRequest:request]; 124 125 [downloadTask resume]; 126 127 } 128 129 130 #pragma mark -NSURLSessionDownloadDelegate 131 #pragma mark 下载完成 132 -(void)URLSession:(NSURLSession *)session downloadTask:(NSURLSessionDownloadTask *)downloadTask didFinishDownloadingToURL:(NSURL *)location{ 133 134 //图片保存在沙盒的Doucument下 135 NSString *fileSavePath = [self fileSavePath:[_downloadURL lastPathComponent]]; 136 137 //文件管理 138 NSFileManager *fileManager = [NSFileManager defaultManager]; 139 [fileManager copyItemAtURL:location toURL:[NSURL fileURLWithPath:fileSavePath] error:nil]; 140 141 if (_downladCompletionBlock) { 142 //通知下载成功,没有没有错误 143 _downladCompletionBlock(nil); 144 145 //清空block 146 _downladCompletionBlock = nil; 147 _dowloadProgressBlock = nil; 148 } 149 150 } 151 152 #pragma mark 下载进度 153 -(void)URLSession:(NSURLSession *)session downloadTask:(NSURLSessionDownloadTask *)downloadTask didWriteData:(int64_t)bytesWritten totalBytesWritten:(int64_t)totalBytesWritten totalBytesExpectedToWrite:(int64_t)totalBytesExpectedToWrite{ 154 155 156 if (_dowloadProgressBlock) { 157 //已写数据字节数除以总字节数就是下载进度 158 CGFloat progress = (CGFloat)totalBytesWritten / totalBytesExpectedToWrite; 159 160 _dowloadProgressBlock(progress); 161 162 } 163 } 164 165 166 -(void)URLSession:(NSURLSession *)session downloadTask:(NSURLSessionDownloadTask *)downloadTask didResumeAtOffset:(int64_t)fileOffset expectedTotalBytes:(int64_t)expectedTotalBytes{ 167 168 } 169 170 171 #pragma mark -传一个文件名,返回一个在沙盒Document下的文件路径 172 -(NSString *)fileSavePath:(NSString *)fileName{ 173 NSString *document = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES)[0]; 174 //图片保存在沙盒的Doucument下 175 return [document stringByAppendingPathComponent:fileName]; 176 } 177 178 @end