升级我的Swift视频应用程序到Swift 2.0 / Xcode 7 / iOS 9后,除了从
在升级过程中,它之前一直运行得很好,并且没有进行任何主要的代码更改。我在网上没有找到其他类似的问题报告,因此我认为我一定搞砸了一些东西,比如文件夹权限,但我无法弄清楚。我认为使用
如果有人能给我一些线索,我将非常感激。我已经在iPhone 6、5s和4s上尝试了这个问题,结果都是一样的。我记得在Swift 2升级期间一直困扰着“kUTTypeMovie”。下面的“[kUTTypeMovie as String]”是我找到的Xcode会接受的唯一东西。这可能是一个弱点,但我怀疑它是否有效,因为它似乎按预期工作。我提到它的唯一原因是,如果您不请求类型,则应用程序没有权限接收它。
额外信息:
我能够像往常一样使用UIImagePickerController从相机/库中获取图像。我突发奇想,以为我可以通过只获取原始视频并自己压缩来避免此问题,但NSFileManager告诉我在UIImagePickerControllerReferenceURL上也没有文件。我不知道除非我的应用程序被拒绝访问,否则这可能是如何实现的。
以下是相关代码:
UIImagePickerController
获取视频外,一切正常。相机和库的所有权限都已经检查过了。我可以进入并记录新视频或从库中选择现有视频。但是,当调用委托方法imagePickerController:didFinishPickingMediaWithInfo
时,NSFileManager
告诉我在UIImagePickerControllerMediaURL
上没有文件。这在调用dismissViewControllerAnimated
之前和之后都是正确的。在升级过程中,它之前一直运行得很好,并且没有进行任何主要的代码更改。我在网上没有找到其他类似的问题报告,因此我认为我一定搞砸了一些东西,比如文件夹权限,但我无法弄清楚。我认为使用
NSAppTransportSecurity
可能与此有关,因为它涉及file:///
URL,但是无论我的info.plist中是否存在该字典,该问题在iOS 7、8和9中仍然存在。如果有人能给我一些线索,我将非常感激。我已经在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 的链接。