Swift 共享文件操作小结(iOS 8 +)

所属分类: 软件编程 / IOS 阅读数: 611
收藏 0 赞 0 分享

前言

  适用于 iOS 8 + 本地共享文件列表

正文

  一、准备

    1.1  默认 App 的文件共享是关闭的,需要在 plist 中设置启用:

    Application supports iTunes file sharing  设置为  YES

启用后把设备连接到 iTunes 上,在 iTunes 应用里的文件共享就能看到你的 App 了(如果看不见需要断开重新拔插一下数据线),可以拷贝一些视频进去,便于测试。

    1.2  导入库

      Photos.framework

      AVKit.framework  用于播放视频    

  二、获取视频列表

 private let VIDEO_EXTENSIONS = [
    ".MOV", ".MP4"
  ]

  private var fileManager = NSFileManager.defaultManager()
  
  func loadVideos() {
    var paths = NSSearchPathForDirectoriesInDomains(.DocumentDirectory, .UserDomainMask, true)
    if paths.count > 0 {
      let documentsDirectory = paths[0] as String
      let documentUrl = NSURL(fileURLWithPath: documentsDirectory, isDirectory: true)
      do {
        documentUrl.path
        let files = try fileManager.contentsOfDirectoryAtPath(documentsDirectory)
        for file in files {
          fetchVideos(documentUrl.URLByAppendingPathComponent(file).path ?? "")
        }
      }  catch {
        
      }
      
      self.tableView.reloadData()
    }
  }
  
  func fetchVideos(path: String) {
    var isDir: ObjCBool = false
    if !path.isEmpty && fileManager.fileExistsAtPath(path, isDirectory: &isDir) {
      if isDir {
        do {
          let files = try fileManager.contentsOfDirectoryAtPath(path)
          for file in files {
            fetchVideos(file)
          }
        } catch {
        }
      } else {
        var file = File(path: path)
        if file.isValid() && isVideoFileExtension(file.fileExtension.uppercaseString) {
          do {
            if let attr: NSDictionary = try fileManager.attributesOfItemAtPath(path) {
              file.fileSize = attr.fileSize()
            }
          } catch {
          }
          videos.append(file)
        }
      }
    }
  }
  
  func isVideoFileExtension(ext: String) -> Bool {
    for videoExtension in VIDEO_EXTENSIONS {
      if ext == videoExtension {
        return true
      }
    }
    return false
  }
  
  struct File {
    var fileExtension = ""
    var fileName = ""
    var path = ""
    var assert: AVURLAsset?
    var url: NSURL!
    var fileSize: UInt64 = 0
    
    init(path: String) {
      self.path = path
      self.url = NSURL(fileURLWithPath: path)
      self.fileName = url.lastPathComponent ?? ""
      self.fileExtension = "." + (url.pathExtension ?? "")
    }
    
    func isValid() -> Bool {
      return !(fileName.isEmpty || fileExtension.isEmpty)
    }
  }

代码说明:

      a)需要注意一些 swift 的用法,例如 fileExistsAtPath 的用法

      b)还有 String 的 pathExtension 和 lastPathComponent 都没了,都改到了 NSURL 下面去了,网上很多资料都还是从 NSString 或者 String 取这些属性

      c)AVURLAsset 可以取到视频的时长 CMTimeGetSeconds(AVURLAsset(URL: file.url, options: nil).duration)

  三、播放视频

 func play(file: File) {
    let player = AVPlayer(URL: file.url)
    let playerViewController = AVPlayerViewController()
    playerViewController.player = player
    self.presentViewController(playerViewController, animated: true) {
      playerViewController.player?.play()
    }
  }

        四、用 ... 打开

 func openIn(file: File, indexPath: NSIndexPath) {
    let document = UIDocumentInteractionController(URL: file.url)
    let rect = self.tableView.rectForRowAtIndexPath(indexPath)
    document.presentOpenInMenuFromRect(rect, inView: self.tableView, animated: true)
  }

        五、删除视频

 func delete(file: File, indexPath: NSIndexPath) {
    do {
      try fileManager.removeItemAtPath(file.path)
      videos.removeAtIndex(indexPath.row)
      tableView.deleteRowsAtIndexPaths([indexPath], withRowAnimation: UITableViewRowAnimation.Automatic)
    } catch {
      
    }
  }

        六、保存到相册

 func saveToCameraRoll(file: File, indexPath: NSIndexPath) {
    if UIVideoAtPathIsCompatibleWithSavedPhotosAlbum(file.path) {
      UISaveVideoAtPathToSavedPhotosAlbum(file.path, self, "image:didFinishSavingWithError:contextInfo:", nil)
    } else {
      // save faild
    }
  }
  
  func image(image: UIImage, didFinishSavingWithError error: NSErrorPointer, contextInfo:UnsafePointer<Void>) {
    if error == nil {
      // save success
    } else {
      // save faild
    }
  }

 代码说明:

      注意 UISaveVideoAtPathToSavedPhotosAlbum 的用法,后面 Selector 写得不对就会报错。

以上就是IOS 8 共享文件的实例代码,有需要的朋友可以参考下。

更多精彩内容其他人还在看

iOS UISearchController的使用方法

本文主要介绍了iOS UISearchController的使用方法,具有很好的参考价值,下面跟着小编一起来看下吧
收藏 0 赞 0 分享

IOS 中 new 和 alloc init 的对比

这篇文章主要介绍了IOS 中 new 和 alloc init 的区别的相关资料,需要的朋友可以参考下
收藏 0 赞 0 分享

IOS 字符串常用处理详细介绍

这篇文章主要介绍了IOS 字符串常用处理详细介绍的相关资料,需要的朋友可以参考下
收藏 0 赞 0 分享

iOS开发支付宝支付成功返回字符串的处理操作

很多朋友在做ios开发项目时,遇到支付宝支付成功返回字符串的处理操作不知道该怎么办,今天小编给大家分享实例代码,需要的朋友参考下
收藏 0 赞 0 分享

IOS CoreLocation实现系统自带定位的方法

本篇文章主要介绍了IOS Core Location实现系统自带定位的方法,非常具有实用价值,需要的朋友可以参考下。
收藏 0 赞 0 分享

iOS之点击通知栏的通知进入程序的触发事件

本文主要介绍了iOS中点击通知栏的通知进入程序的触发事件的相关知识,具有很好的参考价值,下面跟着小编一起来看下吧
收藏 0 赞 0 分享

IOS  Swift基础之switch用法详解

这篇文章主要介绍了IOS Swift基础之switch用法详解的相关资料,需要的朋友可以参考下
收藏 0 赞 0 分享

IOS React等Title不显示问题解决办法

这篇文章主要介绍了IOS React等Title不显示问题解决办法的相关资料,需要的朋友可以参考下
收藏 0 赞 0 分享

iOS UIScrollView滚动视图/无限循环滚动/自动滚动的实例代码

这篇文章主要介绍了iOS UIScrollView滚动视图/无限循环滚动/自动滚动,需要的朋友可以参考下
收藏 0 赞 0 分享

简单实现iOS指纹解锁(TouchID)

这篇文章主要介绍了如何简单实现iOS指纹解锁,验证TouchID,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
收藏 0 赞 0 分享
查看更多