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 了(如果看不見需要斷開重新拔插一下數(shù)據(jù)線),可以拷貝一些視頻進(jìn)去,便于測(cè)試。
1.2 導(dǎo)入庫
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 下面去了,網(wǎng)上很多資料都還是從 NSString 或者 String 取這些屬性
c)AVURLAsset 可以取到視頻的時(shí)長 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 {
}
}
六、保存到相冊(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
}
}
代碼說明:
注意 UISaveVideoAtPathToSavedPhotosAlbum 的用法,后面 Selector 寫得不對(duì)就會(huì)報(bào)錯(cuò)。
以上就是IOS 8 共享文件的實(shí)例代碼,有需要的朋友可以參考下。
相關(guān)文章
IOS 仿時(shí)光網(wǎng)選票UI實(shí)例代碼
這篇文章主要介紹了IOS 仿時(shí)光網(wǎng)選票UI實(shí)例代碼的相關(guān)資料,需要的朋友可以參考下2016-09-09
iOS 將系統(tǒng)自帶的button改裝成上圖片下文字的樣子
這篇文章主要介紹了 iOS 將系統(tǒng)自帶的button改裝成上圖片下文字的樣子,代碼是通過繼承UIButton,然后再重寫layoutSubviews方法,對(duì)自帶的圖片和titleLabel進(jìn)行重新的layout。下面通過本文給大家分享下實(shí)現(xiàn)代碼2016-12-12
在IOS系統(tǒng)上滾動(dòng)條滾動(dòng)到指定的位置出現(xiàn)空白頁面的解決方案
這篇文章主要介紹了 在IOS系統(tǒng)上滾動(dòng)條滾動(dòng)到指定的位置出現(xiàn)空白頁面的解決方案,需要的朋友可以參考下2017-01-01
iOS中UIActivityIndicatorView的用法及齒輪等待動(dòng)畫實(shí)例
UIActivityIndicatorView活動(dòng)指示器最常見的用法便是用來制作那個(gè)程序中的齒輪轉(zhuǎn)動(dòng)的等待效果,接下來我們回來簡(jiǎn)單整理iOS中UIActivityIndicatorView的用法及齒輪等待動(dòng)畫實(shí)例:2016-05-05
iOS應(yīng)用開發(fā)中導(dǎo)航欄按鈕UIBarButtonItem的添加教程
這篇文章主要介紹了iOS應(yīng)用開發(fā)中導(dǎo)航欄按鈕UIBarButtonItem的添加教程,文中詳細(xì)介紹了使用UINavigationController導(dǎo)航控制器添加的過程,需要的朋友可以參考下2016-02-02
ios實(shí)現(xiàn)簡(jiǎn)單隨便移動(dòng)的AR功能
這篇文章主要為大家詳細(xì)介紹了ios實(shí)現(xiàn)簡(jiǎn)單隨便走的AR功能,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-02-02

