我将Xcode更新为7.0或iOS 9.0时遇到问题.不知怎的,它开始给我标题错误
"无法加载资源,因为App Transport Security策略要求使用安全连接"
Web服务方法:
-(void)ServiceCall:(NSString*)ServiceName :(NSString *)DataString
{
NSURLSessionConfiguration *sessionConfiguration = [NSURLSessionConfiguration defaultSessionConfiguration];
[sessionConfiguration setAllowsCellularAccess:YES];
[sessionConfiguration setHTTPAdditionalHeaders:@{ @"Accept" : @"application/json" }];
NSURLSession *session = [NSURLSession sessionWithConfiguration:sessionConfiguration];
NSURL *url = [NSURL URLWithString:[NSString stringWithFormat:@"%@",ServiceURL]];
NSLog(@"URl %@%@",url,DataString);
// Configure the Request
NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url];
[request setValue:[NSString stringWithFormat:@"%@=%@", strSessName, strSessVal] forHTTPHeaderField:@"Cookie"];
request.HTTPBody = [DataString dataUsingEncoding:NSUTF8StringEncoding];
request.HTTPMethod = @"Post";
// post the request and handle response
NSURLSessionDataTask *postDataTask = [session dataTaskWithRequest:request completionHandler:^(NSData *data, NSURLResponse *response, NSError *error)
{
// Handle the …Run Code Online (Sandbox Code Playgroud) 我在iBooks中阅读了Apple编程语言Swift,但无法弄清楚如何在Swift中创建一个http请求(类似于CURL).我是否需要导入Obj-C类或者我只需要导入默认库?或者是否无法基于本机swift代码发出HTTP请求?
更新:找到解决方案.你可以在帖子的最后看到它.
我正在尝试使用远程REST API执行POST请求NSURLSession.我们的想法是使用两个参数发出请求:deviceId和textContent.
问题是服务器无法识别这些参数.服务器部分正常工作,因为我使用POSTMAN为Google Chrome发送了一个POST,它运行得很好.
这是我现在使用的代码:
NSString *deviceID = [[NSUserDefaults standardUserDefaults] objectForKey:@"deviceID"];
NSString *textContent = @"New note";
NSString *noteDataString = [NSString stringWithFormat:@"deviceId=%@&textContent=%@", deviceID, textContent];
NSURLSessionConfiguration *sessionConfiguration = [NSURLSessionConfiguration defaultSessionConfiguration];
sessionConfiguration.HTTPAdditionalHeaders = @{
@"api-key" : @"API_KEY",
@"Content-Type" : @"application/json"
};
NSURLSession *session = [NSURLSession sessionWithConfiguration:sessionConfiguration];
NSURL *url = [NSURL URLWithString:@"http://url_to_manage_post_requests"];
NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url];
request.HTTPBody = [noteDataString dataUsingEncoding:NSUTF8StringEncoding];
request.HTTPMethod = @"POST";
NSURLSessionDataTask *postDataTask = [session dataTaskWithRequest:request completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) { …Run Code Online (Sandbox Code Playgroud) 试图在iOS9上运行我现有的应用程序但在使用时出现故障AFURLSessionManager.
__block NSURLSessionDataTask *task = [self.sessionManager dataTaskWithRequest:request completionHandler:^(NSURLResponse * __unused response, id responseObject, NSError *error) {
if (error) {
} else {
}
}];
[task resume];
Run Code Online (Sandbox Code Playgroud)
我收到以下错误:
Error Domain=NSURLErrorDomain Code=-999 "cancelled.
Run Code Online (Sandbox Code Playgroud)
获取以下日志:
NSURLSession/NSURLConnection HTTP load failed (kCFStreamErrorDomainSSL, -9824
CFNetwork SSLHandshake failed (-9824)
Run Code Online (Sandbox Code Playgroud)
更新: 我已为我的解决方案添加了多个更新: iOS 9上的NSURLSession/NSURLConnection HTTP加载失败
我想要实现的是URLSession在swift 3中执行请求.我在一个单独的函数中执行此操作(以便不为GET和POST单独编写代码)并返回URLSessionDataTask并处理闭包中的成功和失败.有点像这样 -
let task = URLSession.shared.dataTask(with: request) { (data, uRLResponse, responseError) in
DispatchQueue.main.async {
var httpResponse = uRLResponse as! HTTPURLResponse
if responseError != nil && httpResponse.statusCode == 200{
successHandler(data!)
}else{
if(responseError == nil){
//Trying to achieve something like below 2 lines
//Following line throws an error soo its not possible
//var errorTemp = Error(domain:"", code:httpResponse.statusCode, userInfo:nil)
//failureHandler(errorTemp)
}else{
failureHandler(responseError!)
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
我不希望处理此函数中的错误条件,并希望使用响应代码生成错误,并返回此错误以在任何调用此函数的位置处理它.任何人都可以告诉我该怎么做?或者这不是处理这种情况的"快速"方式吗?
我的测试应用程序遇到了一些奇怪的行为.我发送到同一台服务器的同时有大约50个GET请求.服务器是一块资源非常有限的小型硬件上的嵌入式服务器.为了优化每个请求的性能,我配置了一个Alamofire.Manager如下实例:
let configuration = NSURLSessionConfiguration.defaultSessionConfiguration()
configuration.HTTPMaximumConnectionsPerHost = 2
configuration.timeoutIntervalForRequest = 30
let manager = Alamofire.Manager(configuration: configuration)
Run Code Online (Sandbox Code Playgroud)
当我发送请求时,manager.request(...)它们将成对发送(正如预期的那样,使用Charles HTTP Proxy检查).但奇怪的是,所有未在第一次请求后30秒内完成的请求因同时超时而被取消(即使它们尚未发送).这是展示行为的插图:

这是一种预期的行为吗?如何确保请求在发送之前不会获得超时?
非常感谢!
concurrency nsurlsession nsurlsessionconfiguration swift alamofire
我有一个应用程序,目前NSURLConnection用于其绝大多数网络.我想搬到,NSURLSession因为Apple告诉我这是要走的路.
我的应用只是NSURLConnection通过+ (NSData *)sendSynchronousRequest:(NSURLRequest *)request returningResponse:(NSURLResponse **)response error:(NSError **)error类方法使用同步版本.我在NSBlockOperation运行中执行此操作,NSOperationQueue因此我不会不必要地阻止主队列.以这种方式做事的最大好处是我可以使操作彼此依赖.例如,我可以让请求数据的任务依赖于登录任务完成.
我没有看到任何对同步操作的支持NSURLSession.所有我能找到的文章都是嘲笑我甚至想要同步使用它而且我是一个阻止线程的可怕人物.精细.但我认为没有办法让NSURLSessionTask彼此依赖.有没有办法做到这一点?
或者有描述我将如何以不同的方式做这样的事情?
我正在尝试构建一个批量图像下载器,可以将图像动态添加到队列中进行下载,我可以找到进度以及何时完成下载.
通过我的阅读,似乎NSOperationQueue对于队列功能和NSURLSession网络功能似乎是我最好的选择,但我很困惑如何使用这两个串联.
我知道我想补充的情况下,NSOperation在NSOperationQueue他们得到排队.似乎我创建了一个下载任务NSURLSessionDownloadTask,如果我需要多个任务,我会创建多个任务,但我不确定如何将两者放在一起.
NSURLSessionDownloadTaskDelegate 似乎拥有下载进度和完成通知所需的所有信息,但我还需要能够停止特定下载,停止所有下载,并处理从下载中获取的数据.
当我尝试创建自己的会话对象NSURLSession()并请求一个url时,我得到一个无法识别的选择器异常,但是当我使用共享会话时,NSURLSession.sharedSession()一切正常.怎么会?
var url = NSURL(string: "http:/www.google.com")
if url != nil {
//throws unrecognized selector when dataTaskWithURL is called
let session=NSURLSession()
session.dataTaskWithURL(url!)
//works
let sharedSession=NSURLSession.sharedSession()
sharedSession.dataTaskWithURL(url!)
}
Run Code Online (Sandbox Code Playgroud) 我NSURLSession用于背景图片上传.根据上传的图像,我的服务器给了我回复,我相应地更改了我的应用程序.但是当我的应用程序在后台上传图片时,我无法获得服务器响应,因为没有完成块.
有没有办法在不使用完成块的情况下获得响应NSURLUploadTask?
这是我的代码:
self.uploadTask = [self.session uploadTaskWithRequest:request fromData:body completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) {
NSString *returnString = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
NSLog(@"returnString : %@",returnString);
NSLog(@"error : %@",error);
}];
[self.uploadTask resume];
Run Code Online (Sandbox Code Playgroud)
但我得到了这个错误..
由于未捕获的异常'NSGenericException'而终止应用程序,原因:'后台会话不支持完成处理程序块.请改为使用委托.
但是,如果我不能使用完成处理程序,我应该如何获得服务器响应.它说使用委托,但我找不到任何可以给我服务器响应的委托方法.
nsurlsession ×10
ios ×9
objective-c ×4
swift ×3
ios9 ×2
afnetworking ×1
alamofire ×1
concurrency ×1
iphone ×1
nsoperation ×1
swift3 ×1
tls1.2 ×1
xcode7 ×1