标签: nsurlsession

使用NSURLSession设置cookie

嗨,我正在开发一个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)

session-cookies ios nsurlsession

16
推荐指数
1
解决办法
2万
查看次数

NSURLSession线程:跟踪多个后台下载

所以我在主线程上创建我的下载

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)

multithreading objective-c ios ios7 nsurlsession

15
推荐指数
1
解决办法
2万
查看次数

在运行AFHTTPSessionManager的AFNetworking 2中设置对并发任务的限制

所以我知道在旧的AFNetworking中使用AFHTTPClient是可能的,我知道如果我使用AFHTTPRequestOperationManager我可以设置队列的限制,但我不能让AFHTTPSessionManager一次只运行x个请求而不是我自己实现它使用成功块(我不想).

以下代码不限制我的连接:

AFHTTPSessionManager*manager = [AFHTTPSessionManager manager]; manager.operationQueue.maxConcurrentOperationCount = 1;

根据这里有趣的讨论,我向服务器提出了很多请求,并且在我获得超时之前将其阻塞,因此我确实需要限制并发连接.

我错过了什么?

network-programming ios afnetworking afnetworking-2 nsurlsession

15
推荐指数
1
解决办法
6331
查看次数

如何在NSURLSession中查找和取消任务?

我正在使用一个NSURLSession对象在我的应用程序中加载图像.这可能是同时加载几个图像.

在某些时刻,我需要取消加载一个特定图像并继续加载其他图像.

你能建议正确的方法吗?

networking objective-c ios nsurlsession

15
推荐指数
5
解决办法
3万
查看次数

iOS - 本地保存图像的最佳实践 - NSCache vs保存在文档目录中

我正在开发一个类似于Instagram Feed的应用程序(包含图像和一些标签的单元格的表格视图).

对于我从数据库中获取的所有数据,我正在使用数据任务(因为接收它们并不需要太多),但是对于图像(我们使用数据请求获取它们的URL),我需要保存在本地以备将来使用(改善用户体验).

我的逻辑如下:保存在NSCache或文档目录中,文件夹中的图像带有下载日期(创建一次并附加所有其他图像,如果需要)(我正在删除不是来自最近的7个文件夹)几天,然后对于TableView,只是从那里加载,所以tableview将平滑滚动,不会直接从其委托方法加载网址.那么根据我的需求,NSCache或文档目录,哪里有更好的存储位置.

期待听到您的建议,谢谢!

uiimage ios nscache nsurlsession

15
推荐指数
1
解决办法
9396
查看次数

Domain = NSURLErrorDomain代码1202

嗨,我收到以下错误:

错误域= 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"的服务器,这可能会使您的机密信息面临风险.}

我阅读了所有相关文档,我们应用了"常见故障"部分中的所有要求.

更多细节:

  • 仅从德国收到的错误(过去2W中来自意大利的4次除外)
  • 它在室内不可再现
  • 最终经过大量的重试后,上传将被抛出
  • 这是在iOS 10.xx和9.xx中获得的展位
  • 我使用2016-08 SSL安全策略的亚马逊服务器,所以根据苹果它应该没问题

在我使用的应用程序中:

<key>NSAppTransportSecurity</key>
   <dict>
      <key>NSAllowsArbitraryLoads</key>
   <true/>
</dict>
Run Code Online (Sandbox Code Playgroud)

注意 - 在生产中我总是使用HTTP,我留下NSAllowsArbitraryLoads,因为一些离岸测试人员可以将路由切换到HTTP进行调试.

ssl amazon-web-services ios nsurlsession tls1.2

15
推荐指数
1
解决办法
1万
查看次数

NSURLSession和亚马逊S3上传

我有一个应用程序,目前正在上传图像到亚马逊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)

iphone cocoa-touch amazon-s3 ios nsurlsession

14
推荐指数
3
解决办法
9565
查看次数

随机和偶然的网络错误(NSURLErrorDomain代码= -1001和NSURLErrorDomain代码= -1005)

最近几天我试图从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请求) ).此错误率持续几个小时,然后错误消失了几个小时,然后它全部开始.

关于设置的一些快速事实:

  • 发生在设备和模拟器上
  • 在iOS 8.4和iOS 7.1上发生 - 尽管v.8.4是我用于测试的主要版本.
  • 我们NSURLSession用于我们的网络请求.我们还包含AFNetworking(更新到最新版本),但我们只使用安全部分进行SSL固定.即使SSL钉扎完全关闭,错误仍然会发生.

我在过去几天写下的一些调查结果:

  • 它似乎只发生在我们的生产环境中,它们具有与我们的临时环境不同的配置.这让我认为它可能与此处此处keep-alive讨论的错误有关.但是,我们的运营部门已经设置了一个新的临时环境,它发送与生产环境相同的标头,但这并没有使登台环境发生错误.keep-alive
  • 我们的Android版应用无法使用相同的请求设置重现错误.此外,我们在Android应用中未收到有关"网络错误"的客户问题.

我的直觉表明它与服务器环境和iOS中的HTTP实现有关.然而,我无法找到一个可以证明什么的令人信服的模式.我使用简单的Rails脚本进行了相同的设置,当下一个"错误周期"发生时,我将准备尝试在iOS之外重现它.发生这种情况时我会更新问题.

我不是在寻找涉及重置wifi设置,关闭模拟器或类似设备的解决方案,因为我认为这不是生产环境中可行的解决方案.我也考虑过在GitHub问题中提到的重试循环修复,但我认为这是最后的手段.

如果您需要更多信息,请与我们联系.

networking ios ios7 nsurlsession ios8

14
推荐指数
1
解决办法
794
查看次数

使用NSOperation AFNetworking 3.0 AFHTTPSessionManager

我现在被困了一段时间,我需要帮助.所以在AFNetworking 2.0中我们AFHTTPRequestOperation可以轻松使用NSOperationQueue并拥有一些依赖关系.因此,只有我们现在拥有的是AFHTTPSessionManagerNSURLSession不继承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?所以我想做什么 - 我希望能够并行运行两个网络呼叫,然后再进行另一个方法调用,这取决于前两个呼叫的第二次网络呼叫.你知道什么是最好的方法吗?

objective-c ios afnetworking nsurlsession

14
推荐指数
1
解决办法
1万
查看次数

无法使用iOS中的NSURLSession多部分表单数据上传文件

我正在尝试- (NSURLSessionUploadTask *)uploadTaskWithRequest:(NSURLRequest *)request fromFile:(NSURL *)fileURL; 使用多部分表单数据的方法上传视频/图像文件.但不知何故,我无法上传文件,我收到" stream ended unexpectedly"错误.

要求

  1. 将视频/图像文件上传到服务器
  2. 应用程序应支持后台上传(即使在应用程序进入后台后仍继续上传过程)
  3. 服务器期望使用多部分表单数据发送数据.

方法/ API用于实现此目的

  1. NSURLSession后台会话API(下面列出的完整代码)

    2.- (NSURLSessionUploadTask *)uploadTaskWithRequest:(NSURLRequest *)request fromFile:(NSURL *)fileURL

面临的挑战/问题

  1. stream ended unexpectedly每次我使用此API进行上传过程时都会出现" "错误

需要注意的要点

  1. 上传越来越成功的相同的代码,如果我用NSURLConnection的不是NSURLSession.

  2. NSURLSession后台上传进程期望文件location(NSURL)作为参数,不接受NSData.它不允许我们NSData在上传之前将文件转换为,即我们无法将NSData添加到文件体.

需要以下几点的帮助

  1. 在正在形成的multipart formdata主体中是否有任何错误(注意 - 相同的代码与NSURLConnection一起使用)

  2. 我的方法在哪里出错?

  3. 我们是否需要在服务器级别进行任何更改以支持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

14
推荐指数
2
解决办法
6478
查看次数