[英]No file at UIImagePickerControllerMediaURL after upgrading to Xcode 7
將我的Swift視頻應用程序升級到Swift 2.0 / Xcode 7 / iOS 9后,除了從UIImagePickerController
獲取視頻外,一切正常。 所有權限都會檢查相機和庫。 我可以同時訪問並錄制新視頻或從庫中選擇現有視頻。 但是,當調用委托方法imagePickerController:didFinishPickingMediaWithInfo
, NSFileManager
告訴我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上也沒有文件。 除非我的應用程序以某種方式被拒絕訪問,否則我不知道這怎么可能。
相關代碼在這里:
@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.