簡體   English   中英

升級到Xcode 7后,UIImagePickerControllerMediaURL上沒有文件

[英]No file at UIImagePickerControllerMediaURL after upgrading to Xcode 7

將我的Swift視頻應用程序升級到Swift 2.0 / Xcode 7 / iOS 9后,除了從UIImagePickerController獲取視頻外,一切正常。 所有權限都會檢查相機和庫。 我可以同時訪問並錄制新視頻或從庫中選擇現有視頻。 但是,當調用委托方法imagePickerController:didFinishPickingMediaWithInfoNSFileManager告訴我UIImagePickerControllerMediaURL沒有文件。 UIImagePickerController上調用dismissViewControllerAnimated之前和之后都是如此。

它之前運行良好,並且沒有重大的代碼更改來適應升級。 我發現沒有其他類似的問題在網上報道,所以我認為我必須搞砸像文件夾權限,但我無法弄清楚是什么。 我想也許使用NSAppTransportSecurity與它有關,因為它與file:/// URL有關,但問題仍然存在於iOS 7,8和9中,無論我的info.plist中是否存在該字典。

如果有人能給我一些線索,我會非常感激。 我在iPhone 6,5s和4s上嘗試過這個,結果相同。 我確實記得在Swift 2升級過程中使用“kUTTypeMovie”進行回合。 下面的“[kUTTypeMovie as String]”是我發現Xcode唯一接受的東西。 這可能是一個弱點,但我懷疑它,因為它似乎按預期工作。 我提到它的唯一原因是,如果您不要求類型,該應用程序無權接收它。

附加信息

我可以使用UIImagePickerController正常從相機/庫中獲取圖像。 一時興起,我想也許我可以通過抓住原始視頻並自己壓縮來解決這個問題,但是NSFileManager告訴我UIImagePickerControllerReferenceURL上也沒有文件。 除非我的應用程序以某種方式被拒絕訪問,否則我不知道這怎么可能。

  • 使用下面的代碼記錄:在以下位置沒有文件:assets-library://asset/asset.MOV?id = 22A4CFF1-BBC0-4084-990D-B217908F0616&ext = 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就像,file:///private/var/mobile/Containers/Data/Application/6754830D-ER98-31OL-GU34-78067GD908PI/tmp/trim.578E437C-EEBC-4BC5-AD5C-C351BD0822B2.MOV

我知道這個問題已經很老了,但我今天偶然發現了同樣的錯誤。

問題是您從videoURL.absoluteString獲取文件URL字符串並將其傳遞給NSFileManager的fileExistsAtPath方法而不是路徑。 您應該通過閱讀NSURL的“path”屬性來獲取該文件的路徑。

從videoURL.absoluteString讀取的文件URL如下所示:

文件:///private/var/mobile/Containers/Data/Application/6754830D-ER98-31OL-GU34-78067GD908PI/tmp/trim.578E437C-EEBC-4BC5-AD5C-C351BD0822B2.MOV

從videoURL.path讀取的文件路徑如下所示:

/private/var/mobile/Containers/Data/Application/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.
             }
         }
     }

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM