1

所以我正在尝试发送一个大的视频文件(超过 100 mb),每当我使用 访问视频文件时dataWithContentsOfURL,扩展都会终止。这适用于较小的文件。

我应该如何解决它?

if ([itemProvider hasItemConformingToTypeIdentifier:(NSString *)kUTTypeMovie]){
            [itemProvider loadItemForTypeIdentifier:(NSString *)kUTTypeMovie options:nil completionHandler:urlHandler];
}




NSItemProviderCompletionHandler urlHandler = ^(NSURL *item, NSError *error) {

  if ([itemProvider hasItemConformingToTypeIdentifier:(NSString *)kUTTypeVideo] | [itemProvider hasItemConformingToTypeIdentifier:(NSString *)kUTTypeMovie])
  {
        NSData *fileData = [NSData dataWithContentsOfURL:item]

        // ----> fileData WORKS for small files.
        // ----> for large files, extension QUITS - without any trace - and control does not proceed after this. This may be due to memory pressure?  

        [_shareExtensionActionsManager sendTextMessage:contentText attachmentData:fileData attachmentName:@"video-1" toChatEntity:_selectedItem completion:^(BOOL success) 
               {
                 [self.extensionContext completeRequestReturningItems:nil completionHandler:^(BOOL expired) {
    exit(0);
}];
         }];  
   } 
};
4

2 回答 2

2

应用程序扩展文档

用户在您的应用程序扩展中完成任务后往往会立即返回主机应用程序。如果任务涉及可能很长的上传或下载,您需要确保它可以在您的扩展程序终止后完成。

在您的应用扩展调用 completeRequestReturningItems:completionHandler: 以告知宿主应用其请求已完成后,系统可以随时终止您的扩展。

您将需要使用 NSURLSession 创建一个启动后台任务的 URL 会话。

如果后台任务完成时您的扩展程序没有运行,系统将在后台启动您的包含应用程序并调用application:handleEventsForBackgroundURLSession:completionHandler:您的 AppDelegate。

您还需要设置一个共享容器,您的扩展程序和包含的应用程序都可以访问该容器。为此,您需要使用 NSURLSessionConfiguration 的sharedContainerIdentifier属性来指定容器的标识符,以便以后可以访问它。

以下是文档中的示例,展示了如何实现此目的:

NSURLSession *mySession = [self configureMySession];
   NSURL *url = [NSURL URLWithString:@"http://www.example.com/LargeFile.zip"];
   NSURLSessionTask *myTask = [mySession downloadTaskWithURL:url];
   [myTask resume];

- (NSURLSession *) configureMySession {
    if (!mySession) {
        NSURLSessionConfiguration* config = [NSURLSessionConfiguration backgroundSessionConfigurationWithIdentifier:@“com.mycompany.myapp.backgroundsession”];
// To access the shared container you set up, use the sharedContainerIdentifier property on your configuration object.
config.sharedContainerIdentifier = @“com.mycompany.myappgroupidentifier”;
        mySession = [NSURLSession sessionWithConfiguration:config delegate:self delegateQueue:nil];
    }
    return mySession;
}

这是一个相关资源,可能会有所帮助。

于 2018-03-30T00:43:58.617 回答
-1

应用程序扩展可能没有此任务的内存容量。

运行应用程序扩展的内存限制明显低于前台应用程序的内存限制。在这两个平台上,系统可能会主动终止扩展,因为用户希望在宿主应用程序中返回他们的主要目标。某些扩展的内存限制可能比其他扩展低:例如,小部件必须特别高效,因为用户可能同时打开多个小部件。

https://developer.apple.com/library/content/documentation/General/Conceptual/ExtensibilityPG/ExtensionCreation.html#//apple_ref/doc/uid/TP40014214-CH5-SW1

于 2018-03-29T20:32:04.447 回答