标签: nsurlsessionconfiguration

使用Alamofire进行NSURLSession并发请求

我的测试应用程序遇到了一些奇怪的行为.我发送到同一台服务器的同时有大约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

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

如何使用NSURLSession和NSURLCache进行缓存.不工作

我有一个测试应用程序设置,即使用户在下载过程中切换应用程序,它也能成功从网络下载内容.太好了,现在我有后台下载了.现在我想添加缓存.没有必要让我多次下载图像,b/c系统设计,给定一个图像URL我可以告诉你该URL后面的内容永远不会改变.所以,现在我想使用Apple内置的内存/磁盘缓存来缓存下载的结果,我已经阅读了很多(而不是我在NSCachesDirectory中手动保存文件,然后在创建之前检查文件)请求,ick).在尝试得到缓存在此工作的代码顶部的工作,我添加以下代码:

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
    // Override point for customization after application launch.

    // Set app-wide shared cache (first number is megabyte value)
    [NSURLCache setSharedURLCache:[[NSURLCache alloc] initWithMemoryCapacity:60 * 1024 * 1024
                                                                diskCapacity:200 * 1024 * 1024
                                                                    diskPath:nil]];

    return YES;
}
Run Code Online (Sandbox Code Playgroud)

当我创建会话时,我添加了两行NEW(URLCache和requestCachePolicy).

// Helper method to get a single session object
- (NSURLSession *)backgroundSession
{
    static NSURLSession *session = nil;
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
        NSURLSessionConfiguration *configuration = [NSURLSessionConfiguration backgroundSessionConfiguration:@"com.example.apple-samplecode.SimpleBackgroundTransfer.BackgroundSession"];
        configuration.URLCache = [NSURLCache sharedURLCache]; // NEW LINE …
Run Code Online (Sandbox Code Playgroud)

iphone nsurlcache ios nsurlsession nsurlsessionconfiguration

26
推荐指数
2
解决办法
3万
查看次数

使用NSURLSessionDataTask显示文件下载进度

我想显示特定文件的文件下载进度(接收了多少字节).它适用于NSURLSessionDownloadTask.我的问题是我想用NSURLSessionDataTask实现相同的功能.

这是将文件接收到NSData并写入文档文件夹的代码:

NSURLSessionConfiguration *defaultConfigObject = [NSURLSessionConfiguration defaultSessionConfiguration];

NSURLSession *defaultSession = [NSURLSession sessionWithConfiguration: defaultConfigObject delegate: self delegateQueue: [NSOperationQueue mainQueue]];

NSURLSessionDataTask * dataTask = [defaultSession dataTaskWithURL:theRessourcesURL
    completionHandler:^(NSData *data, NSURLResponse *response, NSError *error)
{ 
       if(error == nil)
       {

            NSString *docsDir = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) objectAtIndex:0];

               NSString *pathToDownloadTo = [NSString stringWithFormat:@"%@/%@", docsDir, Name];

               NSLog(@"SIZE : %@",[NSByteCountFormatter stringFromByteCount:data.length countStyle:NSByteCountFormatterCountStyleFile]);

               [data writeToFile:pathToDownloadTo options:NSDataWritingAtomic error:&error];
       }
}];

[dataTask resume];
Run Code Online (Sandbox Code Playgroud)

我在写入或完成数据任务后收到文件大小(在收到文件后):

NSLog(@"SIZE : %@",[NSByteCountFormatter stringFromByteCount:data.length countStyle:NSByteCountFormatterCountStyleFile]);

但是我想显示它当前的字节接收状态,NSURLSessionDataTask可以实现吗?

ios nsurlsession nsurlsessionconfiguration nsurlsessiondownloadtask

25
推荐指数
4
解决办法
2万
查看次数

使用后台配置时,NSURLSessionTask在超时后永远不会回调

我正在使用NSURLSessionDownloadTask后台会话来实现我的所有REST请求.这样我可以使用相同的代码,而不必考虑我的应用程序在后台或前台.

我的后端已经死了一段时间了,我借此机会测试了NSURLSession超时的行为方式.

令我惊讶的是,我的NSURLSessionTaskDelegate回调都没有被调用过.无论我在上面NSURLRequest或上面设置什么超时NSURLSessionConfiguration,我都没有从iOS收到任何回调,告诉我请求确实以超时完成.

也就是说,当我开始NSURLSessionDownloadTask一个后台会话时.应用程序在后台或前台发生相同的行为.

示例代码:

- (void)launchDownloadTaskOnBackgroundSession {
    NSString *sessionIdentifier = @"com.mydomain.myapp.mySessionIdentifier";
    NSURLSessionConfiguration *backgroundSessionConfiguration = [NSURLSessionConfiguration backgroundSessionConfiguration:sessionIdentifier];
    backgroundSessionConfiguration.requestCachePolicy = NSURLRequestReloadIgnoringCacheData;
    backgroundSessionConfiguration.timeoutIntervalForRequest = 40;
    backgroundSessionConfiguration.timeoutIntervalForResource = 65;
    NSURLSession *backgroundSession = [NSURLSession sessionWithConfiguration:backgroundSessionConfiguration delegate:self delegateQueue:[NSOperationQueue mainQueue]];

    NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:[NSURL URLWithString:@"http://www.timeout.com/"]];
    request.timeoutInterval = 30;
    NSURLSessionDownloadTask *task = [backgroundSession downloadTaskWithRequest:request];
    [task resume];
}

- (void)URLSession:(NSURLSession *)session task:(NSURLSessionTask *)task didCompleteWithError:(NSError *)error {
    NSLog(@"URLSession:task:didCompleteWithError: id=%d, error=%@", task.taskIdentifier, error);
}
Run Code Online (Sandbox Code Playgroud)

但是,当我使用默认会话时,我会在30秒后收到错误回调(我在请求级别设置的超时).

示例代码:

- …
Run Code Online (Sandbox Code Playgroud)

ios nsurlsession nsurlsessionconfiguration nsurlsessiondownloadtask ios7.1

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

防止NSURLSession缓存响应

为什么它会缓存响应.它返回先前获取的响应.它甚至可以在关闭网络连接时工作.重置iOS模拟器似乎也不起作用.提出请求,然后再次使用Internet脱机工作(缓存).

public let urlSession: NSURLSession

public init()
{
    // ...

    var configuration = NSURLSessionConfiguration.defaultSessionConfiguration()
    configuration.requestCachePolicy = NSURLRequestCachePolicy.ReloadIgnoringLocalCacheData
    urlSession = NSURLSession(configuration: configuration)
}

func makeRequest(path: String, httpMethod:String, body:String?, baseUrl: String?, headers:[String:String]=[:], callback: JsonRequestCallback)
{
    let urlString = (baseUrl ?? customOAuth2Manager.API_URL) + path
    let url = NSURL(string: urlString)
    let request = oauthInstance.request(forURL: url!)

    request.HTTPMethod = httpMethod
    self.customOAuth2Manager.setupRequest(request)

    for (key, value) in headers {
        request.setValue(value, forHTTPHeaderField:key)
    }

    if let body = body where body != "" {
        let postData = (body as NSString).dataUsingEncoding(NSUTF8StringEncoding) …
Run Code Online (Sandbox Code Playgroud)

caching nsurlcache nsurlsession nsurlsessionconfiguration swift

20
推荐指数
2
解决办法
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
查看次数

如何以编程方式将代理添加到NSURLSession

展望了本文档NSURLSessionNSURLSessionConfiguration,我的印象是我应该像下面这样的字典进行配置下:

    // Create a dictionary to describe the proxy 
    NSDictionary *proxyDict = @{
        (NSString *)kCFProxyHostNameKey   : @"myProxyHost.com",
        (NSString *)kCFProxyPortNumberKey : @"12345",
        (NSString *)kCFProxyTypeKey       : (NSString*)kCFProxyTypeHTTP
    };

    // Create a configuration that uses the dictionary
    NSURLSessionConfiguration *configuration = [NSURLSessionConfiguration defaultSessionConfiguration];
    [configuration setConnectionProxyDictionary:proxyDict];
Run Code Online (Sandbox Code Playgroud)

但是,NSURLSession使用此配置创建的请求将直接连接.

proxy ios nsurlsession nsurlsessionconfiguration

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

如何使用afnetworking在后台上传任务

我正在尝试使用AFNetworking上传大文件,并在应用程序处于后台时继续上传.

我可以正常上传文件,但是当我尝试使用后台配置时 - 应用程序崩溃时出现以下堆栈跟踪:异常:EXC_BAD_ACCESS(代码= 1,地址= 0x8000001f))

_CFStreamSetDispatchQueue
-[__NSCFBackgroundDataTask captureStream:]
__70-[__NSCFBackgroundDataTask _onqueue_needNewBodyStream:withCompletion:]_block_invoke_2
_dispatch_call_block_and_release
_dispatch_queue_drain
_dispatch_queue_invoke
_dispatch_root_queue_drain
_dispatch_worker_thread3
_pthread_wqthread
Run Code Online (Sandbox Code Playgroud)

这是一些示例代码:

注意:当我使用[NSURLSessionConfiguration defaultSessionConfiguration]上传成功但在应用程序在后台时不会继续.[NSURLSessionConfiguration backgroundSessionConfigurationWithIdentifier:@"com.company.appname.uploadservice"]导致应用程序崩溃.

NSMutableURLRequest *request = [[AFHTTPRequestSerializer serializer] multipartFormRequestWithMethod:@"POST" URLString:[uploadBundle.uploadUrl absoluteString] parameters:[uploadBundle getParameters] constructingBodyWithBlock:^(id<AFMultipartFormData> formData) {
    [formData appendPartWithFileURL:uploadBundle.fileDataUrl name:uploadBundle.fileName fileName:uploadBundle.fileName mimeType:uploadBundle.mimeType error:nil];
} error:nil];

Authentication *authentication = [Authentication getInstance];
[request addValue:authentication.token forHTTPHeaderField:@"token"];
[request addValue:authentication.authorization forHTTPHeaderField:@"Authorization"];

//NSURLSessionConfiguration *configuration = [NSURLSessionConfiguration defaultSessionConfiguration];
NSURLSessionConfiguration *configuration = [NSURLSessionConfiguration backgroundSessionConfigurationWithIdentifier:@"com.company.appname.uploadservice"];
AFURLSessionManager *manager = [[AFURLSessionManager alloc] initWithSessionConfiguration:configuration];

NSProgress *progress = nil;
_currentUploadTask = [manager …
Run Code Online (Sandbox Code Playgroud)

iphone file-upload ios afnetworking-2 nsurlsessionconfiguration

9
推荐指数
1
解决办法
3873
查看次数

使用后台配置时,NSURLSessionDownloadTask会继续重试

我遇到了一个问题,那就是后端速度慢,后台配置下载数据.

NSURLSessionConfiguration *sessionConfig = [NSURLSessionConfiguration backgroundSessionConfiguration:identifier];
_backgroundSession = [NSURLSession sessionWithConfiguration:sessionConfig delegate:self delegateQueue:nil];
NSURLSessionDownloadTask *downloadTask = [_backgroundSession downloadTaskWithURL:URL];
[downloadTask resume];
Run Code Online (Sandbox Code Playgroud)

如果连接已建立,但发送回数据需要超过60秒,则会发生超时.那样就好.然而,我遇到的行为是我没有得到错误.会话只发出一个新请求."再次给我数据".我不知道发生了什么.不在我的代码中,也没有调用我知道的委托方法.我只能访问服务器日志.它需要服务器大约68秒才能发回数据,但应用程序只是忽略它,因为它正在等待新请求.

一种解决方案是增加超时值.但我不喜欢它,它只适用于iOS 7.不是iOS 8.

sessionConfig.timeoutIntervalForRequest = 10 * 60.0;
Run Code Online (Sandbox Code Playgroud)

有没有人对此有任何见解?我在stackoverflow上找到了关于后台会话超时问题的链接.这是10个月大,但没有解决方案,只有人同意.

timeout background objective-c nsurlsession nsurlsessionconfiguration

7
推荐指数
3
解决办法
5645
查看次数

NSURLSession后台传输无法正常工作

我正在尝试从服务器下载一系列文件到iOS应用程序,目的是即使应用程序处于后台模式也会发生这些文件的下载.

我正在使用NSURLSession及其一系列API 提供的后台传输.

当应用程序在前台模式下运行时,我启动了下载任务,它给了我预期的结果,因为一系列的下载工作正常,但如果我在下载系列正在进行时按下主页按钮,那么它会立即停止,当我进入应用程序时再次下载将恢复.

如果用简单的话说出来,背景转移甚至不能让我工作.

编辑

最初我在模拟器中对它进行了测试它不能很好地工作,有人评论说在真实设备中测试相同,所以我通过在调试模式下连接真实设备进行测试它确实运行良好我觉得一切都解决但又给了我震惊,如果我从Xcode断开设备并检查应用程序,它根本不起作用:(

我创建了一个示例应用程序来演示此问题,请从此处下载

注意:在此示例应用程序中,我重新启动了didFinishDownloadingToURL中的下载调用以模拟一系列下载文件

你能帮助我解决这个问题吗?

ios nsurlsession nsurlsessionconfiguration nsurlsessiondownloadtask nsurlsessionuploadtask

7
推荐指数
1
解决办法
553
查看次数