链接后台 NSURLSession 上传

2024-03-20

有人成功链接 NSURLSession 后台上传吗?

我正在尝试使用 NSURLSession 的后台上传来上传 5 MB 的巨大视频文件。上传必须按顺序进行。整个事情在前台工作得很好。我为此使用 AFNetwoking,它是多部分上传。但是,当应用程序处于后台时,第一个项目上传正常,并在后台启动第二个项目(在 AFURLSessionManager 的 setDidFinishEventsForBackgroundURLSessionBlock 中)。但它突然停止(我最好的猜测是 30 秒内,因为在后台唤醒的应用程序的最大生命周期为 30 秒),然后什么也没有发生。我预计第二个会话将在后台完成并调用第三个会话等 - 连锁行为,但这似乎不起作用。

我尝试使用 HTTPMaximumConnectionsPerHost = 1 将所有文件部分一次性添加到单个 NSURLSession - 这工作正常并分部分上传完整文件。但文件部分是按随机顺序选取的,即上传第 1 部分,然后上传第 5 部分、第 3 部分、第 10 部分等……。我尝试将其添加到 NSOperationQueue 中,并在操作之间具有依赖关系,这似乎弄乱了整个事情 - 上传根本不起作用。

我知道视频文件可以在后台作为单个文件上传,但服务器期望该文件大小为 5 MB。因此,我想我唯一的选择是链接上传,或者将所有部分添加到 NSURLSession 中,但确保它们始终按照添加顺序上传。

任何帮助,将不胜感激。

My code:

 - (void)viewDidLoad {

    [super viewDidLoad];
    // Do any additional setup after loading the view, typically from a nib.
    NSURLSessionConfiguration *config = [NSURLSessionConfiguration backgroundSessionConfigurationWithIdentifier:[NSString stringWithFormat:@"%d", rand()]];
    AFURLSessionManager *manager = [[AFURLSessionManager alloc] initWithSessionConfiguration:config];
    config.HTTPMaximumConnectionsPerHost = 1;
    [manager setDidFinishEventsForBackgroundURLSessionBlock:^(NSURLSession *session) {

        dispatch_async(dispatch_get_main_queue(), ^{
            // Call the completion handler to tell the system that there are no other background transfers.
            //                completionHandler();
            [self upload];
        });
    }];
}

- (IBAction)start:(id)sender {

    [self upload];
}

-(void) upload {

    NSString *filePath = [[NSBundle mainBundle] pathForResource:@"Sample" ofType:@"mp4"];
    AFHTTPRequestSerializer *serializer = [AFHTTPRequestSerializer serializer];

    NSDictionary *parameters = [NSDictionary dictionaryWithObjectsAndKeys:@"234", @"u", @"Sample.mp4", @"f",nil];
    NSMutableURLRequest *request = [serializer multipartFormRequestWithMethod:@"POST" URLString:urlString parameters:parameters constructingBodyWithBlock:^(id<AFMultipartFormData> formData) {
        [formData appendPartWithFileURL:[NSURL fileURLWithPath:filePath] name:@"data" fileName:@"Sample.mp4" mimeType:@"video/mp4" error:nil];
    } error:nil];


    __block NSString *tempMultipartFile = [NSTemporaryDirectory() stringByAppendingPathComponent:@"Test"];
    tempMultipartFile = [tempMultipartFile stringByAppendingString:[NSString stringWithFormat:@"%d", rand()]];
    NSURL *filePathtemp = [NSURL fileURLWithPath:tempMultipartFile];
    __block NSProgress *progress = nil;
    [serializer requestWithMultipartFormRequest:request writingStreamContentsToFile:filePathtemp completionHandler:^(NSError *error) {
        NSURLSessionUploadTask *uploadTask = [manager uploadTaskWithRequest:request fromFile:filePathtemp progress:&progress completionHandler:^(NSURLResponse *response, id responseObject, NSError *error) {

            NSLog(@"Request--> %@.\n Response --> %@ \n%@",  request.URL.absoluteString ,responseObject, error? [NSString stringWithFormat:@" with error: %@", [error localizedDescription]] : @""); //Lets us know the result including failures
            [[NSFileManager defaultManager] removeItemAtPath:tempMultipartFile error:nil];

        }];
        [uploadTask resume];
        [manager setTaskDidSendBodyDataBlock:^(NSURLSession *session, NSURLSessionTask *task, int64_t bytesSent, int64_t totalBytesSent, int64_t totalBytesExpectedToSend) {

            NSLog(@"uploading");
        }];
    }];
}

好吧,最后我向 Apple 寻求关于链接后台上传的澄清 - 这在 iOS 中是不可能的。NSURLSession 有一个恢复速率限制器,可以防止应用程序在后台执行链接任务,如中所述https://forums.developer.apple.com/thread/14854 https://forums.developer.apple.com/thread/14854。相反,苹果建议批量传输或其他选项,例如https://forums.developer.apple.com/thread/14853 https://forums.developer.apple.com/thread/14853。我问的另一件事是对上传队列中的多个任务进行排序 - 即强制 NSURLSession 按照添加任务的顺序上传任务。正如所指出的dgatwood https://stackoverflow.com/users/1564391/dgatwood,使用 NSOperationQueue 是不可能的,Apple 也提到了同样的事情。正如所提到的eskimo https://forums.developer.apple.com/people/eskimo在回复邮件中“NSURLSession 不保证按顺序运行您的请求,并且没有办法强制执行。”所以我对原来的问题几乎没有什么选择。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

链接后台 NSURLSession 上传 的相关文章

随机推荐

  • 如何在iPhone中获取DNS服务器IP

    我尝试通过以下方式获取 etc resolv conf 打开 etc resolv conf 0644 但它返回 1并且errno是2这意味着 没有这样的文件 我能做些什么 您无法访问应用程序沙箱之外的文件
  • 反应本机错误 RCTJSONStringify() 遇到以下错误:JSON 写入中的类型无效 (NSURL)

    我正在尝试使用反应本机fbsdk在我的反应本机应用程序中 直到昨天为止都运行良好 但是 今天它给出了一个奇怪的错误RCTJSONStringify 遇到以下错误 JSON 写入 NSURL 中的类型无效 RN v0 42 0 这是我的代码
  • 从 dll 内的函数返回时堆损坏

    我有一个具有如下原型的函数 void function std string str 这个函数在另一个加载和使用该 dll 的程序的主函数中被调用 function some string value here 从该函数返回时 我收到堆损坏
  • 使用 Nokogiri 解析大型 HTML 文件

    我正在尝试解析与 Nokogiri 但不幸的是我无法从页面获取所有项目 我的简单测试代码是 require open uri require nokogiri html Nokogiri HTML open http www pro med
  • bash 中的视频方向检测

    我需要检测视频是以纵向还是横向模式录制的 然后以脚本方式将其转换为正确的方向 if v orient landscape then ffmpeg i file mp4 vf transpose 1 file ogv else ffmpeg
  • ABAP中调用方法的不同方式

    抱歉这个基本的 ABAP 问题 ABAP中调用方法有哪些不同的方式 他们的 官方 名字是什么 我听说过执行 方法调用和内部 内联方法调用 执行使用PERFORM关键字和方法调用CALL METHOD语法 我猜 但什么是 内部 或 内联方法调
  • 如何使用 std::cin 读取 bool

    我是 C 新手 我想知道函数 cin 在布尔数据的情况下如何工作 比方说 bool a cin gt gt a 我知道如果我给出 0 或 1 我的数据 a 将是 true 或 false 但是如果我给出另一个整数甚至一个字符串会发生什么 我
  • 允许所有用户进行临时分发查询

    我正在使用 AD Hoc 分布式查询将数据从 MS SQL Server 2008 传输到 MS Access 该过程使用单个 SQL 语句启动 INSERT INTO OpenDataSource Microsoft Jet OLEDB
  • Arrays.stream(array_name).sum() 比迭代方法慢吗?

    我正在编写一个 leetcode 问题 https oj leetcode com problems gas station https oj leetcode com problems gas station 使用Java 8 我的解决方
  • 是否可以将Spring Data JPA中的@Lock和@Modifying @Query与Hibernate结合起来?

    我有一个 Lock注解与 Modifying Query一起使用时出现问题和查询本身执行更新语句 我的测试设置如下所示 Spring Boot 启动器 1 5 3 RELEASE 休眠 5 2 10 Final Spring Data JP
  • Git 将存储库镜像到特定分支

    我们公司尝试将一个github项目fork到我们自己的git服务器上 然后我们可以在上面添加我们自己的功能 我们只想签出一个特定的分支 并将所有分支和标签保留到该分支 然后复制 镜像 到我们的 git 服务器 在您的服务器上创建存储库 在其
  • Pandas:迭代 DataFrame 列表并将每个数据框导出到 Excel 工作表

    尝试自学编码以自动化工作中一些繁琐的任务 对于任何无意的无知 我深表歉意 我在 pandas python 3 x 中创建了数据框 我想将每个数据框打印到不同的 Excel 工作表中 这是我的 2 个数据帧 它工作完美 但我想缩放它以循环遍
  • 使用新的 YouTube API v3 解析 YouTube 订阅者计数

    我想使用新的 API v3 从我的 YouTube 频道获取订阅者数量 我在这里为 youtube 创建了一个 Google API 应用程序 谷歌 API 控制台 https code google com apis console 我有
  • 为什么“df.lookup”比“df.min”慢?

    我想通过使用来减少一些时间lookup after idxmin 而不是调用min and idxmin 在我看来 第一个应该更有效 因为在第二个中需要搜索两次值 一次搜索最小值 另一次搜索最小值的索引 即 2 倍 O NxM 而在首先 搜
  • VSCode:添加新的活动栏条目和自定义“页面”

    我想在开发扩展时添加新的活动栏条目并创建自定义 页面 这可能吗 我的想法是在 VSCode 中创建一个像 Sequel Pro 一样的数据库管理器 v 1 23 添加了扩展作者向活动栏添加图标的功能 自定义活动栏视图 https code
  • 如何获取多字节字符串的字节大小

    如何在 Visual C 中获取多字节字符串的字节大小 有没有函数或者我必须自己计算字符 或者 更一般地说 如何获得 TCHAR 字符串的正确字节大小 解决方案 tcslen T TCHAR string sizeof TCHAR EDIT
  • 这个吐司是从哪里来的?

    由于某种原因 我正在开发的应用程序正在显示一个 toast 显示我的设备上剩余的内部存储空间 即使我没有对此进行编码 这是一个屏幕截图 https i stack imgur com z2ERU png https i stack imgu
  • Python 2.7 的蓝牙? [关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 对 Python 2 7 进行蓝牙编程的最佳方法是什么 我尝试使用pybluez https code
  • 使用预定脚本部署 Shiny App

    我有一个简单的脚本 可以在 Rstudio 中用于部署应用程序 rsconnect setAccountInfo name xx token xx secret xx xx library rsconnect deployApp xxx l
  • 链接后台 NSURLSession 上传

    有人成功链接 NSURLSession 后台上传吗 我正在尝试使用 NSURLSession 的后台上传来上传 5 MB 的巨大视频文件 上传必须按顺序进行 整个事情在前台工作得很好 我为此使用 AFNetwoking 它是多部分上传 但是