Swift 共享文件操作小結(jié)(iOS 8 +)
前言
適用于 iOS 8 + 本地共享文件列表
正文
一、準(zhǔn)備
1.1 默認(rèn) App 的文件共享是關(guān)閉的,需要在 plist 中設(shè)置啟用:
Application supports iTunes file sharing 設(shè)置為 YES
啟用后把設(shè)備連接到 iTunes 上,在 iTunes 應(yīng)用里的文件共享就能看到你的 App 了(如果看不見(jiàn)需要斷開(kāi)重新拔插一下數(shù)據(jù)線),可以拷貝一些視頻進(jìn)去,便于測(cè)試。
1.2 導(dǎo)入庫(kù)
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) } }
代碼說(shuō)明:
a)需要注意一些 swift 的用法,例如 fileExistsAtPath 的用法
b)還有 String 的 pathExtension 和 lastPathComponent 都沒(méi)了,都改到了 NSURL 下面去了,網(wǎng)上很多資料都還是從 NSString 或者 String 取這些屬性
c)AVURLAsset 可以取到視頻的時(shí)長(zhǎng) 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() } }
四、用 ... 打開(kāi)
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 { } }
六、保存到相冊(cè)
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 } }
代碼說(shuō)明:
注意 UISaveVideoAtPathToSavedPhotosAlbum 的用法,后面 Selector 寫(xiě)得不對(duì)就會(huì)報(bào)錯(cuò)。
以上就是IOS 8 共享文件的實(shí)例代碼,有需要的朋友可以參考下。
相關(guān)文章
iPhoneX無(wú)導(dǎo)航欄頁(yè)面適配問(wèn)題解決方案
這篇文章主要介紹了iPhoneX無(wú)導(dǎo)航欄頁(yè)面適配問(wèn)題解決方案,原全屏適配在iPhoneX會(huì)由于安全區(qū)域的變化導(dǎo)致顯示不全,本文給大家介紹的非常詳細(xì),需要的朋友可以參考下2017-11-11詳解iOS AFNetworking取消正在進(jìn)行的網(wǎng)絡(luò)請(qǐng)求
這篇文章主要介紹了詳解iOS AFNetworking取消正在進(jìn)行的網(wǎng)絡(luò)請(qǐng)求,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2018-06-06詳解iOS開(kāi)發(fā)中app的歸檔以及偏好設(shè)置的存儲(chǔ)方式
這篇文章主要介紹了iOS開(kāi)發(fā)中app的歸檔以及偏好設(shè)置的存儲(chǔ)方式,示例代碼基于傳統(tǒng)的Objective-C,需要的朋友可以參考下2015-12-12IOS MenuViewController實(shí)現(xiàn)彈出菜單效果
這篇文章主要介紹了IOS MenuViewController實(shí)現(xiàn)彈出菜單效果,實(shí)現(xiàn)一個(gè)從下移動(dòng)上來(lái)的彈出菜單,背景逐漸變深,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-07-07如何利用FutureBuilder提高開(kāi)發(fā)效率
這篇文章主要給大家介紹了關(guān)于如何利用FutureBuilder提高開(kāi)發(fā)效率的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-07-07iOS代碼瘦身實(shí)踐之如何刪除無(wú)用的類(lèi)
這篇文章主要給大家介紹了關(guān)于iOS代碼瘦身實(shí)踐之如何刪除無(wú)用的類(lèi),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家各位iOS開(kāi)發(fā)者們具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-08-08IOS 開(kāi)發(fā)之UILabel 或者 UIButton加下劃線鏈接
這篇文章主要介紹了IOS 開(kāi)發(fā)之UILabel 或者 UIButton加下劃線鏈接的相關(guān)資料,需要的朋友可以參考下2017-07-07