问题:在使用.plist文件的时候,发现在模拟器里可以自如的写入,读取,更新.plist文件,但是真机调试的时候,无法写入和更新.
最后找到原因: 在真机调试中位于资源文件中的Plist文件只能进行读取不能进行写操作,如果需要对Plist文件进行读写操作,必须写代码在沙盒目录中生成相应的Plist文件.
swift3.0版本取沙盒的.plist文件操作方式如下:
let fileManager = FileManager.default
//取沙盒里plist文件
let documentDirectory: NSArray = NSSearchPathForDirectoriesInDomains(.documentDirectory, .userDomainMask, true) as NSArray
let writableDBPath = (documentDirectory[0] as AnyObject).appendingPathComponent("appData.plist") as String
//判断沙盒的appData.plist文件是否存在,不存在则从资源目录复制一份
let dbexits = fileManager.fileExists(atPath: writableDBPath)
if (dbexits != true) {
//资源里的appData.plist文件
let dbFile = Bundle.main.path(forResource: "appData", ofType: "plist")!
do {
//复制
let success = try fileManager.copyItem(atPath: dbFile, toPath: writableDBPath)
}
catch{
print("异常")
}
}
//清空文件内容
let arrayDelete = NSMutableArray(contentsOfFile: writableDBPath)
for item in arrayDelete! {
let dictDelete = item as! NSDictionary
arrayDelete?.remove(dictDelete)
arrayDelete?.write(toFile: writableDBPath, atomically: true)
}
//添加文件内容
let itemArray = NSMutableArray(contentsOfFile: writableDBPath)
let name2 = "测试2"
let url2 = "url2"
let dict = NSDictionary(objects: [name2, url2], forKeys: ["app_name" as NSCopying, "app_url" as NSCopying])
itemArray?.add(dict)
itemArray?.write(toFile: writableDBPath, atomically: true)
在退出程序时删除plist文件:
func applicationWillTerminate(_ application: UIApplication) {
let fileManager = FileManager.default
//取沙盒里plist文件
let documentDirectory: NSArray = NSSearchPathForDirectoriesInDomains(.documentDirectory, .userDomainMask, true) as NSArray
let writableDBPath = (documentDirectory[0] as AnyObject).appendingPathComponent("appData.plist") as String
//删除旧数据
do{
try fileManager.removeItem(atPath: writableDBPath)
}
catch {
}
}