2015-10-12 2 views
3

После обновления моего приложения Swift для Swift 2.0/Xcode 7/iOS 9 все работает отлично, за исключением получения видео от UIImagePickerController. Все разрешения для камеры и библиотеки. Я могу добраться до обоих и записать новое видео или выбрать существующее видео из библиотеки. Однако, когда вызывается метод делегата imagePickerController:didFinishPickingMediaWithInfo, NSFileManager сообщает мне, что на UIImagePickerControllerMediaURL нет файла. Это верно как до, так и после звонка dismissViewControllerAnimated на UIImagePickerController.Нет файла в UIImagePickerControllerMediaURL после обновления до Xcode 7

Он работал безупречно раньше и не было никаких существенных изменений кода для размещения обновлений. Я не обнаружил никаких других подобных проблем, сообщенных в Интернете, поэтому я полагаю, что я, должно быть, прикрутил что-то вроде прав доступа к папке, но я не могу понять, что. Я подумал, что, возможно, использование NSAppTransportSecurity имеет какое-то отношение к нему, поскольку оно относится к URL-адресам file:///, но проблема сохраняется в iOS 7, 8 и 9 независимо от того, присутствует ли этот словарь в моем info.plist.

Если кто-нибудь может дать мне несколько советов, чтобы посмотреть, я бы очень признателен. Я пробовал это на iPhones 6, 5s, & 4 с таким же результатом. Я помню, как я общался с «kUTTypeMovie» во время обновлений Swift 2. «[KUTTypeMovie as String]» ниже - это единственное, что я обнаружил, что Xcode согласился бы. Это может быть слабым моментом, но я сомневаюсь, так как он работает так, как ожидалось. Единственная причина, по которой я упоминаю, что если вы не запрашиваете тип, приложение не имеет разрешения на его получение.

Дополнительная информация

Я могу использовать UIImagePickerController, чтобы получить изображения с камеры/библиотеки в обычном режиме. По прихоти, я подумал, что, возможно, мне удастся обойти эту проблему, просто захватив исходное видео и сжимая его самостоятельно, но NSFileManager сообщает мне, что в UIImagePickerControllerReferenceURL нет файла. Я не знаю, как это возможно, если моему приложению не будет отказано в доступе.

  • Войти с помощью кода ниже: НЕТ файл по адресу: активов-библиотеки: //asset/asset.MOV ID = 22A4CFF1-BBC0-4084-990D-B217908F0616 & внутр = MOV
  • Это настолько странно, что я подал отчет об ошибке с Apple.

Соответствующий код здесь:

@IBAction func actionTakeVideo(sender: AnyObject) { 
    if videoPickerController == nil { 
     videoPickerController = UIImagePickerController() 
     videoPickerController.delegate = self 
     videoPickerController.mediaTypes = [kUTTypeMovie as String] 
     videoPickerController.videoMaximumDuration = NSTimeInterval(maxVideoDuration-1) 
     videoPickerController.allowsEditing = true 
     videoPickerController.videoQuality = UIImagePickerControllerQualityType.TypeHigh 
} 

...

// From Library 
     let status:ALAuthorizationStatus = ALAssetsLibrary.authorizationStatus() 
     if status != ALAuthorizationStatus.Authorized{ 
      print("Library not authorized: status != ALAuthorizationStatus.Authorized") 
     } else { 
      self.videoPickerController.sourceType = UIImagePickerControllerSourceType.PhotoLibrary 
      self.presentViewController(self.videoPickerController, animated: true, completion: nil) 
     } 

...

//From Camera 
     if UIImagePickerController.isSourceTypeAvailable(UIImagePickerControllerSourceType.Camera) { 
      self.videoPickerController.sourceType = UIImagePickerControllerSourceType.Camera 
      self.videoPickerController.cameraDevice = UIImagePickerControllerCameraDevice.Front 
      self.presentViewController(self.videoPickerController, animated: true, completion: nil) 
     } 

...

//Delegate 
    func imagePickerController(picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [String : AnyObject]) { 
     let manager = NSFileManager.defaultManager(); 
     let videoURL = info[UIImagePickerControllerMediaURL] as! NSURL 
     if manager.fileExistsAtPath(videoURL.absoluteString) { 
      print("THERE IS a file at: \(videoURL.absoluteString)") 
     } else { 
      print("THERE IS NOT a file at: \(videoURL.absoluteString)") // ALWAYS LANDS HERE. 
     } 
    } 

UIImagePickerControllerMediaURL как, файл: ///private/var/mobile/Containers/Data/Application/6754830D-ER98-31OL-GU34-78067GD908PI/tmp/trim.578E437C-EEBC-4BC5-AD5C-C351BD0822B2. MOV

+0

Какая ошибка ar вы получаете? –

+0

Ошибка не возникает. Единственное доказательство проблемы - когда я пытаюсь получить доступ к видеофайлу - там ничего нет. Если есть уведомления, которые я могу заметить, чтобы поймать ошибки внутри внутреннего процесса сжатия или переноса файлов UIImagePickerController или его базовых компонентов, я не знаю о них. –

+0

Вы когда-нибудь узнавали, почему это так? Похоже, что в iOS 9 SDK ключ UIImagePickerControllerMediaURL больше нет –

ответ

0

Я знаю, что этот вопрос довольно старый, но сегодня я наткнулся на ту же самую ошибку.

Проблема в том, что вы получаете строку URL-адреса файла из видеоURL.absoluteString и передать его в метод fileExistsAtPath NSFileManager вместо пути. Вы должны получить путь к файлу, прочитав свойство «путь» NSURL.

Файл URL для чтения из videoURL.absoluteString выглядит следующим образом:

файл: /// частный/вар/мобильный/Контейнеры/Data/Application/6754830D-ER98-31OL-GU34-78067GD908PI/TMP/trim.578E437C-EEBC-4BC5-AD5C-C351BD0822B2.MOV

файл путь для чтения из videoURL.path будет выглядеть следующим образом:

/частный/вар/мобильный/Контейнеры/Данные/Применение/6754830D-ER98-31OL -GU34-78067GD908PI/TMP/trim.578E437C-EEBC-4BC5-AD5C-C351BD0822B2.MOV

Следующий код:

func imagePickerController(picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [String : AnyObject]) { 
     let manager = NSFileManager.defaultManager(); 
     let videoURL = info[UIImagePickerControllerMediaURL] as! NSURL 
     if manager.fileExistsAtPath(videoURL.absoluteString) { 
      print("THERE IS a file at: \(videoURL.absoluteString)") 
     } else { 
      print("THERE IS NOT a file at: \(videoURL.absoluteString)") // ALWAYS LANDS HERE. 
     } 
    } 

Должно быть изменено на:

func imagePickerController(picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [String : AnyObject]) { 
     let manager = NSFileManager.defaultManager(); 
     let videoURL = info[UIImagePickerControllerMediaURL] as! NSURL 
     if manager.fileExistsAtPath(videoURL.path) { 
      print("THERE IS a file at: \(videoURL.path)") 
     } else { 
      print("THERE IS NOT a file at: \(videoURL.path)") // ALWAYS LANDS HERE. 
     } 
    } 

И имея в виду, что UIImagePickerControllerMediaURL может и не присутствовать:

func imagePickerController(picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [String : AnyObject]) { 
     if let videoURL = info[UIImagePickerControllerMediaURL] as? URL { 
      if FileManager.default.fileExistsAtPath(videoURL.path) { 
       print("THERE IS a file at: \(videoURL.path)") 
      } else { 
       print("THERE IS NOT a file at: \(videoURL.path)") // ALWAYS LANDS HERE. 
      } 
     } 
    } 
Смежные вопросы