SWIFT:代码块可轻松访问iOS相机,照片库,视频,文件

照片,视频,文档对布告栏用户至关重要-这是他们交流和分享工作场所中日常活动的方式。

在为该应用的iOS版本开发此功能时,我意识到没有单个代码块可以从设备访问媒体文件。

这就是这件作品的来源。 如果您只需要一段代码即可完成此操作,请随时将其插入您的应用程序。

以下是创建自定义类的分步教程, 该类将帮助开发人员使用swift 4访问基本附件,例如“相机图像”,“照片库”,“视频”和“文件导入”。

TL:DR —您可以在此处查看其完整的GIST文件。 我已将其命名为AttachmentHandler.swift

步骤1:使用UIAlertController创建操作表

通过使用UIAlertController创建操作表。 我将在操作表中列出所有四个选项,并在底部列出“取消”按钮。

如果您想进一步了解UIAlertController。 请您在这里检查。 您也可以查找UIActionSheet,但这已被描述。

  func showAttachmentActionSheet(vc:UIViewController){ 
currentVC = vc
让actionSheet = UIAlertController(标题:Constants.actionFileTypeHeading,消息:Constants.actionFileTypeDescription,preferredStyle:.actionSheet)

actionSheet.addAction(UIAlertAction(title:Constants.camera,style:.default,handler:{(action)-> Void in
self.authorisationStatus(attachmentTypeEnum:.camera,vc:self.currentVC!)
}))

actionSheet.addAction(UIAlertAction(title:Constants.phoneLibrary,style:.default,handler:{(action)-> Void in
self.authorisationStatus(attachmentTypeEnum:.photoLibrary,vc:self.currentVC!)
}))

actionSheet.addAction(UIAlertAction(title:Constants.video,style:.default,handler:{(action)-> Void in
self.authorisationStatus(attachmentTypeEnum:.video,vc:self.currentVC!)

}))

actionSheet.addAction(UIAlertAction(title:Constants.file,style:.default,handler:{(action)-> Void in
self.documentPicker()
}))

actionSheet.addAction(UIAlertAction(title:Constants.cancelBtnTitle,style:.cancel,handler:nil))

vc.present(actionSheet,动画:true,完成:无)
}

步骤2:检查授权状态

.. 来自PHPhotoLibrary 这意味着我们必须验证用户是否已获得访问其照片的权限。

Info.plist中添加两行

隐私权-相机使用说明
隐私权—照片库使用说明

以上两行应添加到您应用的Info.plist中,示例说明为

“ $(PRODUCT_NAME)想要访问您的相机,而$(PRODUCT_NAME)想要访问您的照片。”

 func authorisationStatus(attachmentTypeEnum:AttachmentType,vc:UIViewController){ 
currentVC = vc
如果attachmentTypeEnum == AttachmentType.camera {
let status = AVCaptureDevice.authorizationStatus(用于:.video)
开关状态{
case .authorized://用户先前已授予对摄像机的访问权限。
self.openCamera(currentVC)

case .notDetermined://尚未要求用户访问摄像机。
AVCaptureDevice.requestAccess(for:.video){在
如果授予{
self.openCamera(self.currentVC)
}
}
// denyed-用户先前已拒绝访问。
// restricted-由于限制,用户无法授予访问权限。
大小写.denied,.restricted:
self.addAlertForSettings(attachmentTypeEnum)
返回

默认:
打破
}
}否则,如果attachmentTypeEnum == AttachmentType.photoLibrary || attachmentTypeEnum == AttachmentType.video {
让状态= PHPhotoLibrary.authorizationStatus()
开关状态{
案例授权:
如果attachmentTypeEnum == AttachmentType.photoLibrary {
photoLibrary()
}

如果attachmentTypeEnum == AttachmentType.video {
videoLibrary()
}
大小写.denied,.restricted:
self.addAlertForSettings(attachmentTypeEnum)
大小写。未确定:
PHPhotoLibrary.requestAuthorization({(status)in
如果状态== PHAuthorizationStatus.authorized {
//提供照片库访问权限
self.photoLibrary()
}
如果attachmentTypeEnum == AttachmentType.video {
self.videoLibrary()
}
})
默认:
打破
}
}
}

其中,AttachmentType是枚举。

 枚举AttachmentType:字符串{ 
案例相机,视频,照相馆
}

PHPhotoLibrary的授权状态 带有4种状态。 它们被授权,拒绝,不确定,限制。

如果拒绝或限制访问 ,我们必须向用户添加警报,要求用户通过手动进入设置来打开访问权限。 这将帮助我们访问附件。 如果已授权 ,则在AttachmentType枚举的帮助下访问所需的附件类型。

步骤3:开启摄影机,图库和影片

openCamera — sourceType:相机

对相机,视频和照片库使用UIImagePickerController类。 然后,将sourceType属性更改为适用于相机和照片库的属性。

  func openCamera(){ 
如果UIImagePickerController.isSourceTypeAvailable(.camera){
让myPickerController = UIImagePickerController()
myPickerController.delegate =自我
myPickerController.sourceType = .camera
currentVC?.present(myPickerController,动画:true,完成:无)
}
}

accessPhotoLibrary — sourceType:photoLibrary

  func photoLibrary(){ 
如果UIImagePickerController.isSourceTypeAvailable(.photoLibrary){
让myPickerController = UIImagePickerController()
myPickerController.delegate =自我
myPickerController.sourceType = .photoLibrary
currentVC?.present(myPickerController,动画:true,完成:无)
}
}

accessVideo

要访问照片库中的视频,我们必须将mediaType用作kUTTypeMoviekUTTypeVideo

mediaTypes = [kUTTypeMovie作为字符串,kUTTypeVideo作为字符串]

  func videoLibrary(){ 
如果UIImagePickerController.isSourceTypeAvailable(.photoLibrary){
让myPickerController = UIImagePickerController()
myPickerController.delegate =自我
myPickerController.sourceType = .photoLibrary
myPickerController.mediaTypes = [kUTTypeMovie作为字符串,kUTTypeVideo作为字符串]
currentVC?.present(myPickerController,动画:true,完成:无)
}
}

步骤4:accessFile

在iOS 11中,Apple引入了文件 浏览器功能。 这样,我们可以访问任何类型的文档,例如PDF,PPT等。但是,与Android不同,iOS不允许您访问物理存储在设备上的文件,但是,可以的,您可以通过iCloud (或Google云端硬盘,Dropbox,云存储空间)。

您需要做的就是为您的应用程序打开iCloud和钥匙串共享。 您可以在功能部分(XCode)中执行此操作。 确保为您的应用启用CloudKit。

  func documentPicker(){ 
让importMenu = UIDocumentMenuViewController(documentTypes:[String(kUTTypePDF)],in:.import)
importMenu.delegate =自我
importMenu.modalPresentationStyle = .formSheet
currentVC?.present(importMenu,动画:true,完成:无)
}

步骤5:相机,照相馆和视频代表方法

首先,使用两个委托UIImagePickerControllerDelegate和UINavigationControllerDelegate创建一个扩展。

然后,创建以下方法:imagePickerController,imagePickerControllerDidCancel。

顾名思义,第一种方法是拾取图像,第二种方法是取消选择器。

  @objc func imagePickerController(_选择器:UIImagePickerController,didFinishPickingMediaWithInfo信息:[String:任何]){ 

//处理图片
如果让image = info [UIImagePickerControllerOriginalImage]作为? UIImage {
self.imagePickedBlock?(图片)
}其他{
打印(“图像出现问题”)
}
  //处理视频 
 如果让videoUrl = info [UIImagePickerControllerMediaURL]作为?  NSURL { 
print(“ videourl:”,videoUrl)
//尝试压缩视频
让data = NSData(contentsOf:videoUrl作为URL)!
print(“压缩前的文件大小:\(Double(data.length / 1048576))mb”)
self .videoPickedBlock?(videoUrlFromPhone,size)
}
其他{
打印(“视频出现问题”)
}
currentVC?.dismiss(动画:true,完成:无)
}

可以将视频作为本地媒体URL拾取。

现在,您已经从相机和图库中选择了照片和视频,可以在任何课程中使用它。 我创建了一个名为videoPickedBlockimagePickedBlock的闭包 这是我们的设置方法。

 静态让共享= AttachmentHandler() 
fileprivate var currentVC:UIViewController吗?
  // MARK:-内部属性 
var imagePickedBlock:(((UIImage)-> Void)?
var videoPickedBlock:(((NSURL)-> Void)?
var filePickedBlock:((URL)-> Void)?

步骤6:文件导入代理方法

现在,使用方法didPickDocumentPicker,didPickDocumentAt和documentPickerWasCancelled使用两个委托( UIDocumentMenuDelegateUIDocumentPickerDelegate)创建另一个扩展。 将选择的文件与filePickedBlock关闭一起使用。

  func documentMenu(_文档菜单:UIDocumentMenuViewController,didPickDocumentPicker documentPicker:UIDocumentPickerViewController){ 
documentPicker.delegate =自我
currentVC?.present(documentPicker,动画:true,完成:无)
}


func documentPicker(_控制器:UIDocumentPickerViewController,didPickDocumentAt网址:URL){
print(“ url”,url)
self.filePickedBlock?(URL)
}

//处理取消动作的方法。
func documentPickerWasCancelled(_控制器:UIDocumentPickerViewController){
currentVC?.dismiss(动画:true,完成:无)
}

用法

是啊..万岁! 我们终于使用Swift 4从iPhone导入了媒体和文档。

这是我们创建的类。 两行看似简单的代码行即可完成所有繁重的工作。

  AttachmentHandler.shared.showAttachmentActionSheet(vc:self) 
AttachmentHandler.shared.imagePickedBlock = {
/ *在这里获取图片* /
}
AttachmentHandler.shared.videoPickedBlock = {{url
/ *在此处获取压缩的视频网址* /
}
AttachmentHandler.shared.filePickedBlock = {{filePath)在
/ *在此处获取文件路径网址* /
}

类中使用的常量

 结构常数{ 
static let actionFileTypeHeading =“添加文件”
static let actionFileTypeDescription =“选择要添加的文件类型...”
静态让相机=“相机”
静态让phoneLibrary =“电话库”
static let video =“视频”
静态让文件=“文件”


static let alertForPhotoLibraryMessage =“应用程序无权访问您的照片。要启用访问,请点按设置并打开“照片库访问”。

static let alertForCameraAccessMessage =“应用程序无权访问您的相机。要启用访问,请点击设置并打开相机。”

static let alertForVideoLibraryMessage =“应用无权访问您的视频。要启用访问,请点按设置并打开“视频库访问”。


静态let settingsBtnTitle =“设置”
静态让cancelBtnTitle =“取消”

}