2016-08-26 6 views
0

Я создал расширение для моего приложения ios. Когда я нажимаю на параметр share в приложении для фотографий, отображается мое расширение для общего доступа, и я нажимаю на него, и мой контроллер отображается. Все работает хорошо. Я загружаю видео на youtube с помощью apt youtube. Я использую этот метод, чтобы создать параметрконвертирование видео в NSData в расширение общего доступа в ios

GTLUploadParameters *uploadParameters = [GTLUploadParameters uploadParametersWithData:fileData MIMEType:@"video/*"]; 

Теперь, если видео мало, то она легко превращаются в NSData используя этот код

NSData *fileData = [NSData dataWithContentsOfURL:[NSURL URLWithString:videoURL]]; 

и все работает и видео загружается.

Но если видео большое, то оно просто сбой и выход из расширения общего доступа (я поставил точку останова и нашел эту проблему. Если я удалю преобразование fileData, то это не сбой.). Так что я сделал, вместо того, чтобы преобразовать его в NSData Я использовал этот метод апи юность

GTLUploadParameters *uploadParameters = [GTLUploadParameters uploadParametersWithFileURL:[NSURL URLWithString:videoURL] MIMEType:@"video/*"]; 

Теперь приложение не врезаться, но я получаю сообщение об ошибке сети. Ошибка

Ошибка домена = NSURLErrorDomain Code = -995 "(нуль)"

мало поиска найдено, что это из-за NSURLSession и сказал, чтобы использовать что-то вроде этого

sessionConfiguration.sharedContainerIdentifier = @“com.me.myapp.containerIdentifier”; 

Я использую youtube api. Я не уверен, где его использовать ИЛИ есть ли другой способ использования youtube api в расширении share с большим видеофайлом.

ПРИМЕЧАНИЕ: Я использую youtube api в своем приложении и его рабочий режим с NSData.

Надежность вопрос ясный. Я застрял на нем целый день. Пожалуйста помоги.

Заранее спасибо.

EDIT 1:

Я использовал этот код

NSData *fileData = [NSData dataWithContentsOfURL:[NSURL fileURLWithPath:videoURL] options:0 error:&error]; 

FileData равна нулю. Ошибка я получаю

Ошибки домена = NSCocoaErrorDomain Code = 260 «Файл„IMG_2187.MOV“ не может быть открыт, потому что нет такого файла.» UserInfo = {NSFilePath =/файл: /var/mobile/Media/DCIM/102APPLE/IMG_2187.MOV,

+0

«NSURLErrorBackgroundSessionRequiresSharedContainer» (что является ошибкой '-995') заставляет меня подозревать, что фоновое обслуживание не нравится, как ссылка на что-то вне вашего контейнера. Возможно, попробуйте скопировать его в свои документы или временную папку, а затем загрузите с помощью 'uploadParametersWithFileURL', используя файлURL. – Rob

+0

FWIW, похоже, именно здесь Сергей собирался в его ответе ... – Rob

ответ

1

Пожалуйста, попробуйте это, если файл существует в телефоне вместо [NSURL URLWithString: videoURL].

NSData * fileData = [NSData dataWithContentsOfURL: [NSURL fileURLWithPath: videoURL]];

+0

Я сделал fileData возвращает nil – George

+0

вы могли бы зарегистрировать видеоURL? –

+0

Это файл videoURL: ///var/mobile/Media/DCIM/102APPLE/IMG_2187.MOV – George

2
  1. Рассмотрим следующую строку:

    var videoDataURL = info[UIImagePickerControllerMediaURL] as! NSURL! 
    

    Это делает вынужденный разворачивания из info[UIImagePickerControllerMediaURL] (что это плохо, потому что если бы это было nil, приложение будет катастрофа) и бросает его в качестве неявно развернутый опционально NSURL!. Это не имеет смысла. Просто сделайте условный развёрток (и разворачивать к NSURL, а не NSURL!):

    if let videoDataURL = info[UIImagePickerControllerMediaURL] as? NSURL { ... } 
    
  2. Следующая строка вызывает filePathURL:

    var videoFileURL = videoDataURL.filePathURL 
    

    Если вы хотите файл URL, у вас уже есть один, поэтому конверсии не требуется, но вместо этого просто используйте videoDataURL. Если вы действительно хотите путь, вы будете использовать path метод:

    let videoPath = videoDataURL.path 
    

    Честно говоря, Apple пытается переложить нас от использования строковых путей, так что просто использовать оригинальный videoDataURL и избегать использования обоих пути и filePathURL ,

  3. Вы используете dataWithContentsOfMappedFile:

    var video = NSData.dataWithContentsOfMappedFile("\(videoDataURL)") 
    

    Если вы действительно хотите использовать dataWithContentsOfMappedFile, собственно Swift синтаксис:

    let video = NSData(contentsOfMappedFile: videoPath!) 
    

    Но dataWithContentsOfMappedFile осуждается, так что вы должны использовать вместо:

    let video = try NSData(contentsOfFile: videoPath!, options: .DataReadingMappedIfSafe) 
    

    Или, bypas петь эту videoPath в целом, вы можете:

    let video3 = try NSData(contentsOfURL: videoDataURL, options: .DataReadingMappedIfSafe) 
    

    Очевидно, что те пытаются выдачи должны быть сделаны в сделай блок с фиксацией блоком.

  4. Кстати, как вы увидите во всех приведенных выше примерах, следует использовать let, где это возможно.

Откровенно говоря, я бы не советовал загружая его в NSData вообще. Просто скопируйте его с помощью NSFileManager, что является более эффективным использованием памяти. Если видео длинное, оно может быть довольно большим, и вы должны не загружать все это в память в любой момент времени.

Таким образом, вы могли бы:

if let videoDataURL = info[UIImagePickerControllerMediaURL] as? NSURL { 
    do { 
     // build your destination URL however you want 
     // 
     // let tempFolder = NSURL(fileURLWithPath: NSTemporaryDirectory()) 
     // let destinationURL = tempFolder.URLByAppendingPathComponent("test.mov") 

     // or 

     let documents = try NSFileManager.defaultManager().URLForDirectory(.DocumentDirectory, inDomain: .UserDomainMask, appropriateForURL: nil, create: false) 
     let destinationURL = documents.URLByAppendingPathComponent("test.mov") 

     // but just copy from the video URL to the destination URL 

     try NSFileManager.defaultManager().copyItemAtURL(videoDataURL, toURL: destinationURL) 
    } catch { 
     print(error) 
    } 
} 

Если вы загружаете это веб-сервис, вы бы затем использовать NSURLSessionUploadTask, используя файл или поток параметров. Построение этого запроса является отдельным вопросом, но, надеюсь, вы получите идею: с большими объектами, такими как фотографии или, в частности, видео, не создавайте экземпляр NSData с активом, если вы можете его избежать.

Смежные вопросы