使用LXLogger,我能够将日志条目写入设备和模拟器上的文件(除了xcode控制台等)。
LXLogger存储文件的默认位置在ApplicationSupportDirectory下。
LXLogger将文件写入OK,可以看到该文件在我的设备上(或使用模拟器时在我的Mac HDD上),但是当我尝试打开该文件时,我被告知该文件不存在。
我添加了根据代码生成的错误日志。
我在这里尝试了十几种不同的方法并提出了多个问题,都无济于事。
let directory = NSFileManager.defaultManager().URLsForDirectory(.ApplicationSupportDirectory, inDomains: .UserDomainMask).first!.URLByAppendingPathComponent(NSBundle.mainBundle().bundleIdentifier!, isDirectory: true).URLByAppendingPathComponent("logs", isDirectory: true)
do {
let array = try NSFileManager.defaultManager().contentsOfDirectoryAtURL(directory, includingPropertiesForKeys: nil, options:[])
var str = array[0].description
str = str.stringByReplacingOccurrencesOfString("file://", withString: "", options: .LiteralSearch, range: nil)
let fileURL = NSURL(fileURLWithPath:str)
log.info("fileURL contains: " + fileURL.absoluteString)
do {
log.info("Attempting to get contentsOfURL")
let data = try NSString(contentsOfFile: array[0].description,
encoding: NSASCIIStringEncoding)
logTextView.text = data as String
} catch let error as NSError {
log.error(error.description)
}
}
catch let error as NSError {
log.error(error.description)
}
上面代码的日志输出:
> 2016-03-31 21:43:52.121 [INFO] fileURL contains: file:///private/var/mobile/Containers/Data/Application/2F812C06-E204-4543-905C-F884C35DA198/Library/Application%2520Support/myname.myapp/logs/1_log.txt
> 2016-03-31 21:43:52.122 [INFO] Attempting to get contentsOfURL
> 2016-03-31 21:43:52.123 [ERROR] Error Domain=NSCocoaErrorDomain Code=260 "The file “1_log.txt” couldn’t be opened because there is no such file." UserInfo={NSFilePath=file:///private/var/mobile/Containers/Data/Application/2F812C06-E204-4543-905C-F884C35DA198/Library/Application%20Support/myname.myapp/logs/1_log.txt, NSUnderlyingError=0x1376e0e00 {Error Domain=NSPOSIXErrorDomain Code=2 "No such file or directory"}}
所以代码显示文件在那里(我可以在Mac上物理打开副本),但是应用程序找不到它。
大概与我使用文件handle / nsurl /之类的东西有关吗?
最佳答案
您从array
获取NSURL并使用stringByReplacingOccurrencesOfString
和fileURLWithPath
然后使用description
的方法是错误的;它无法正确处理网址中的百分比编码,并且通常比较复杂/脆弱。
这可以简单得多,因为您已经在contentsOfDirectoryAtURL
数组中返回了文件URL。您可以直接使用它:
let data = try String(contentsOfURL: array[0], encoding: NSUTF8StringEncoding)