IOS沙盒存储 - niancan/doc GitHub Wiki

介绍

iOS中的沙盒机制是一种安全体系。为了保证系统安全,iOS每个应用程序在安装时,会创建属于自己的沙盒文件(存储空间)。应用程序只能访问自身的沙盒文件,不能访问其他应用程序的沙盒文件,当应用程序需要向外部请求或接收数据时,都需要经过权限认证,否则,无法获取到数据。所有的非代码文件都要保存在此,例如属性文件plist、文本文件、图像、图标、媒体资源等,其原理是通过重定向技术,把程序生成和修改的文件定向到自身文件夹中。

沙盒的目录结构

每个APP的沙盒下面都有相似目录结构,如下图:

  • 项目.plist
  • Documents
  • Library
  • SystemData
  • tmp

沙盒API

  • 沙盒根路径
let home=NSHomeDirectory()
  • document文档目录
let home=NSHomeDirectory()//获取沙盒根路径
//document文档目录--方法一
let documentPath = NSSearchPathForDirectoriesInDomains(FileManager.SearchPathDirectory.documentDirectory,
                                                      FileManager.SearchPathDomainMask.userDomainMask,true).last
        
//获取文档目录路径--方法二,沙盒根路径字符串拼接路径
let docPath = home+"/Documents/"
       
// 第三种获取路径方式
let fileManager = FileManager.default
let urls = fileManager.urls(for: FileManager.SearchPathDirectory.documentDirectory, 
                            in: FileManager.SearchPathDomainMask.userDomainMask) as [NSURL]
if urls.count > 0{
    print("--------\(urls[0])")
    print("--------\(urls)")
}
        
// 第四种获取路径方式
do{
    let url = try fileManager.url(for: FileManager.SearchPathDirectory.documentDirectory,
                                  in: FileManager.SearchPathDomainMask.userDomainMask, appropriateFor: nil,
                                  create: false)
    print("--------\(url)")
}catch{
}

  • 缓存目录路径cache
let cachePath = NSSearchPathForDirectoriesInDomains(FileManager.SearchPathDirectory.cachesDirectory, 
                                                    FileManager.SearchPathDomainMask.userDomainMask, true).last! as String
  • library目录路径:包含cache和Preference
let libtraryPath = NSSearchPathForDirectoriesInDomains(FileManager.SearchPathDirectory.libraryDirectory,
                                                       FileManager.SearchPathDomainMask.userDomainMask, true)[0] as String
  • 临时目录路径temp
let tempPath = NSTemporaryDirectory() as String

数据存储到偏好设置 Library/Preferencd

//偏好设置存储
let def=UserDefaults.standard
def.set("aa", forKey: "a")
def.synchronize()
//获取值
let str = def.string(forKey: "a")

把数组存入到沙盒.plist文件中

// 1、获得沙盒的根路径
let home=NSHomeDirectory()//获取沙盒根路径
//获取文档目录路径--方法二,沙盒根路径字符串拼接路径
let docPath = home+"/Documents/"
// 3、获取文本文件路径
let filePath = docPath + "data.plist"
let ar=["aa","ba","ca"] as NSArray//必须要转换成NSArray,否则不成功报错
// 4、将数据写入文件中
ar.write(toFile: filePath,atomically : true)

沙盒中读取某个.plist文件

// 1、获得沙盒的根路径
let home=NSHomeDirectory()//获取沙盒根路径
//获取文档目录路径--方法二,沙盒根路径字符串拼接路径
let docPath = home+"/Documents/"
// 3、获取文本文件路径
let filePath = docPath + "data.plist"
let ar=NSArray.init(contentsOfFile: filePath)
print(ar)