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

前言

  适用于 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 共享文件的实例代码,有需要的朋友可以参考下。

(0)

相关推荐

  • IOS 基本文件操作实例详解

    IOS 基本文件操作实例详解 在iOS的App沙盒中,Documents和Library/Preferences都会被备份到iCloud,因此只适合放置一些记录文件,例如plist.数据库文件.缓存一般放置到Library/Caches,tmp文件夹会被系统随机清除,不适宜防止数据. [图片缓存的清除] 在使用SDWebImage时,图片被大量的缓存,有时需要获取缓存的大小以及清除缓存. 要获取缓存大小,使用SDImageCache单例的getSize方法拿到byte为单位的缓存大小,注意计算时

  • 详解iOS学习笔记(十七)——文件操作(NSFileManager)

    iOS的沙盒机制,应用只能访问自己应用目录下的文件.iOS不像Android,没有SD卡概念,不能直接访问图像.视频等内容.iOS应用产生的内容,如图像.文件.缓存内容等都必须存储在自己的沙盒内.默认情况下,每个沙盒含有3个文件夹:Documents, Library 和 tmp.Library包含Caches.Preferences目录. 上面的完整路径为:用户->资源库->Application Support->iPhone Simulator->6.1->Aplica

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

    前言 适用于 iOS 8 + 本地共享文件列表 正文 一.准备 1.1 默认 App 的文件共享是关闭的,需要在 plist 中设置启用: Application supports iTunes file sharing 设置为 YES 启用后把设备连接到 iTunes 上,在 iTunes 应用里的文件共享就能看到你的 App 了(如果看不见需要断开重新拔插一下数据线),可以拷贝一些视频进去,便于测试. 1.2 导入库 Photos.framework AVKit.framework 用于播放

  • javascript对象的相关操作小结

    我们知道浏览器对象模型(BOM)是javascript的组成之一,它提供了独立于内容与浏览器窗口进行交互的对象.其分层结构如下: window对象是整个BOM的核心其有document(文档对象).location(地址对象) 和history(历史对象组成) 调用对象属性的语法: 1.对象.属性名="属性值"; 2.对象["属性名称字符串"]="属性值"; 调用对象方法的语法: 1.对象的方法名(); 2.对象["方法名称字符串&qu

  • jQuery Select下拉框操作小结(推荐)

    jQuery获取Select元素,并选择的Text和Value: 1. $("#select_id").change(function(){//code...}); //为Select添加事件,当选择其中一项时触发 2. var checkText=$("#select_id").find("option:selected").text(); //获取Select选择的Text 3. var checkValue=$("#select_

  • javascript中对Date类型的常用操作小结

    javascript中对Date类型的常用操作小结 /** 3. * 日期时间脚本库方法列表: 4. * (1)Date.isValiDate:日期合法性验证 5. * (2)Date.isValiTime:时间合法性验证 6. * (3)Date.isValiDateTime:日期和时间合法性验证 7. * (4)Date.prototype.isLeapYear:判断是否闰年 8. * (5)Date.prototype.format:日期格式化 9. * (6)Date.stringToD

  • JavaScript 字符串常用操作小结(非常实用)

    字符串截取 1. substring() xString.substring(start,end) substring()是最常用到的字符串截取方法,它可以接收两个参数(参数不能为负值),分别是要截取的开始位置和结束位置,它将返回一个新的字符串,其内容是从start处到end-1处的所有字符.若结束参数(end)省略,则表示从start位置一直截取到最后. let str = 'www.jeffjade.com' console.log(str.substring(0,3)) // www co

  • Vue.js 表单控件操作小结

    概念说明 v-model指令:在表单控件元素上创建双向数据绑定.v-model 会根据控件类型自动选取正确的方法来更新元素. 输入框 实例中演示了 input 和 textarea 元素中使用 v-model 实现双向数据绑定: HTML <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>Vue 测试实例 - 菜鸟教程(runoob.com)</tit

  • python文件读写操作小结

    目录 读文件 写文件 关于open()的mode参数: file_obj.seek(offset,whence=0) 字符编码 读文件 打开一个文件用open()方法(open()返回一个文件对象,它是可迭代的): >>> f = open('test.txt', 'r') r表示是文本文件,rb是二进制文件.(这个mode参数默认值就是r) 如果文件不存在,open()函数就会抛出一个IOError的错误,并且给出错误码和详细的信息告诉你文件不存在: >>> f=op

  • Python字符串常规操作小结

    目录 一.前言 二.拼接字符串 三.计算字符串的长度 四.截取字符串 五.分隔字符串 六.检索字符串 1.count()方法 2.find()方法 3.index()方法 4.startswith()方法 5.endswith()方法 七.字母的大小写转换 1.lower()方法 八.去除字符串中的空格和特殊字符 1.strip()方法 2.lstrip()方法 3.rstrip()方法 九.格式化字符串 1.使用“ %”操作符 2.字符串对象的format() 方法 一.前言 在Python开

  • C#中DateTime的时间加减法操作小结

    在C#语言中,DateTime是用来表示时间的类,在C#的DateTime时间类中,提供了好像时间对象加减法操作,可用于某一个时间对象加减 多少年.加减多少个月.加减多少天.加减多少小时.加减多少分钟.加减多少秒等操作,此文将总结C#的DateTime类中的时间加减操作运算. (1)加减多少年操作:AddYears方法,具体参考C#使用AddYears方法获取当前时间20年后的时刻. C#使用AddYears方法获取当前时间20年后的时刻 2019-08-10 10:01 在C#语言中,Date

  • Swift使用WKWebView在iOS应用中调用Web的方法详解

    自从iOS8开始,Apple引入了WKWebView欲代替UIWebView.相比而言,WKWebView消耗内从更少,功能也更加强大.让我们来看看WKWebView怎么使用吧! 0.初始化 (1)首先需要引入WebKit库 复制代码 代码如下: #import <WebKit/WebKit.h> (2)初始化方法分为以下两种 复制代码 代码如下: // 默认初始化 - (instancetype)initWithFrame:(CGRect)frame; // 根据对webview的相关配置,

随机推荐