嗨,我正在开发一个Iphone应用程序我想在服务器响应后设置cookie并将其用于另一个请求.我的网络请求看起来像.
NSURLSession *session = [NSURLSession sharedSession];
[[session dataTaskWithURL:url completionHandler:^(NSData *data, NSURLResponse *response, NSError *error)
{
NSHTTPURLResponse *httpResp = (NSHTTPURLResponse*) response;
NSLog(@"sttaus code %i", httpResp.statusCode);
if (error) {
[self.delegate signinWithError:error];
}
else {
[self.delegate signinWithJson:data];
}
}] resume];
Run Code Online (Sandbox Code Playgroud)
但我不知道如何设置cookie.我知道我必须使用,NSHTTPCookieStorage但我不知道如何设置.而且我也希望将cookie用于其他请求.有没有人知道这件事?需要帮忙.谢谢.
看到我试过这种方式
NSURLSession *session = [NSURLSession sharedSession];
[[session dataTaskWithURL:url completionHandler:^(NSData *data, NSURLResponse *response, NSError *error)
{
if(error) {
[self.delegate signinWithError:error];
}
else {
NSHTTPURLResponse *httpResp = (NSHTTPURLResponse*) response;
[[NSHTTPCookieStorage sharedHTTPCookieStorage] setCookieAcceptPolicy:NSHTTPCookieAcceptPolicyAlways];
NSHTTPCookie *cookie;
NSMutableDictionary *cookieProperties = [NSMutableDictionary dictionary];
NSDictionary* headers = …Run Code Online (Sandbox Code Playgroud) 所以我在主线程上创建我的下载
NSURLRequest *request = [NSURLRequest requestWithURL:download.URL];
NSURLSessionDownloadTask *downloadTask = [self.downloadSession downloadTaskWithRequest:request];
[downloadTask resume];
Run Code Online (Sandbox Code Playgroud)
并将与下载相关联的NSManagedContextID添加到NSMutableDictionary中,以便稍后在委托回调中检索它
[self.downloads setObject:[download objectID] forKey:[NSNumber numberWithInteger:downloadTask.taskIdentifier]];
Run Code Online (Sandbox Code Playgroud)
我的self.downloadSession上面配置是这样的
- (NSURLSession *)backgroundSession
{
static NSURLSession *session = nil;
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
NSURLSessionConfiguration *configuration = [NSURLSessionConfiguration backgroundSessionConfiguration:@"com.test.backgroundSession"];
configuration.discretionary = YES;
session = [NSURLSession sessionWithConfiguration:configuration delegate:self delegateQueue:nil];
});
return session;
}
Run Code Online (Sandbox Code Playgroud)
我的问题是委托回调似乎在不同的线程上调用
- (void)URLSession:(NSURLSession *)session downloadTask:(NSURLSessionDownloadTask *)downloadTask didWriteData:(int64_t)bytesWritten totalBytesWritten:(int64_t)totalBytesWritten totalBytesExpectedToWrite:(int64_t)totalBytesExpectedToWrite
{
NSManagedObjectID *downloadID = [self.downloads objectForKey:[NSNumber numberWithInteger:downloadTask.taskIdentifier]];
double progress = (double)totalBytesWritten / (double)totalBytesExpectedToWrite;
NSDictionary *userInfo = [NSDictionary …Run Code Online (Sandbox Code Playgroud) 所以我知道在旧的AFNetworking中使用AFHTTPClient是可能的,我知道如果我使用AFHTTPRequestOperationManager我可以设置队列的限制,但我不能让AFHTTPSessionManager一次只运行x个请求而不是我自己实现它使用成功块(我不想).
以下代码不限制我的连接:
AFHTTPSessionManager*manager = [AFHTTPSessionManager manager]; manager.operationQueue.maxConcurrentOperationCount = 1;
根据这里有趣的讨论,我向服务器提出了很多请求,并且在我获得超时之前将其阻塞,因此我确实需要限制并发连接.
我错过了什么?
network-programming ios afnetworking afnetworking-2 nsurlsession
我正在使用一个NSURLSession对象在我的应用程序中加载图像.这可能是同时加载几个图像.
在某些时刻,我需要取消加载一个特定图像并继续加载其他图像.
你能建议正确的方法吗?
我正在开发一个类似于Instagram Feed的应用程序(包含图像和一些标签的单元格的表格视图).
对于我从数据库中获取的所有数据,我正在使用数据任务(因为接收它们并不需要太多),但是对于图像(我们使用数据请求获取它们的URL),我需要保存在本地以备将来使用(改善用户体验).
我的逻辑如下:保存在NSCache或文档目录中,文件夹中的图像带有下载日期(创建一次并附加所有其他图像,如果需要)(我正在删除不是来自最近的7个文件夹)几天,然后对于TableView,只是从那里加载,所以tableview将平滑滚动,不会直接从其委托方法加载网址.那么根据我的需求,NSCache或文档目录,哪里有更好的存储位置.
期待听到您的建议,谢谢!
嗨,我收到以下错误:
错误域= NSURLErrorDomain代码= -1202 \"此服务器的证书无效.您可能正在连接到假装为"server-prod.name-cloud.com"的服务器,这可能会使您的机密信息面临风险. \"UserInfo = {NSErrorFailingURLStringKey = https://server-prod.name-cloud.com/v3/project/session/926B9E6BE31B /,NSLocalizedRecoverySuggestion =您是否还要连接到服务器?,_ kCFStreamErrorDomainKey = 3,NSErrorFailingURLKey = https ://server-prod.name-cloud.com/v3/project/session/926B9E6BE31B /,_ kCFStreamErrorCodeKey = -9843,NSLocalizedDescription =此服务器的证书无效.您可能正在连接到假装为"server-prod.name-cloud.com"的服务器,这可能会使您的机密信息面临风险.}
我阅读了所有相关文档,我们应用了"常见故障"部分中的所有要求.
更多细节:
在我使用的应用程序中:
<key>NSAppTransportSecurity</key>
<dict>
<key>NSAllowsArbitraryLoads</key>
<true/>
</dict>
Run Code Online (Sandbox Code Playgroud)
注意 - 在生产中我总是使用HTTP,我留下NSAllowsArbitraryLoads,因为一些离岸测试人员可以将路由切换到HTTP进行调试.
我有一个应用程序,目前正在上传图像到亚马逊S3.我一直在尝试将它从使用NSURLConnection切换到NSURLSession,以便在应用程序处于后台时上传可以继续!我似乎遇到了一些问题.创建NSURLRequest并将其传递给NSURLSession,但亚马逊发回403禁止响应,如果我将相同的请求传递给NSURLConnection,则它会完美地上传文件.
以下是创建响应的代码:
NSString *requestURLString = [NSString stringWithFormat:@"http://%@.%@/%@/%@", BUCKET_NAME, AWS_HOST, DIRECTORY_NAME, filename];
NSURL *requestURL = [NSURL URLWithString:requestURLString];
NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:requestURL
cachePolicy:NSURLRequestReloadIgnoringLocalAndRemoteCacheData
timeoutInterval:60.0];
// Configure request
[request setHTTPMethod:@"PUT"];
[request setValue:[NSString stringWithFormat:@"%@.%@", BUCKET_NAME, AWS_HOST] forHTTPHeaderField:@"Host"];
[request setValue:[self formattedDateString] forHTTPHeaderField:@"Date"];
[request setValue:@"public-read" forHTTPHeaderField:@"x-amz-acl"];
[request setHTTPBody:imageData];
Run Code Online (Sandbox Code Playgroud)
然后这标志着回应(我认为这来自另一个SO回答):
NSString *contentMd5 = [request valueForHTTPHeaderField:@"Content-MD5"];
NSString *contentType = [request valueForHTTPHeaderField:@"Content-Type"];
NSString *timestamp = [request valueForHTTPHeaderField:@"Date"];
if (nil == contentMd5) contentMd5 = @"";
if (nil == contentType) contentType = @"";
NSMutableString *canonicalizedAmzHeaders = [NSMutableString string];
NSArray *sortedHeaders …Run Code Online (Sandbox Code Playgroud) 最近几天我试图从d00m调试网络错误.我开始缺乏想法/线索,我希望其他SO用户拥有可能有用的宝贵经验.我希望能够提供所有相关信息,但我个人无法控制服务器环境.
整个事情始于用户注意到我们的应用程序中的几个"网络错误".该错误似乎是随机发生的,没有任何与互联网连接,iOS版本或后端更新相关的明显模式.幕后发生的两个错误是:
Error Domain=NSURLErrorDomain Code=-1001 "The request timed out."
并且更频繁地:
Error Domain=kCFErrorDomainCFNetwork Code=-1005 "The network connection was lost.
经过几天的调试后,我设法通过触发大约重现这些错误(随机发生).向我们的后端发出10个随机(GET和POST)请求,每个请求之间有一个随机睡眠定时器(设置为1-20秒).但是,它只发生在一些时期.我在过去几天经历的是,当一段"错误时期"开始时,我每运行一次或两次错误就会得到一个错误(意味着错误率为1/10或1/20请求) ).此错误率持续几个小时,然后错误消失了几个小时,然后它全部开始.
关于设置的一些快速事实:
NSURLSession用于我们的网络请求.我们还包含AFNetworking(更新到最新版本),但我们只使用安全部分进行SSL固定.即使SSL钉扎完全关闭,错误仍然会发生.我在过去几天写下的一些调查结果:
keep-alive讨论的错误有关.但是,我们的运营部门已经设置了一个新的临时环境,它发送与生产环境相同的标头,但这并没有使登台环境发生错误.keep-alive我的直觉表明它与服务器环境和iOS中的HTTP实现有关.然而,我无法找到一个可以证明什么的令人信服的模式.我使用简单的Rails脚本进行了相同的设置,当下一个"错误周期"发生时,我将准备尝试在iOS之外重现它.发生这种情况时我会更新问题.
我不是在寻找涉及重置wifi设置,关闭模拟器或类似设备的解决方案,因为我认为这不是生产环境中可行的解决方案.我也考虑过在GitHub问题中提到的重试循环修复,但我认为这是最后的手段.
如果您需要更多信息,请与我们联系.
我现在被困了一段时间,我需要帮助.所以在AFNetworking 2.0中我们AFHTTPRequestOperation可以轻松使用NSOperationQueue并拥有一些依赖关系.因此,只有我们现在拥有的是AFHTTPSessionManager和NSURLSession不继承NSOperation.我有类的APIClient子类AFHTTPSessionManager.我正在使用该类作为单身sharedClient.我已经覆盖了GET和POST,例如GET看起来像这样:
- (NSURLSessionDataTask *)GET:(NSString *)URLString
parameters:(NSDictionary *)parameters
success:(void (^)(NSURLSessionDataTask *task, id responseObject))success
failure:(void (^)(NSURLSessionDataTask *task, NSError *error))failure {
NSURLSessionDataTask *task = [super GET:URLString parameters:parameters success:^(NSURLSessionDataTask *task, id responseObject) {
success(task, responseObject);
} failure:^(NSURLSessionDataTask *task, NSError *error) {
failure(task, [Response createErrorWithAFNetworkingError:error]);
}];
return task;
}
Run Code Online (Sandbox Code Playgroud)
您是否知道如何以这种方式实现(如果可能的话)将其包装为NSOperation?所以我想做什么 - 我希望能够并行运行两个网络呼叫,然后再进行另一个方法调用,这取决于前两个呼叫的第二次网络呼叫.你知道什么是最好的方法吗?
我正在尝试- (NSURLSessionUploadTask *)uploadTaskWithRequest:(NSURLRequest *)request fromFile:(NSURL *)fileURL;
使用多部分表单数据的方法上传视频/图像文件.但不知何故,我无法上传文件,我收到" stream ended unexpectedly"错误.
要求
方法/ API用于实现此目的
NSURLSession后台会话API(下面列出的完整代码)
2.- (NSURLSessionUploadTask *)uploadTaskWithRequest:(NSURLRequest *)request fromFile:(NSURL *)fileURL
面临的挑战/问题
stream ended unexpectedly每次我使用此API进行上传过程时都会出现" "错误需要注意的要点
上传越来越成功的相同的代码,如果我用NSURLConnection的不是NSURLSession.
NSURLSession后台上传进程期望文件location(NSURL)作为参数,不接受NSData.它不允许我们NSData在上传之前将文件转换为,即我们无法将NSData添加到文件体.
需要以下几点的帮助
在正在形成的multipart formdata主体中是否有任何错误(注意 - 相同的代码与NSURLConnection一起使用)
我的方法在哪里出错?
我们是否需要在服务器级别进行任何更改以支持NSURLSession backgroundSession上传?(在数据解析或其他什么?)
以下是用于上载文件的代码
NSString*BoundaryConstant = @"---------- V2ymHFg03ehbqgZCaKO6jy";
// string constant for the post parameter 'file'. My server uses this name: `file`. Your's may differ
NSString* FileParamConstant = @"file"; …Run Code Online (Sandbox Code Playgroud) file-upload multipartform-data nsurlsession nsurlsessionconfiguration nsurlsessionuploadtask
nsurlsession ×10
ios ×9
objective-c ×3
afnetworking ×2
ios7 ×2
networking ×2
amazon-s3 ×1
cocoa-touch ×1
file-upload ×1
ios8 ×1
iphone ×1
nscache ×1
ssl ×1
tls1.2 ×1
uiimage ×1